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/
문서에서 나는 이해한다
- accept 메서드를 사용하여 PGN 순서로 게임 노드를 탐색 할 수있는 방문자 인스턴스를 만들어야합니다.
- 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()에는 이동 반복에 대한 예제가 있습니다. 이동을 다시 표준 대수 표기법으로 변환하려면 컨텍스트에 대한 위치가 필요하므로 추가로 모든 이동을 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 순서의 측면 변형 을 횡단 합니다.