Drukowanie pojedynczych ruchów za pomocą biblioteki python-chess
Chcę sekwencyjnie drukować ruchy (jeden ciąg na ruch na raz) z gry, którą czytałem (używając biblioteki python-chess) z pliku tekstowego.
Powiedzmy, że mam plik pgn z grą, która ma następujące ruchy ...
1. f3 e5 2. g4 Hh4 #
... Chciałbym powtórzyć ruchy i wydrukować je jeden po drugim (używając pętli for lub podobnej), pokazując
f3
e5
g4
Hh4
Dokumentację do szachów Pythona znalazłem tutaj: https://python-chess.readthedocs.io/en/latest/
Z dokumentacji to rozumiem
- Musiałbym utworzyć wystąpienie gościa, który może przechodzić przez węzły gry w kolejności PGN przy użyciu metody accept
- że san meton da mi ciąg znaków dla ruchu, który doprowadził do bieżącego węzła
Ale uważam, że tego rodzaju dokumentacja jest trudna do odczytania i bardzo pomogłyby mi przykłady.
To, co udało mi się zrobić, to wczytać grę z pliku pgn i wydrukować wszystkie ruchy za jednym razem (w przeciwieństwie do jednego po drugim) metodą wariacji.
import chess.pgn
pgn = open('I:\myfile.pgn')
my_game = chess.pgn.read_game(pgn)
print(my_game.variation(0))
Odpowiedzi
Iterowanie po ruchach linii głównej
Dokumentacja dla chess.pgn.read_game()zawiera przykład iteracji po ruchach. Aby przekonwertować ruchy z powrotem do standardowej notacji algebraicznej, pozycja jest potrzebna do kontekstu, więc dodatkowo wykonujemy wszystkie ruchy na a 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)
goście
Powyższy przykład analizuje całą grę w strukturę danych ( game: chess.pgn.Game). Odwiedzający pozwalają na pominięcie tej reprezentacji pośredniej, co może być przydatne do wykorzystania zamiast tego niestandardowej struktury danych lub do optymalizacji. Ale tutaj wydaje się to przesada.
Niemniej jednak dla kompletności:
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)
Zauważ, że to również przechodzi przez boczne odchylenia w kolejności PGN.