使用pythonchess库打印单个移动

2024-10-01 05:01:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我想从一个文本文件(使用python国际象棋库)中读取一个游戏,然后按顺序打印其中的移动(每次移动一个字符串)

所以,假设我有一个pgn文件,其中有一个游戏有以下动作

1。f3 e5 2。g4 Qh4#

。。。我想迭代这些动作,并逐个打印它们(使用for循环或类似的方法),显示

f3

e5

g4

Qh4

我在这里找到了python国际象棋的文档: https://python-chess.readthedocs.io/en/latest/

从文件中我了解到

  1. 我需要创建一个访问者实例,它可以使用accept方法以PGN顺序遍历游戏节点
  2. san methon会给我移动到当前节点的字符串

但是我发现这类文档很难阅读,并且会通过示例得到很大帮助

我所做的是从pgn文件中读取一个游戏,并使用变体方法一次性打印所有移动(而不是逐个打印)

import chess.pgn

pgn = open('I:\myfile.pgn')
my_game = chess.pgn.read_game(pgn)

print(my_game.variation(0))

Tags: 文件方法字符串文档game游戏顺序国际象棋
1条回答
网友
1楼 · 发布于 2024-10-01 05:01:40

迭代主线移动

^{}的文档中有一个迭代移动的示例。要将移动转换回标准代数表示法,上下文需要位置,因此我们还需要在board上进行所有移动

import chess.pgn

pgn = open("test.pgn")
game = chess.pgn.read_game(pgn)

board = game.board()

for move in game.mainline_moves():
    print(board.san(move))
    board.push(move)

访客

上面的示例将整个游戏解析为一个数据结构(game: chess.pgn.Game)。访问者允许跳过该中间表示,这对于使用自定义数据结构或作为优化非常有用。但这似乎有点过分了

尽管如此,为了完整性:

import chess.pgn

class PrintMovesVisitor(chess.pgn.BaseVisitor):
    def visit_move(self, board, move):
        print(board.san(move))

    def result(self):
        return None

pgn = open("test.pgn")
result = chess.pgn.read_game(pgn, Visitor=PrintMovesVisitor)

注意,这也以PGN顺序遍历side variations

相关问题 更多 >