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