使用 python-chess 库打印单个动作
Printing individual moves with the python-chess library
我想从一个文本文件中按顺序打印我读过的游戏(使用 python-chess 库)的动作(一次一个字符串)。
所以,假设我有一个 pgn 文件,其中包含具有以下动作的游戏...
1. f3 e5 2.g4 Qh4#
...我想遍历动作并一个一个地打印它们(使用 for 循环或类似的),显示
f3
e5
g4
Qh4
我在这里找到了 python-chess 的文档:
https://python-chess.readthedocs.io/en/latest/
我从文档中了解到
- 我需要创建一个访问者实例,它可以使用 accept 方法按 PGN 顺序遍历游戏节点
- san methon 会给我导致当前节点的移动的字符串
但我发现这种文档很难阅读,如果有示例会很有帮助。
我设法做的是从 pgn 文件中读取游戏并使用变体方法一次性打印所有动作(而不是一个一个地打印)。
import chess.pgn
pgn = open('I:\myfile.pgn')
my_game = chess.pgn.read_game(pgn)
print(my_game.variation(0))
迭代主线移动
chess.pgn.read_game()
的文档有一个迭代移动的示例。要将移动转换回标准代数符号,上下文需要位置,因此我们另外在 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。
我想从一个文本文件中按顺序打印我读过的游戏(使用 python-chess 库)的动作(一次一个字符串)。
所以,假设我有一个 pgn 文件,其中包含具有以下动作的游戏...
1. f3 e5 2.g4 Qh4#
...我想遍历动作并一个一个地打印它们(使用 for 循环或类似的),显示
f3
e5
g4
Qh4
我在这里找到了 python-chess 的文档: https://python-chess.readthedocs.io/en/latest/
我从文档中了解到
- 我需要创建一个访问者实例,它可以使用 accept 方法按 PGN 顺序遍历游戏节点
- san methon 会给我导致当前节点的移动的字符串
但我发现这种文档很难阅读,如果有示例会很有帮助。
我设法做的是从 pgn 文件中读取游戏并使用变体方法一次性打印所有动作(而不是一个一个地打印)。
import chess.pgn
pgn = open('I:\myfile.pgn')
my_game = chess.pgn.read_game(pgn)
print(my_game.variation(0))
迭代主线移动
chess.pgn.read_game()
的文档有一个迭代移动的示例。要将移动转换回标准代数符号,上下文需要位置,因此我们另外在 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。