【发布时间】:2021-02-24 23:07:47
【问题描述】:
我正在尝试编写一个简单的国际象棋引擎,以寻找能产生最大物质优势的棋步。但是,我遇到了一个奇怪的错误,显示的板不是我传入的板。
我的代码:
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
如您所见,我的电子档案已经完全消失了,我的骑士已经取代了它倒下的战友。但是,这不是我传入我的方法的板子,如下图:
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的深层副本,是否可以解决问题? -
@RandomDavis 非常感谢!您可以将此作为答案发布,以便我接受吗?另外,这是我制作深拷贝的方式:
newboard = chess.Board(board.fen())。这是正确的做法吗? -
我不知道
Board的构造函数是如何实现的,所以我不能肯定它会起作用,但如果它真的起作用,那么我认为这是正确的。 -
@RandomDavis 太棒了!顺便说一句,你想在这个帖子上发布一个答案让我接受吗?
-
好的,我发布了一个答案,我错过了你之前问过的问题。
标签: python chess python-chess