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/
ドキュメントから私はそれを理解しています
- acceptメソッドを使用してPGNの順序でゲームノードをトラバースできるビジターのインスタンスを作成する必要があります
- サンメトンが現在のノードにつながった移動の文字列を教えてくれること
しかし、私はこの種のドキュメントを読むのが難しいと感じており、例で大いに役立つでしょう。
私が何とかしたのは、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順序のサイドバリエーションもトラバースすることに注意してください。