Mencetak gerakan individu dengan pustaka python-catur

Aug 21 2020

Saya ingin mencetak gerakan secara berurutan (satu string per gerakan pada satu waktu) dari permainan yang saya baca (menggunakan pustaka python-catur) dari file teks.

Jadi, katakanlah saya memiliki file pgn dengan permainan yang memiliki gerakan berikut ...

1. f3 e5 2. g4 Qh4 #

... Saya ingin mengulang melalui gerakan dan mencetaknya satu per satu (menggunakan for loop atau serupa), menunjukkan

f3

e5

g4

Qh4

Saya menemukan dokumentasi untuk python-chess di sini: https://python-chess.readthedocs.io/en/latest/

Dari dokumentasi saya mengerti itu

  1. Saya perlu membuat instance pengunjung yang dapat melintasi node game dalam urutan PGN menggunakan metode terima
  2. bahwa san methon akan memberi saya string untuk gerakan yang mengarah ke node saat ini

Tetapi saya merasa dokumentasi semacam ini sulit dibaca dan akan sangat terbantu dengan contohnya.

Apa yang berhasil saya lakukan adalah membaca permainan dari file pgn dan mencetak semua gerakan sekaligus (sebagai lawan satu per satu) menggunakan metode variasi.

import chess.pgn

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

print(my_game.variation(0))

Jawaban

1 Niklas Aug 21 2020 at 09:19

Iterasi di atas gerakan garis utama

Dokumentasi untuk chess.pgn.read_game()memiliki contoh untuk mengulang perpindahan. Untuk mengonversi gerakan kembali ke notasi aljabar standar, posisi diperlukan untuk konteks, jadi kami juga melakukan semua gerakan pada 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)

Pengunjung

Contoh di atas mem-parsing seluruh game menjadi struktur data ( game: chess.pgn.Game). Pengunjung mengizinkan melewatkan representasi perantara itu, yang dapat berguna untuk menggunakan struktur data khusus, atau sebagai pengoptimalan. Tapi sepertinya itu berlebihan di sini.

Meskipun demikian, untuk kelengkapan:

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)

Perhatikan bahwa ini juga melintasi variasi sisi dalam urutan PGN.