Advertisement
max2201111

bezchybne bBkK OK very good

Jul 7th, 2024
172
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 10.95 KB | Science | 0 0
  1. import chess
  2. import time
  3. from functools import lru_cache
  4. import traceback
  5. from typing import Iterator
  6. from chess import Move, BB_ALL, Bitboard, scan_reversed
  7.  
  8. # Definice nových figur
  9. AMAZON = 7
  10.  
  11. class CustomBoard(chess.Board):
  12.     def __init__(self, fen=None):
  13.         self.amazons = chess.BB_EMPTY
  14.         self.custom_bishops_white = chess.BB_EMPTY
  15.         self.custom_bishops_black = chess.BB_EMPTY
  16.         super().__init__(None)  # Inicializujeme prázdnou šachovnici
  17.         if fen:
  18.             self.set_custom_fen(fen)
  19.         print("Šachovnice inicializována")
  20.         self.debug_amazons()
  21.         self.debug_custom_bishops()
  22.  
  23.     def set_custom_fen(self, fen):
  24.         parts = fen.split()
  25.         board_part = parts[0]
  26.        
  27.         self.clear()
  28.         self.amazons = chess.BB_EMPTY
  29.         self.custom_bishops_white = chess.BB_EMPTY
  30.         self.custom_bishops_black = chess.BB_EMPTY
  31.        
  32.         square = 56  # Začínáme od horního řádku (a8)
  33.         for c in board_part:
  34.             if c == '/':
  35.                 square -= 16  # Přesun na další řádek
  36.             elif c.isdigit():
  37.                 square += int(c)
  38.             else:
  39.                 color = chess.WHITE if c.isupper() else chess.BLACK
  40.                 if c.upper() == 'A':
  41.                     self.amazons |= chess.BB_SQUARES[square]
  42.                     piece = chess.Piece(AMAZON, color)
  43.                 elif c.upper() == 'B':
  44.                     if color == chess.WHITE:
  45.                         self.custom_bishops_white |= chess.BB_SQUARES[square]
  46.                     else:
  47.                         self.custom_bishops_black |= chess.BB_SQUARES[square]
  48.                     piece = chess.Piece(chess.BISHOP, color)
  49.                 else:
  50.                     piece = chess.Piece.from_symbol(c)
  51.                 self._set_piece_at(square, piece.piece_type, piece.color)
  52.                 square += 1
  53.  
  54.         # Nastavení zbývajících částí FEN
  55.         self.turn = chess.WHITE if parts[1] == 'w' else chess.BLACK
  56.         self.castling_rights = chess.BB_EMPTY
  57.         if '-' not in parts[2]:
  58.             if 'K' in parts[2]: self.castling_rights |= chess.BB_H1
  59.             if 'Q' in parts[2]: self.castling_rights |= chess.BB_A1
  60.             if 'k' in parts[2]: self.castling_rights |= chess.BB_H8
  61.             if 'q' in parts[2]: self.castling_rights |= chess.BB_A8
  62.         self.ep_square = chess.parse_square(parts[3]) if parts[3] != '-' else None
  63.         self.halfmove_clock = int(parts[4])
  64.         self.fullmove_number = int(parts[5])
  65.  
  66.         print(f"Po nastavení FEN, bitboard amazonek: {self.amazons:064b}")
  67.         print(f"Po nastavení FEN, bitboard bílých vlastních střelců: {self.custom_bishops_white:064b}")
  68.         print(f"Po nastavení FEN, bitboard černých vlastních střelců: {self.custom_bishops_black:064b}")
  69.  
  70.     def _set_piece_at(self, square, piece_type, color):
  71.         super()._set_piece_at(square, piece_type, color)
  72.         if piece_type is not None:
  73.             if piece_type == AMAZON:
  74.                 self.amazons |= chess.BB_SQUARES[square]
  75.             elif piece_type == chess.BISHOP:
  76.                 if color == chess.WHITE:
  77.                     self.custom_bishops_white |= chess.BB_SQUARES[square]
  78.                 else:
  79.                     self.custom_bishops_black |= chess.BB_SQUARES[square]
  80.         else:
  81.             self.amazons &= ~chess.BB_SQUARES[square]
  82.             self.custom_bishops_white &= ~chess.BB_SQUARES[square]
  83.             self.custom_bishops_black &= ~chess.BB_SQUARES[square]
  84.  
  85.     def set_piece_at(self, square, piece, promoted=False):
  86.         if piece is None:
  87.             self._set_piece_at(square, None, None)
  88.         else:
  89.             self._set_piece_at(square, piece.piece_type, piece.color)
  90.  
  91.     def piece_type_at(self, square):
  92.         if self.amazons & chess.BB_SQUARES[square]:
  93.             return AMAZON
  94.         return super().piece_type_at(square)
  95.  
  96.     def generate_pseudo_legal_moves(self, from_mask: Bitboard = BB_ALL, to_mask: Bitboard = BB_ALL) -> Iterator[Move]:
  97.         print("Generování pseudo-legálních tahů...")
  98.        
  99.         # Generování standardních tahů
  100.         print("Generování standardních tahů...")
  101.         for move in super().generate_pseudo_legal_moves(from_mask, to_mask):
  102.             if self.piece_type_at(move.from_square) != AMAZON:
  103.                 print(f"Standardní pseudo-legální tah: {move}")
  104.                 yield move
  105.  
  106.         # Generování tahů vlastních střelců
  107.         print("Generování tahů vlastních střelců...")
  108.         our_bishops = self.custom_bishops_white if self.turn == chess.WHITE else self.custom_bishops_black
  109.         our_bishops &= from_mask
  110.         print(f"Naši střelci: {our_bishops:064b}")
  111.         for from_square in chess.scan_forward(our_bishops):
  112.             print(f"Generování tahů pro střelce na {chess.SQUARE_NAMES[from_square]}")
  113.             attacks = self.bishop_attacks(from_square)
  114.             print(f"Útoky střelce: {attacks:064b}")
  115.             valid_moves = attacks & ~self.occupied & to_mask
  116.             print(f"Platné cílové pole: {valid_moves:064b}")
  117.             for to_square in chess.scan_forward(valid_moves):
  118.                 move = Move(from_square, to_square)
  119.                 print(f"Pseudo-legální tah vlastního střelce: {move}")
  120.                 yield move
  121.  
  122.         # Generování tahů amazonek
  123.         print("Generování tahů amazonek...")
  124.         our_amazons = self.amazons & self.occupied_co[self.turn] & from_mask
  125.         print(f"Naše amazonky: {our_amazons:064b}")
  126.         for from_square in chess.scan_forward(our_amazons):
  127.             print(f"Generování tahů pro amazonku na {chess.SQUARE_NAMES[from_square]}")
  128.             attacks = self.amazon_attacks(from_square)
  129.             print(f"Útoky amazonky: {attacks:064b}")
  130.             valid_moves = attacks & ~self.occupied & to_mask
  131.             print(f"Platné cílové pole: {valid_moves:064b}")
  132.             for to_square in chess.scan_forward(valid_moves):
  133.                 move = Move(from_square, to_square)
  134.                 print(f"Pseudo-legální tah amazonky: {move}")
  135.                 yield move
  136.  
  137.         print("Dokončeno generování pseudo-legálních tahů")
  138.  
  139.     def amazon_attacks(self, square):
  140.         return self.queen_attacks(square) | self.knight_attacks(square)
  141.  
  142.     def queen_attacks(self, square):
  143.         return self.bishop_attacks(square) | self.rook_attacks(square)
  144.  
  145.     def bishop_attacks(self, square):
  146.         return chess.BB_DIAG_ATTACKS[square][self.occupied & chess.BB_DIAG_MASKS[square]]
  147.  
  148.     def rook_attacks(self, square):
  149.         return (chess.BB_RANK_ATTACKS[square][self.occupied & chess.BB_RANK_MASKS[square]] |
  150.                 chess.BB_FILE_ATTACKS[square][self.occupied & chess.BB_FILE_MASKS[square]])
  151.  
  152.     def knight_attacks(self, square):
  153.         return chess.BB_KNIGHT_ATTACKS[square]
  154.  
  155.     def is_pseudo_legal(self, move):
  156.         piece = self.piece_at(move.from_square)
  157.         if not piece or piece.color != self.turn:
  158.             return False
  159.        
  160.         if self.is_castling(move):
  161.             return True
  162.  
  163.         if piece.piece_type == AMAZON:
  164.             return bool(self.amazon_attacks(move.from_square) & chess.BB_SQUARES[move.to_square])
  165.         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]):
  166.             return bool(self.bishop_attacks(move.from_square) & chess.BB_SQUARES[move.to_square])
  167.         else:
  168.             return super().is_pseudo_legal(move)
  169.  
  170.     def is_legal(self, move):
  171.         print(f"Kontrola legality tahu: {move}")
  172.         if not self.is_pseudo_legal(move):
  173.             print(f"Tah {move} není pseudo-legální")
  174.             return False
  175.         if self.is_into_check(move):
  176.             print(f"Tah {move} staví vlastního krále do šachu")
  177.             return False
  178.         print(f"Tah {move} je legální")
  179.         return True
  180.  
  181.     def piece_symbol(self, piece):
  182.         if piece is None:
  183.             return '.'
  184.         if piece.piece_type == AMAZON:
  185.             return 'A'
  186.         return piece.symbol()
  187.  
  188.     def debug_amazons(self):
  189.         print(f"Bitboard amazonek: {format(self.amazons, '064b')}")
  190.         for square in chess.SQUARES:
  191.             if self.amazons & chess.BB_SQUARES[square]:
  192.                 print(f"Amazonka na {chess.SQUARE_NAMES[square]}")
  193.  
  194.     def debug_custom_bishops(self):
  195.         print(f"Bitboard bílých vlastních střelců: {format(self.custom_bishops_white, '064b')}")
  196.         print(f"Bitboard černých vlastních střelců: {format(self.custom_bishops_black, '064b')}")
  197.         for square in chess.SQUARES:
  198.             if self.custom_bishops_white & chess.BB_SQUARES[square]:
  199.                 print(f"Bílý vlastní střelec na {chess.SQUARE_NAMES[square]}")
  200.             if self.custom_bishops_black & chess.BB_SQUARES[square]:
  201.                 print(f"Černý vlastní střelec na {chess.SQUARE_NAMES[square]}")
  202.  
  203.     @property
  204.     def legal_moves(self):
  205.         legal_moves = [move for move in self.generate_pseudo_legal_moves() if self.is_legal(move)]
  206.         for move in legal_moves:
  207.             print(f"Legální tah: {move}")
  208.         return legal_moves
  209.  
  210.     def __str__(self):
  211.         builder = []
  212.         for square in chess.SQUARES_180:
  213.             piece = self.piece_at(square)
  214.             symbol = self.piece_symbol(piece) if piece else '.'
  215.             builder.append(symbol)
  216.             if chess.square_file(square) == 7:
  217.                 if square != chess.H1:
  218.                     builder.append('\n')
  219.         return ''.join(builder)
  220.  
  221. if __name__ == "__main__":
  222.     start_fen = "1A6/3k4/8/8/1B6/8/A7/6K1 w - - 0 1"
  223.    
  224.     try:
  225.         print(f"Vytváření šachovnice s FEN: {start_fen}")
  226.         initial_board = CustomBoard(start_fen)
  227.        
  228.         print("Ladění amazonek...")
  229.         print(f"Bitboard amazonek: {initial_board.amazons:064b}")
  230.         print(f"Bitboard bílých vlastních střelců: {initial_board.custom_bishops_white:064b}")
  231.         print(f"Bitboard černých vlastních střelců: {initial_board.custom_bishops_black:064b}")
  232.        
  233.         initial_board.debug_amazons()
  234.         initial_board.debug_custom_bishops()
  235.        
  236.         print("Současná pozice:")
  237.         print(initial_board)
  238.        
  239.         print("Generování legálních tahů pro počáteční pozici...")
  240.         legal_moves = list(initial_board.legal_moves)
  241.         print(f"Počet legálních tahů: {len(legal_moves)}")
  242.        
  243.         print("Legální tahy:")
  244.         for move in legal_moves:
  245.             from_square = chess.SQUARE_NAMES[move.from_square]
  246.             to_square = chess.SQUARE_NAMES[move.to_square]
  247.             piece = initial_board.piece_at(move.from_square)
  248.             print(f"{initial_board.piece_symbol(piece)}: {from_square}-{to_square}")
  249.        
  250.     except Exception as e:
  251.         print(f"Došlo k chybě: {str(e)}")
  252.         traceback.print_exc()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement