Stampa di singole mosse con la libreria python-chess
Voglio stampare in sequenza le mosse (una stringa per mossa alla volta) da un gioco che ho letto (usando la libreria python-chess) da un file di testo.
Quindi, diciamo che ho un file pgn con un gioco che ha le seguenti mosse ...
1. f3 e5 2. g4 Qh4 #
... Vorrei scorrere le mosse e stamparle una per una (usando un ciclo for o simili), mostrando
f3
e5
g4
Qh4
Ho trovato la documentazione per python-chess qui: https://python-chess.readthedocs.io/en/latest/
Dalla documentazione lo capisco
- Avrei bisogno di creare un'istanza di un visitatore che può attraversare i nodi di gioco in ordine PGN utilizzando il metodo di accettazione
- che il san methon mi avrebbe dato la stringa per lo spostamento che ha portato al nodo corrente
Ma trovo questo tipo di documentazione difficile da leggere e sarei molto aiutato con gli esempi.
Quello che sono riuscito a fare è leggere un gioco da un file pgn e stampare tutte le mosse in una volta (invece di una per una) usando il metodo di variazione.
import chess.pgn
pgn = open('I:\myfile.pgn')
my_game = chess.pgn.read_game(pgn)
print(my_game.variation(0))
Risposte
Iterazione sulle mosse principali
La documentazione per chess.pgn.read_game()ha un esempio per l'iterazione sui movimenti. Per riconvertire le mosse in notazione algebrica standard, la posizione è necessaria per il contesto, quindi eseguiamo anche tutte le mosse su 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)
Visitatori
L'esempio precedente analizza l'intero gioco in una struttura dati ( game: chess.pgn.Game
). I visitatori consentono di saltare quella rappresentazione intermedia, che può essere utile per utilizzare invece una struttura di dati personalizzata o come ottimizzazione. Ma qui sembra eccessivo.
Tuttavia, per completezza:
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)
Notare che questo attraversa anche le variazioni laterali nell'ordine PGN.