Печать отдельных ходов с помощью библиотеки python-chess

Aug 21 2020

Я хочу последовательно печатать ходы (по одной строке на ход за раз) из игры, которую я читал (с использованием библиотеки python-chess), из текстового файла.

Итак, скажем, у меня есть файл pgn с игрой, в которой есть следующие ходы ...

1. f3 e5 2. g4 Qh4 #

... Я хотел бы перебрать ходы и распечатать их один за другим (используя цикл for или аналогичный), показывая

f3

e5

g4

Qh4

Я нашел документацию по python-chess здесь: https://python-chess.readthedocs.io/en/latest/

Из документации я понимаю, что

  1. Мне нужно было бы создать экземпляр посетителя, который может перемещаться по игровым узлам в порядке PGN, используя метод accept
  2. что san methon предоставит мне строку для перемещения, которое привело к текущему узлу

Но мне трудно читать такую ​​документацию, и мне очень помогут примеры.

Что мне удалось сделать, так это прочитать партию из файла pgn и распечатать все ходы за один раз (а не по одному), используя метод вариации.

import chess.pgn

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

print(my_game.variation(0))

Ответы

1 Niklas Aug 21 2020 at 09:19

Итерация основных ходов

В документации для chess.pgn.read_game()есть пример перебора ходов. Чтобы преобразовать ходы обратно в стандартные алгебраические обозначения, позиция нужна для контекста, поэтому мы дополнительно делаем все ходы на 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)

Посетители

В приведенном выше примере вся игра анализируется в структуру данных ( game: chess.pgn.Game). Посетители позволяют пропустить это промежуточное представление, что может быть полезно для использования вместо этого настраиваемой структуры данных или для оптимизации. Но здесь это кажется излишним.

Тем не менее, для полноты:

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)

Обратите внимание, что это также пересекает боковые вариации в порядке PGN.