Mencetak gerakan individu dengan pustaka python-catur
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
- Saya perlu membuat instance pengunjung yang dapat melintasi node game dalam urutan PGN menggunakan metode terima
- 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
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.