Я пытаюсь написать простой шахматный движок, который ищет ход, дающий наибольшее материальное преимущество. Однако я сталкиваюсь со странной ошибкой, которая показывает не ту доску, которую я передал.
Мой код:
def best_move(board):
print(board)
moves = board.legal_moves
result = choice(list(moves))
for i in moves:
newboard = board
newboard.push(i)
oldboard = board
oldboard.push(result)
if material_count(newboard) > material_count(oldboard):
result = i
return result
Однако при запуске этой функции я получаю эту ошибку:
AssertionError: push() expects move to be pseudo-legal, but got g8h6 in rnbqkb1r/ppppnppp/8/8/3PP3/8/PPP2PPP/RNBQKBNR
Плата в сообщении об ошибке выглядит так:
r n b q k b . r
p p p p n p p p
. . . . . . . .
. . . . . . . .
. . . P P . . .
. . . . . . . .
P P P . . P P P
R N B Q K B N R
Как видите, моя пешка на вертикали e полностью исчезла, а мой конь занял место своего упавшего товарища. Однако это не та плата, которую я передал в свой метод, как показано ниже:
r n b q k b n r
p p p p . p p p
. . . . . . . .
. . . . p . . .
. . . P P . . .
. . . . . . . .
P P P . . P P P
R N B Q K B N R
Любые идеи? Я не понимаю, почему правление изменяется таким образом.
newboard = board
не создает копиюbroad
. Любые изменения, внесенные вами вnewboard
, повлияют как наboard
, так и наoldboard
. Если вместо этого вы создадите глубокую копиюboard
, это исправит ситуацию? - person Random Davis   schedule 25.02.2021newboard = chess.Board(board.fen())
. Это правильный способ сделать это? - person aidenwilson   schedule 25.02.2021Board
, поэтому не могу сказать наверняка, что это сработает, но если он действительно работает, то я предполагаю, что это правильно. - person Random Davis   schedule 25.02.2021