Drucken einzelner Züge mit der Python-Schachbibliothek
Ich möchte die Züge (jeweils eine Zeichenfolge pro Zug) aus einem Spiel, das ich (unter Verwendung der Python-Schach-Bibliothek) gelesen habe, nacheinander aus einer Textdatei drucken.
Angenommen, ich habe eine PNG-Datei mit einem Spiel, das die folgenden Züge enthält ...
1. f3 e5 2. g4 Qh4 #
... Ich möchte die Bewegungen durchlaufen und sie einzeln drucken (mit einer for-Schleife oder ähnlichem)
f3
e5
g4
Dh4
Die Dokumentation für Python-Schach habe ich hier gefunden: https://python-chess.readthedocs.io/en/latest/
Aus der Dokumentation verstehe ich das
- Ich müsste eine Instanz eines Besuchers erstellen, der die Spielknoten in PGN-Reihenfolge mit der Methode accept durchlaufen kann
- dass das San Methon mir die Zeichenfolge für die Bewegung geben würde, die zum aktuellen Knoten führte
Aber ich finde diese Art von Dokumentation schwer zu lesen und würde mit Beispielen sehr geholfen.
Was ich geschafft habe, ist ein Spiel aus einer PNG-Datei zu lesen und alle Züge auf einmal (im Gegensatz zu einem nach dem anderen) mit der Variationsmethode zu drucken.
import chess.pgn
pgn = open('I:\myfile.pgn')
my_game = chess.pgn.read_game(pgn)
print(my_game.variation(0))
Antworten
Iterieren über Hauptlinienbewegungen
Die Dokumentation für chess.pgn.read_game()enthält ein Beispiel für das Durchlaufen von Bewegungen. Um die Züge wieder in die algebraische Standardnotation umzuwandeln, wird die Position für den Kontext benötigt, sodass wir zusätzlich alle Züge auf a ausführen 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)
Besucher
Das obige Beispiel analysiert das gesamte Spiel in eine Datenstruktur ( game: chess.pgn.Game). Besucher können diese Zwischendarstellung überspringen, was nützlich sein kann, um stattdessen eine benutzerdefinierte Datenstruktur oder als Optimierung zu verwenden. Aber das scheint hier übertrieben.
Der Vollständigkeit halber jedoch:
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)
Beachten Sie, dass dies auch seitliche Variationen in der PGN-Reihenfolge durchläuft .