Impression de coups individuels avec la bibliothèque python-chess

Aug 21 2020

Je veux imprimer séquentiellement les coups (une chaîne par coup à la fois) à partir d'un jeu que j'ai lu (en utilisant la bibliothèque python-chess) à partir d'un fichier texte.

Donc, disons que j'ai un fichier pgn avec un jeu qui a les mouvements suivants ...

1. f3 e5 2. g4 Qh4 #

... Je voudrais parcourir les mouvements et les imprimer un par un (en utilisant une boucle for ou similaire), en montrant

f3

e5

g4

Qh4

J'ai trouvé la documentation pour python-chess ici: https://python-chess.readthedocs.io/en/latest/

D'après la documentation, je comprends que

  1. J'aurais besoin de créer une instance d'un visiteur qui peut traverser les nœuds du jeu dans l'ordre PGN en utilisant la méthode d'acceptation
  2. que le san methon me donnerait la chaîne pour le mouvement qui a conduit au nœud actuel

Mais je trouve ce genre de documentation difficile à lire et je serais grandement aidé par des exemples.

Ce que j'ai réussi à faire est de lire un jeu à partir d'un fichier pgn et d'imprimer tous les coups en une seule fois (par opposition à un par un) en utilisant la méthode de variation.

import chess.pgn

pgn = open('I:\myfile.pgn')
my_game = chess.pgn.read_game(pgn)

print(my_game.variation(0))

Réponses

1 Niklas Aug 21 2020 at 09:19

Itération sur les mouvements de la ligne principale

La documentation pour chess.pgn.read_game()a un exemple pour itérer sur les mouvements. Pour convertir les mouvements en notation algébrique standard, la position est nécessaire pour le contexte, nous faisons donc en plus tous les mouvements sur un 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)

Visiteurs

L'exemple ci-dessus analyse l'ensemble du jeu en une structure de données ( game: chess.pgn.Game). Les visiteurs permettent de sauter cette représentation intermédiaire, ce qui peut être utile pour utiliser une structure de données personnalisée à la place, ou comme optimisation. Mais cela semble exagéré ici.

Néanmoins, par souci d'exhaustivité:

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)

Notez que cela traverse également les variations latérales dans l'ordre PGN.