def random_with_first_level_search(self, board: chess.Board): moves = list(board.legal_moves) best_move = random.sample(moves, 1)[0] best_move_value = 0 for move in moves: board.push(move) if board.is_checkmate(): move_value = 100 if move_value > best_move_value: best_move = move board.pop() if board.is_into_check(move): move_value = 90 if move_value > best_move_value: best_move = move if board.is_capture(move): move_value = 80 if move_value > best_move_value: best_move = move if board.is_castling(move): move_value = 70 if move_value > best_move_value: best_move = move return best_move
def is_illegal_castle(board: chess.Board, move: chess.Move) -> bool: if not board.is_castling(move): return False # illegal without kingside rights if board.is_kingside_castling(move) and not board.has_kingside_castling_rights(board.turn): return True # illegal without queenside rights if board.is_queenside_castling(move) and not board.has_queenside_castling_rights(board.turn): return True # illegal if any pieces are between king & rook rook_square = chess.square(7 if board.is_kingside_castling(move) else 0, chess.square_rank(move.from_square)) between_squares = chess.SquareSet(chess.between(move.from_square, rook_square)) if any(map(lambda s: board.piece_at(s), between_squares)): return True # its legal return False
def is_psuedo_legal_castle(board: chess.Board, move: chess.Move): return board.is_castling(move) and not is_illegal_castle(board, move)