Печать отдельных ходов с помощью библиотеки python-chess
Я хочу последовательно печатать ходы (по одной строке на ход за раз) из игры, которую я читал (с использованием библиотеки python-chess), из текстового файла.
Итак, скажем, у меня есть файл pgn с игрой, в которой есть следующие ходы ...
1. f3 e5 2. g4 Qh4 #
... Я хотел бы перебрать ходы и распечатать их один за другим (используя цикл for или аналогичный), показывая
f3
e5
g4
Qh4
Я нашел документацию по python-chess здесь: https://python-chess.readthedocs.io/en/latest/
Из документации я понимаю, что
- Мне нужно было бы создать экземпляр посетителя, который может перемещаться по игровым узлам в порядке PGN, используя метод accept
- что san methon предоставит мне строку для перемещения, которое привело к текущему узлу
Но мне трудно читать такую документацию, и мне очень помогут примеры.
Что мне удалось сделать, так это прочитать партию из файла pgn и распечатать все ходы за один раз (а не по одному), используя метод вариации.
import chess.pgn
pgn = open('I:\myfile.pgn')
my_game = chess.pgn.read_game(pgn)
print(my_game.variation(0))
Ответы
Итерация основных ходов
В документации для 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.