Исправление кода с импортным шахматным модулем для сказок в Python: он не производит оптимальное движение AA4A1, но неопPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Исправление кода с импортным шахматным модулем для сказок в Python: он не производит оптимальное движение AA4A1, но неоп

Сообщение Anonymous »

Я пытаюсь исправить свой код, который должен оценить и найти лучший шаг в игре в сказочные шахматы. Это вариант шахмата с дополнительными частями, такими как Amazon (Queen + Knight), Cyril (Rook + Knight) и EVE (Knight + Bishop). < /P>
У меня есть относительно упрощенная позиция образца, где заглавные буквы представляют белые кусочки, а буквы нижних регистра представляют черные кусочки. < /P>

Код: Выделить всё

  +-----------------+
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"""

def __init__(self, fen=None):
self.board = [[None for _ in range(8)] for _ in range(8)]
self.turn = True  # True = bílý, False = černý
self.castling_rights = {'K': True, 'Q': True, 'k': True, 'q': True}
self.en_passant = None
self.halfmove_clock = 0
self.fullmove_number = 1

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

# Počítadla tahů
self.halfmove_clock = int(parts[4]) if len(parts) > 4 else 0
self.fullmove_number = int(parts[5]) if len(parts) > 5 else 1

def get_fen(self):
"""Vrátí FEN string pozice"""
fen_parts = []
for rank in range(7, -1, -1):
row_fen = ""
empty_count = 0

for file in range(8):
piece = self.board[rank][file]
if piece is None:
empty_count += 1
else:
if empty_count > 0:
row_fen += str(empty_count)
empty_count = 0
color, piece_type = piece
row_fen += piece_type if color == 'w' else piece_type.lower()

if empty_count >  0:
row_fen += str(empty_count)

fen_parts.append(row_fen)

position = '/'.join(fen_parts)

# Na tahu
turn = 'w' if self.turn else 'b'

# Rošáda
castling = ''
for right in ['K', 'Q', 'k', 'q']:
if self.castling_rights[right]:
castling += right
if not castling:
castling = '-'

# En passant
en_passant = self.en_passant if self.en_passant else '-'

return f"{position} {turn} {castling} {en_passant} {self.halfmove_clock} {self.fullmove_number}"

def copy(self):
"""Vytvoří kopii šachovnice"""
new_board = ChessBoard()
new_board.board = [row[:] for row in self.board]
new_board.turn = self.turn
new_board.castling_rights = self.castling_rights.copy()
new_board.en_passant = self.en_passant
new_board.halfmove_clock = self.halfmove_clock
new_board.fullmove_number = self.fullmove_number
return new_board

def make_move(self, from_pos, to_pos):
"""Provede tah"""
from_rank, from_file = from_pos
to_rank, to_file = to_pos

piece = self.board[from_rank][from_file]
self.board[to_rank][to_file] = piece
self.board[from_rank][from_file] = None

# Změnit hráče na tahu
self.turn = not self.turn

# Inkrementovat počítadla
if self.turn:
self.fullmove_number += 1
self.halfmove_clock += 1

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 not piece:
return False

color, piece_type = piece

if piece_type == 'P':
return self.pawn_attacks(from_pos, to_pos, color)
elif piece_type == 'R':
return self.rook_attacks(from_pos, to_pos)
elif piece_type == 'N':
return self.knight_attacks(from_pos, to_pos)
elif piece_type == 'B':
return self.bishop_attacks(from_pos, to_pos)
elif piece_type == 'Q':
return self.queen_attacks(from_pos, to_pos)
elif piece_type == 'K':
return self.king_attacks(from_pos, to_pos)
elif piece_type == 'A':  # Amazonka (Q+N)
return self.queen_attacks(from_pos, to_pos) or self.knight_attacks(from_pos, to_pos)
elif piece_type == 'C':  # Cyril (R+N)
return self.rook_attacks(from_pos, to_pos) or self.knight_attacks(from_pos, to_pos)
elif piece_type == 'E':   # Eve (B+N)
return self.bishop_attacks(from_pos, to_pos) or self.knight_attacks(from_pos, to_pos)

return False

def pawn_attacks(self, from_pos, to_pos, color):
"""Kontroluje útok pěšce"""
from_rank, from_file = from_pos
to_rank, to_file = to_pos

direction = 1 if color == 'w' else -1

return (abs(from_file - to_file) == 1 and
to_rank - from_rank == direction)

def knight_attacks(self, from_pos, to_pos):
"""Kontroluje útok jezdce"""
from_rank, from_file = from_pos
to_rank, to_file = to_pos

dr = abs(from_rank - to_rank)
df = abs(from_file - to_file)

return (dr == 2 and df == 1) or (dr == 1 and df == 2)

def rook_attacks(self, from_pos, to_pos):
"""Kontroluje útok věže"""
from_rank, from_file = from_pos
to_rank, to_file = to_pos

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

return True

def bishop_attacks(self, from_pos, to_pos):
"""Kontroluje útok střelce"""
from_rank, from_file = from_pos
to_rank, to_file = to_pos

dr = to_rank - from_rank
df = to_file - from_file

if abs(dr) != abs(df) or dr == 0:
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)

def king_attacks(self, from_pos, to_pos):
"""Kontroluje útok krále"""
from_rank, from_file = from_pos
to_rank, to_file = to_pos

return (abs(from_rank - to_rank) 

Подробнее здесь: [url]https://stackoverflow.com/questions/79694548/fixing-a-code-with-import-chess-module-for-fairy-pieces-in-python-it-does-not-p[/url]
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»