为了账号安全,请及时绑定邮箱和手机立即绑定

使用 python-chess 库打印单个动作

使用 python-chess 库打印单个动作

千巷猫影 2023-06-13 16:29:52
我想从文本文件中读取(使用 python-chess 库)的游戏中顺序打印移动(一次一个字符串)。所以,假设我有一个 pgn 文件,其中包含具有以下动作的游戏......1. f3 e5 2. g4 Qh4#...我想遍历这些动作并一个一个地打印它们(使用 for 循环或类似的),显示f3e5g4Qh4我需要创建一个访问者实例,它可以使用 accept 方法按 PGN 顺序遍历游戏节点san methon 会给我指向当前节点的移动字符串但是我发现这种文档很难阅读,并且可以通过示例得到很大的帮助。我设法做的是从 pgn 文件中读取游戏并使用变体方法一次性打印所有动作(而不是一个一个地)。import chess.pgnpgn = open('I:\myfile.pgn')my_game = chess.pgn.read_game(pgn)print(my_game.variation(0))
查看完整描述

1 回答

?
翻阅古今

TA贡献1780条经验 获得超5个赞

迭代主线移动

的文档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 顺序的边变化。


查看完整回答
反对 回复 2023-06-13
  • 1 回答
  • 0 关注
  • 130 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信