1

我正在使用模块python-chess ( https://python-chess.readthedocs.io/en/latest/index.html ) 来提取分析 400 万个国际象棋游戏 ( http://caissabase.co.uk/ )。

如何将游戏的所有动作作为字符串加载到列表中?这个想法是让我能够提取有关移动的信息。例如,皇后吃了多少次对手的棋子?因此,我会在每个移动字符串中搜索“Qx”。我试过这个:

test = [] # list I wish to append moves to (as strings)
game = chess.pgn.read_game(pgn)

board = game.board()

for move in game.mainline_moves():
    board.push(move)
    test.append(board.san(move)) # this does not work and seems to cause the below error

上面的代码会产生以下错误:

AssertionError: san() and lan() expect move to be legal or null, but got g1f3 in rnbqkbnr/pppppppp/8/8/8/5N2/PPPPPPPP/RNBQKB1R b KQkq - 1 1

然而,其余代码没有test.append(board.san(move))将所有游戏动作打印为字符串就好了。

任何帮助是极大的赞赏。

4

1 回答 1

0

board.san(move)为您提供基于当前位置的移动符号(请参阅文档)。但是,您之前已经通过在棋盘上移动来改变位置。因此它不承认马的第一个动作g1f3是合法的:马已经在 f3 上!

我怀疑如果你在循环中交换两行它应该可以工作。也就是说,您首先需要写下移动,然后进行移动(与实际下国际象棋的做法有些不同;))

于 2021-02-04T00:50:19.137 回答