Advertisement
max2201111

uz se zobrazuji kralove Kk! spolu s Aa

Jul 7th, 2024
361
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 10.20 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__(fen)
  17.         print("Šachovnice inicializována")
  18.         self.debug_amazons()
  19.         self.debug_custom_bishops()
  20.  
  21.     def set_chess_fen(self, fen):
  22.         super().set_chess_fen(fen)
  23.         self.custom_bishops_white = self.bishops & self.occupied_co[chess.WHITE]
  24.         self.custom_bishops_black = self.bishops & self.occupied_co[chess.BLACK]
  25.         print(f"Po nastavení FEN, bitboard amazonek: {self.amazons:064b}")
  26.         print(f"Po nastavení FEN, bitboard bílých vlastních střelců: {self.custom_bishops_white:064b}")
  27.         print(f"Po nastavení FEN, bitboard černých vlastních střelců: {self.custom_bishops_black:064b}")
  28.  
  29.     def _set_piece_at(self, square, piece, promoted=False):
  30.         super()._set_piece_at(square, piece, promoted)
  31.         if piece is not None:
  32.             piece_type = piece if isinstance(piece, int) else piece.piece_type
  33.             if piece_type == chess.BISHOP:
  34.                 color = self.color_at(square)
  35.                 if color == chess.WHITE:
  36.                     self.custom_bishops_white |= chess.BB_SQUARES[square]
  37.                 else:
  38.                     self.custom_bishops_black |= chess.BB_SQUARES[square]
  39.             elif piece_type == AMAZON:
  40.                 self.amazons |= chess.BB_SQUARES[square]
  41.         else:
  42.             self.custom_bishops_white &= ~chess.BB_SQUARES[square]
  43.             self.custom_bishops_black &= ~chess.BB_SQUARES[square]
  44.             self.amazons &= ~chess.BB_SQUARES[square]
  45.  
  46.     def set_piece_at(self, square, piece, promoted=False):
  47.         self._set_piece_at(square, piece, promoted)
  48.  
  49.     def piece_type_at(self, square):
  50.         if self.amazons & chess.BB_SQUARES[square]:
  51.             return AMAZON
  52.         return super().piece_type_at(square)
  53.  
  54.     def generate_pseudo_legal_moves(self, from_mask: Bitboard = BB_ALL, to_mask: Bitboard = BB_ALL) -> Iterator[Move]:
  55.         print("Generování pseudo-legálních tahů...")
  56.        
  57.         # Generování standardních tahů
  58.         print("Generování standardních tahů...")
  59.         for move in super().generate_pseudo_legal_moves(from_mask, to_mask):
  60.             if self.piece_type_at(move.from_square) != AMAZON:
  61.                 print(f"Standardní pseudo-legální tah: {move}")
  62.                 yield move
  63.  
  64.         # Generování tahů vlastních střelců
  65.         print("Generování tahů vlastních střelců...")
  66.         our_bishops = self.custom_bishops_white if self.turn == chess.WHITE else self.custom_bishops_black
  67.         our_bishops &= from_mask
  68.         print(f"Naši střelci: {our_bishops:064b}")
  69.         for from_square in chess.scan_forward(our_bishops):
  70.             print(f"Generování tahů pro střelce na {chess.SQUARE_NAMES[from_square]}")
  71.             attacks = self.bishop_attacks(from_square)
  72.             print(f"Útoky střelce: {attacks:064b}")
  73.             valid_moves = attacks & ~self.occupied & to_mask
  74.             print(f"Platné cílové pole: {valid_moves:064b}")
  75.             for to_square in chess.scan_forward(valid_moves):
  76.                 move = Move(from_square, to_square)
  77.                 print(f"Pseudo-legální tah vlastního střelce: {move}")
  78.                 yield move
  79.  
  80.         # Generování tahů amazonek
  81.         print("Generování tahů amazonek...")
  82.         our_amazons = self.amazons & self.occupied_co[self.turn] & from_mask
  83.         print(f"Naše amazonky: {our_amazons:064b}")
  84.         for from_square in chess.scan_forward(our_amazons):
  85.             print(f"Generování tahů pro amazonku na {chess.SQUARE_NAMES[from_square]}")
  86.             attacks = self.amazon_attacks(from_square)
  87.             print(f"Útoky amazonky: {attacks:064b}")
  88.             valid_moves = attacks & ~self.occupied & to_mask
  89.             print(f"Platné cílové pole: {valid_moves:064b}")
  90.             for to_square in chess.scan_forward(valid_moves):
  91.                 move = Move(from_square, to_square)
  92.                 print(f"Pseudo-legální tah amazonky: {move}")
  93.                 yield move
  94.  
  95.         print("Dokončeno generování pseudo-legálních tahů")
  96.  
  97.     def amazon_attacks(self, square):
  98.         return (self.attacks_mask(chess.QUEEN, square, self.occupied) |
  99.                 self.attacks_mask(chess.KNIGHT, square, self.occupied))
  100.    
  101.     def attacks_mask(self, piece_type, square=None, occupied=None, mask=BB_ALL):
  102.         if square is None or occupied is None:
  103.             return 0
  104.        
  105.         if piece_type == chess.QUEEN:
  106.             return (chess.BB_DIAG_ATTACKS[square][occupied & chess.BB_DIAG_MASKS[square]] |
  107.                     chess.BB_RANK_ATTACKS[square][occupied] |
  108.                     chess.BB_FILE_ATTACKS[square][occupied]) & mask
  109.         elif piece_type == chess.KNIGHT:
  110.             return chess.BB_KNIGHT_ATTACKS[square] & mask
  111.         elif piece_type == chess.BISHOP:
  112.             return chess.BB_DIAG_ATTACKS[square][occupied & chess.BB_DIAG_MASKS[square]] & mask
  113.         return 0
  114.  
  115.     def bishop_attacks(self, square):
  116.         attacks = self.attacks_mask(chess.BISHOP, square, self.occupied)
  117.         print(f"Bishop attacks from {chess.SQUARE_NAMES[square]}: {attacks:064b}")
  118.         return attacks
  119.  
  120.     def is_pseudo_legal(self, move):
  121.         # Kontrola, zda je tah v rámci šachovnice
  122.         if not (chess.A1 <= move.from_square < chess.H8 and chess.A1 <= move.to_square < chess.H8):
  123.             return False
  124.  
  125.         # Kontrola, zda je na výchozím poli figura
  126.         piece = self.piece_at(move.from_square)
  127.         if not piece:
  128.             return False
  129.  
  130.         # Kontrola, zda figura patří hráči na tahu
  131.         if piece.color != self.turn:
  132.             return False
  133.  
  134.         # Kontrola, zda cílové pole není obsazeno vlastní figurou
  135.         if self.color_at(move.to_square) == self.turn:
  136.             return False
  137.  
  138.         # Speciální kontrola pro vlastní střelce
  139.         if 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]):
  140.             return bool(self.bishop_attacks(move.from_square) & chess.BB_SQUARES[move.to_square])
  141.  
  142.         # Speciální kontrola pro amazonky
  143.         if piece.piece_type == AMAZON:
  144.             return bool(self.amazon_attacks(move.from_square) & chess.BB_SQUARES[move.to_square])
  145.  
  146.         # Kontrola pro ostatní figury
  147.         return move in super().generate_pseudo_legal_moves()
  148.  
  149.     def is_legal(self, move):
  150.         print(f"Kontrola legality tahu: {move}")
  151.         if not self.is_pseudo_legal(move):
  152.             print(f"Tah {move} není pseudo-legální")
  153.             return False
  154.         if self.is_into_check(move):
  155.             print(f"Tah {move} staví vlastního krále do šachu")
  156.             return False
  157.         print(f"Tah {move} je legální")
  158.         return True
  159.  
  160.     def piece_symbol(self, piece):
  161.         if piece is None:
  162.             return '.'
  163.         if piece.piece_type == AMAZON:
  164.             return 'A' if piece.color == chess.WHITE else 'a'
  165.         return piece.symbol()
  166.  
  167.     def debug_amazons(self):
  168.         print(f"Bitboard amazonek: {format(self.amazons, '064b')}")
  169.         for square in chess.SQUARES:
  170.             if self.amazons & chess.BB_SQUARES[square]:
  171.                 print(f"Amazonka na {chess.SQUARE_NAMES[square]}")
  172.  
  173.     def debug_custom_bishops(self):
  174.         print(f"Bitboard bílých vlastních střelců: {format(self.custom_bishops_white, '064b')}")
  175.         print(f"Bitboard černých vlastních střelců: {format(self.custom_bishops_black, '064b')}")
  176.         for square in chess.SQUARES:
  177.             if self.custom_bishops_white & chess.BB_SQUARES[square]:
  178.                 print(f"Bílý vlastní střelec na {chess.SQUARE_NAMES[square]}")
  179.             if self.custom_bishops_black & chess.BB_SQUARES[square]:
  180.                 print(f"Černý vlastní střelec na {chess.SQUARE_NAMES[square]}")
  181.  
  182.     @property
  183.     def legal_moves(self):
  184.         legal_moves = [move for move in self.generate_pseudo_legal_moves() if self.is_legal(move)]
  185.         for move in legal_moves:
  186.             print(f"Legální tah: {move}")
  187.         return legal_moves
  188.  
  189.     def __str__(self):
  190.         builder = []
  191.         for square in chess.SQUARES_180:
  192.             piece = self.piece_at(square)
  193.             symbol = self.piece_symbol(piece) if piece else '.'
  194.             builder.append(symbol)
  195.             if chess.square_file(square) == 7:
  196.                 if square != chess.H1:
  197.                     builder.append('\n')
  198.         return ''.join(builder)
  199.  
  200. if __name__ == "__main__":
  201.     start_fen = "1A6/3k4/8/8/1B6/8/A7/6K1 w - - 0 1"
  202.    
  203.     try:
  204.         print(f"Vytváření šachovnice s FEN: {start_fen}")
  205.         initial_board = CustomBoard(start_fen)
  206.        
  207.         print("Ladění amazonek...")
  208.         print(f"Bitboard amazonek: {initial_board.amazons:064b}")
  209.         print(f"Bitboard bílých vlastních střelců: {initial_board.custom_bishops_white:064b}")
  210.         print(f"Bitboard černých vlastních střelců: {initial_board.custom_bishops_black:064b}")
  211.        
  212.         initial_board.debug_amazons()
  213.         initial_board.debug_custom_bishops()
  214.        
  215.         print("Současná pozice:")
  216.         print(initial_board)
  217.        
  218.         print("Generování legálních tahů pro počáteční pozici...")
  219.         legal_moves = list(initial_board.legal_moves)
  220.         print(f"Počet legálních tahů: {len(legal_moves)}")
  221.        
  222.         print("Legální tahy:")
  223.         for move in legal_moves:
  224.             from_square = chess.SQUARE_NAMES[move.from_square]
  225.             to_square = chess.SQUARE_NAMES[move.to_square]
  226.             piece = initial_board.piece_at(move.from_square)
  227.             print(f"{initial_board.piece_symbol(piece)}: {from_square}-{to_square}")
  228.        
  229.     except Exception as e:
  230.         print(f"Došlo k chybě: {str(e)}")
  231.         traceback.print_exc()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement