Drukowanie pojedynczych ruchów za pomocą biblioteki python-chess

Aug 21 2020

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

  1. 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
  2. ż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

1 Niklas Aug 21 2020 at 09:19

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.