import chess from typing import Iterator from chess import Move, BB_ALL, Bitboard, scan_reversed # Definice nových figur AMAZON = 7 class CustomBoard(chess.Board): def __init__(self, fen=None): self.amazons_white = chess.BB_EMPTY self.amazons_black = chess.BB_EMPTY self.custom_bishops_white = chess.BB_EMPTY self.custom_bishops_black = chess.BB_EMPTY super().__init__(None) if fen: self.set_custom_fen(fen) print("Šachovnice inicializována") self.debug_amazons() self.debug_custom_bishops() def set_custom_fen(self, fen): parts = fen.split() board_part = parts[0] self.clear() self.amazons_white = chess.BB_EMPTY self.amazons_black = chess.BB_EMPTY self.custom_bishops_white = chess.BB_EMPTY self.custom_bishops_black = chess.BB_EMPTY square = 56 for c in board_part: if c == '/': square -= 16 elif c.isdigit(): square += int(c) else: color = chess.WHITE if c.isupper() else chess.BLACK if c.upper() == 'A': if color == chess.WHITE: self.amazons_white |= chess.BB_SQUARES[square] else: self.amazons_black |= chess.BB_SQUARES[square] piece = chess.Piece(AMAZON, color) elif c.upper() == 'B': if color == chess.WHITE: self.custom_bishops_white |= chess.BB_SQUARES[square] else: self.custom_bishops_black |= chess.BB_SQUARES[square] piece = chess.Piece(chess.BISHOP, color) else: piece = chess.Piece.from_symbol(c) self._set_piece_at(square, piece.piece_type, piece.color) square += 1 self.turn = chess.WHITE if parts[1] == 'w' else chess.BLACK self.castling_rights = chess.BB_EMPTY if '-' not in parts[2]: if 'K' in parts[2]: self.castling_rights |= chess.BB_H1 if 'Q' in parts[2]: self.castling_rights |= chess.BB_A1 if 'k' in parts[2]: self.castling_rights |= chess.BB_H8 if 'q' in parts[2]: self.castling_rights |= chess.BB_A8 self.ep_square = chess.parse_square(parts[3]) if parts[3] != '-' else None self.halfmove_clock = int(parts[4]) self.fullmove_number = int(parts[5]) print(f"Po nastavení FEN, bitboard bílých amazonek: {self.amazons_white:064b}") print(f"Po nastavení FEN, bitboard černých amazonek: {self.amazons_black:064b}") print(f"Po nastavení FEN, bitboard bílých vlastních střelců: {self.custom_bishops_white:064b}") print(f"Po nastavení FEN, bitboard černých vlastních střelců: {self.custom_bishops_black:064b}") def _set_piece_at(self, square, piece_type, color): super()._set_piece_at(square, piece_type, color) if piece_type is not None: if piece_type == AMAZON: if color == chess.WHITE: self.amazons_white |= chess.BB_SQUARES[square] else: self.amazons_black |= chess.BB_SQUARES[square] print(f"Nastavena {'bílá' if color == chess.WHITE else 'černá'} amazonka na {chess.SQUARE_NAMES[square]}") elif piece_type == chess.BISHOP: if color == chess.WHITE: self.custom_bishops_white |= chess.BB_SQUARES[square] else: self.custom_bishops_black |= chess.BB_SQUARES[square] else: self.amazons_white &= ~chess.BB_SQUARES[square] self.amazons_black &= ~chess.BB_SQUARES[square] self.custom_bishops_white &= ~chess.BB_SQUARES[square] self.custom_bishops_black &= ~chess.BB_SQUARES[square] def generate_pseudo_legal_moves(self, from_mask: Bitboard = BB_ALL, to_mask: Bitboard = BB_ALL) -> Iterator[Move]: print("Generování pseudo-legálních tahů...") # Generování standardních tahů for move in super().generate_pseudo_legal_moves(from_mask, to_mask): if self.piece_type_at(move.from_square) not in [AMAZON, chess.BISHOP]: print(f"Standardní pseudo-legální tah: {move}") yield move # Generování tahů vlastních střelců our_bishops = self.custom_bishops_white if self.turn == chess.WHITE else self.custom_bishops_black our_bishops &= from_mask print(f"Naši střelci: {our_bishops:064b}") for from_square in chess.scan_forward(our_bishops): print(f"Generování tahů pro střelce na {chess.SQUARE_NAMES[from_square]}") attacks = self.bishop_attacks(from_square) print(f"Útoky střelce: {attacks:064b}") valid_moves = attacks & ~self.occupied & to_mask print(f"Platné cílové pole pro střelce: {valid_moves:064b}") for to_square in chess.scan_forward(valid_moves): move = Move(from_square, to_square) print(f"Pseudo-legální tah vlastního střelce: {move}") yield move # Generování tahů amazonek our_amazons = self.amazons_white if self.turn == chess.WHITE else self.amazons_black our_amazons &= from_mask print(f"Naše amazonky: {our_amazons:064b}") for from_square in chess.scan_forward(our_amazons): print(f"Generování tahů pro amazonku na {chess.SQUARE_NAMES[from_square]}") attacks = self.amazon_attacks(from_square) print(f"Útoky amazonky: {attacks:064b}") valid_moves = attacks & ~self.occupied & to_mask print(f"Platné cílové pole pro amazonku: {valid_moves:064b}") for to_square in chess.scan_forward(valid_moves): move = Move(from_square, to_square) print(f"Pseudo-legální tah amazonky: {move}") yield move def amazon_attacks(self, square): return self.queen_attacks(square) | self.knight_attacks(square) def queen_attacks(self, square): return self.bishop_attacks(square) | self.rook_attacks(square) def bishop_attacks(self, square): return chess.BB_DIAG_ATTACKS[square][self.occupied & chess.BB_DIAG_MASKS[square]] def rook_attacks(self, square): return (chess.BB_RANK_ATTACKS[square][self.occupied & chess.BB_RANK_MASKS[square]] | chess.BB_FILE_ATTACKS[square][self.occupied & chess.BB_FILE_MASKS[square]]) def knight_attacks(self, square): return chess.BB_KNIGHT_ATTACKS[square] def is_pseudo_legal(self, move): piece = self.piece_at(move.from_square) if not piece or piece.color != self.turn: return False if self.is_castling(move): return True if piece.piece_type == AMAZON: return bool(self.amazon_attacks(move.from_square) & chess.BB_SQUARES[move.to_square]) elif piece.piece_type == chess.BISHOP and ((self.custom_bishops_white & chess.BB_SQUARES[move.from_square]) or (self.custom_bishops_black & chess.BB_SQUARES[move.from_square])): return bool(self.bishop_attacks(move.from_square) & chess.BB_SQUARES[move.to_square]) else: return super().is_pseudo_legal(move) def is_legal(self, move): print(f"Kontrola legality tahu: {move}") if not self.is_pseudo_legal(move): print(f"Tah {move} není pseudo-legální") return False if self.is_into_check(move): print(f"Tah {move} staví vlastního krále do šachu") return False print(f"Tah {move} je legální") return True def piece_symbol(self, piece): if piece is None: return '.' if piece.piece_type == AMAZON: return 'A' if piece.color == chess.WHITE else 'a' return piece.symbol() def piece_type_at(self, square): if (self.amazons_white | self.amazons_black) & chess.BB_SQUARES[square]: return AMAZON return super().piece_type_at(square) def debug_amazons(self): print(f"Bitboard bílých amazonek: {format(self.amazons_white, '064b')}") print(f"Bitboard černých amazonek: {format(self.amazons_black, '064b')}") for square in chess.SQUARES: if self.amazons_white & chess.BB_SQUARES[square]: print(f"Bílá amazonka na {chess.SQUARE_NAMES[square]}") if self.amazons_black & chess.BB_SQUARES[square]: print(f"Černá amazonka na {chess.SQUARE_NAMES[square]}") def debug_custom_bishops(self): print(f"Bitboard bílých vlastních střelců: {format(self.custom_bishops_white, '064b')}") print(f"Bitboard černých vlastních střelců: {format(self.custom_bishops_black, '064b')}") for square in chess.SQUARES: if self.custom_bishops_white & chess.BB_SQUARES[square]: print(f"Bílý vlastní střelec na {chess.SQUARE_NAMES[square]}") if self.custom_bishops_black & chess.BB_SQUARES[square]: print(f"Černý vlastní střelec na {chess.SQUARE_NAMES[square]}") @property def legal_moves(self): legal_moves = [move for move in self.generate_pseudo_legal_moves() if self.is_legal(move)] for move in legal_moves: print(f"Legální tah: {move}") return legal_moves def __str__(self): builder = [] for square in chess.SQUARES_180: piece = self.piece_at(square) symbol = self.piece_symbol(piece) if piece else '.' builder.append(symbol) if chess.square_file(square) == 7: if square != chess.H1: builder.append('\n') return ''.join(builder) if __name__ == "__main__": start_fen = "1A6/3k4/8/8/1B6/8/A7/6K1 w - - 0 1" print(f"Vytváření šachovnice s FEN: {start_fen}") board = CustomBoard(start_fen) print("Ladění amazonek...") board.debug_amazons() board.debug_custom_bishops() print("Současná pozice:") print(board) print("Generování legálních tahů pro počáteční pozici...") legal_moves = list(board.legal_moves) print(f"Počet legálních tahů: {len(legal_moves)}") print("Legální tahy:") for move in legal_moves: from_square = chess.SQUARE_NAMES[move.from_square] to_square = chess.SQUARE_NAMES[move.to_square] piece = board.piece_at(move.from_square) print(f"{board.piece_symbol(piece)}: {from_square}-{to_square}")