Stampa di singole mosse con la libreria python-chess

Aug 21 2020

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

  1. Avrei bisogno di creare un'istanza di un visitatore che può attraversare i nodi di gioco in ordine PGN utilizzando il metodo di accettazione
  2. 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

1 Niklas Aug 21 2020 at 09:19

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.