Я пытаюсь исправить свой код, который должен оценить и найти лучший шаг в игре в сказочные шахматы. Это вариант шахмата с дополнительными частями, такими как Amazon (Queen + Knight), Cyril (Rook + Knight) и EVE (Knight + Bishop). < /P>
У меня есть относительно упрощенная позиция образца, где заглавные буквы представляют белые кусочки, а буквы нижних регистра представляют черные кусочки. < /P>
Я пытаюсь исправить свой код, который должен оценить и найти лучший шаг в игре в сказочные шахматы. Это вариант шахмата с дополнительными частями, такими как Amazon (Queen + Knight), Cyril (Rook + Knight) и EVE (Knight + Bishop). < /P> У меня есть относительно упрощенная позиция образца, где заглавные буквы представляют белые кусочки, а буквы нижних регистра представляют черные кусочки. < /P> [code] +-----------------+ 8 | . . . . . . . . | 7 | . . . . . . . . | 6 | . . . . . . . . | 5 | . . . . . . . . | 4 | A . . . . . . . | 3 | . . . . c . k . | 2 | . . . . . . . . | 1 | . . . . . . K . | +-----------------+ a b c d e f g h < /code> В этой позиции моя программа не производит оптимальный ход 1.AA4-A1, чтобы защитить от угрожаемого чеклавого часа, а вместо этого играет на ошибку KG1-H1, после чего один шаг-ход 1 ... CE3-E1 может быть доставлен. < /P> . Чтобы оценить движения очень упрощенными способом, я строю дерево позиции с максимальной глубиной 5, где любой ход, который позволяет проверять возврат самостоятельно.import time from datetime import datetime from collections import deque import copy
def print_board(board): print(str(board))
class ChessBoard: """Vlastní implementace šachovnice pro pohádkové figury"""
if fen: self.set_fen(fen) else: self.setup_initial_position()
def __str__(self): rows = [] for i, row in enumerate(self.board[::-1], 1): safe_row = [] for piece in row: if piece is None: safe_row.append('.') elif isinstance(piece, tuple): color, symbol = piece safe_row.append(symbol.upper() if color == 'w' else symbol.lower()) else: safe_row.append(str(piece)) rows.append(f"{8 - i + 1} " + " ".join(safe_row)) rows.append(" a b c d e f g h") return "\n".join(rows)
def setup_initial_position(self): """Nastaví základní pozici""" pieces = ['R', 'N', 'B', 'Q', 'K', 'B', 'N', 'R'] for i, piece in enumerate(pieces): self.board[0][i] = ('w', piece) for i in range(8): self.board[1][i] = ('w', 'P')
pieces = ['R', 'N', 'B', 'Q', 'K', 'B', 'N', 'R'] for i, piece in enumerate(pieces): self.board[7][i] = ('b', piece) for i in range(8): self.board[6][i] = ('b', 'P')
def set_fen(self, fen_string): """Nastaví pozici z FEN stringu""" parts = fen_string.split()
# Pozice figur rows = parts[0].split('/') for rank, row in enumerate(rows): file_idx = 0 for char in row: if char.isdigit(): for _ in range(int(char)): self.board[7-rank][file_idx] = None file_idx += 1 else: color = 'w' if char.isupper() else 'b' self.board[7-rank][file_idx] = (color, char.upper()) file_idx += 1
# Na tahu self.turn = parts[1] == 'w'
# Rošáda castling = parts[2] if len(parts) > 2 else '-' self.castling_rights = { 'K': 'K' in castling, 'Q': 'Q' in castling, 'k': 'k' in castling, 'q': 'q' in castling }
# En passant self.en_passant = parts[3] if len(parts) > 3 and parts[3] != '-' else None
def find_king(self, color): """Najde krále dané barvy""" for rank in range(8): for file in range(8): piece = self.board[rank][file] if piece and piece[0] == color and piece[1] == 'K': return (rank, file) return None
def is_check(self, color): """Kontroluje zda je král v šachu""" king_pos = self.find_king(color) if not king_pos: return False
enemy_color = 'b' if color == 'w' else 'w'
for rank in range(8): for file in range(8): piece = self.board[rank][file] if piece and piece[0] == enemy_color: if self.attacks_square((rank, file), king_pos): return True return False
def attacks_square(self, from_pos, to_pos): """Kontroluje zda figura útočí na dané pole""" rank, file = from_pos piece = self.board[rank][file]
if from_rank != to_rank and from_file != to_file: return False
if from_rank == to_rank: # Horizontální start = min(from_file, to_file) + 1 end = max(from_file, to_file) for f in range(start, end): if self.board[from_rank][f] is not None: return False else: # Vertikální start = min(from_rank, to_rank) + 1 end = max(from_rank, to_rank) for r in range(start, end): if self.board[r][from_file] is not None: return False
step_r = 1 if dr > 0 else -1 step_f = 1 if df > 0 else -1
steps = abs(dr) for i in range(1, steps): check_rank = from_rank + i * step_r check_file = from_file + i * step_f if self.board[check_rank][check_file] is not None: return False
return True
def queen_attacks(self, from_pos, to_pos): """Kontroluje útok dámy""" return self.rook_attacks(from_pos, to_pos) or self.bishop_attacks(from_pos, to_pos)
Исправление кода с импортным шахматным модулем для сказок в Python требуется: он не производит оптимальный ход AA4A1, но не оптимальный KG8H8, после которого может быть доставлен один ход CEAMATE CE3E1. Код приведен здесь. Здесь подставка Amazon,...
Исправление кода с импортным шахматным модулем для сказочных камер в Python требуется: он не производит оптимального движения AA4A1, но не оптимальный KG1H1, после которого может быть доставлен один ход CEAMATE CE3E1. Код приведен здесь. Здесь...
Исправление кода с импортным шахматным модулем для сказочных камер в Python требуется: он не производит оптимального движения AA4A1, но не оптимальный KG1H1, после которого может быть доставлен один ход CEAMATE CE3E1. Код приведен здесь. Здесь...
Я пытаюсь исправить свой код, который должен оценить и найти лучший шаг в игре в сказочные шахматы. Это вариант шахмата с дополнительными частями, такими как Amazon (Queen + Knight), Cyril (Rook + Knight) и EVE (Knight + Bishop).
У меня есть...
Я следил за этими учебными пособиями, которые я предоставлю ссылку для дальнейшего вниз, и у них есть некоторые проблемы, которые я вроде исправил, глядя на комментарии. Они не такие старые, но достаточно взрослые, чтобы использовать устаревший код....