python-chessライブラリを使用して個々の動きを印刷する

Aug 21 2020

テキストファイルから(python-chessライブラリを使用して)読んだゲームの動き(一度に1つの動きにつき1つの文字列)を順番に印刷したいと思います。

だから、私は次の動きがあるゲームのpgnファイルを持っているとしましょう...

1. f3 e5 2. g4 Qh4#

...移動を繰り返して、1つずつ印刷します(forループなどを使用)。

f3

e5

g4

Qh4

私はここでpython-chessのドキュメントを見つけました: https://python-chess.readthedocs.io/en/latest/

ドキュメントから私はそれを理解しています

  1. acceptメソッドを使用してPGNの順序でゲームノードをトラバースできるビジターのインスタンスを作成する必要があります
  2. サンメトンが現在のノードにつながった移動の文字列を教えてくれること

しかし、私はこの種のドキュメントを読むのが難しいと感じており、例で大いに役立つでしょう。

私が何とかしたのは、pgnファイルからゲームを読み取り、変分法を使用してすべての動きを(1つずつではなく)一度に印刷することです。

import chess.pgn

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

print(my_game.variation(0))

回答

1 Niklas Aug 21 2020 at 09:19

メインラインの動きを繰り返す

のドキュメントに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順序のサイドバリエーションもトラバースすることに注意してください。