チェスの棋譜は、長い文字列のように見えるかもしれませんが、Pythonを使用して簡単に解析できます。この記事では、Pythonを使用してFEN形式からPGN形式への変換方法について説明します。PGN形式は、棋譜を保存するために広く使用されている形式であり、FEN形式は、現在の盤面の状態を表す一般的な形式です。

FEN形式とは何ですか?

FEN形式は、“Forsyth-Edwards Notation"の略で、チェスの現在の盤面の状態を表すために使用されます。FEN形式は、1つの文字列で表され、8つの要素に分割されます。それぞれの要素は、盤面上の1行を表します。各要素は数字、スラッシュ、大文字または小文字の文字で構成されています。数字は、その数の空白スペースを表します。スラッシュは、1行の終わりを示します。大文字の文字は、白い駒を表し、小文字の文字は、黒い駒を表します。

例えば、以下は最初の盤面のFEN形式です。

rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1

PGN形式とは何ですか?

PGN形式は、“Portable Game Notation"の略で、棋譜を保存するために使用されるテキスト形式です。PGN形式には、チェスの手順や結果、コメント、開始局面などが含まれます。PGN形式は、単純で読みやすいテキスト形式であり、多くのチェスプログラムがサポートしています。

例えば、以下は最初の盤面のPGN形式です。

1. e4 e5 2. Nf3 Nc6 3. Bb5 a6 4. Ba4 Nf6 5. O-O

FEN形式からPGN形式への変換

FEN形式をPGN形式に変換するには、Pythonのchessライブラリを使用します。以下は、FEN形式からPGN形式への変換の例です。

import chess.pgn

fen = 'rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1'
board = chess.Board(fen)

game = chess.pgn.Game()
node = game.add_variation(chess.Move.from_uci('e2e4'))

for move in board
.moves:
    node = node.add_variation(move)

print(game, end="\n\n")

出力:

[Event "?"]
[Site "?"]
[Date "????.??.??"]
[Round "?"]
[White "?"]
[Black "?"]
[Result "*"]

1. e4 * 

上記の例では、Pythonのchessライブラリを使用して、FEN形式の文字列を解析し、chess.Boardオブジェクトを作成します。次に、chess.pgn.Gameオブジェクトを作成し、最初の手を追加するためにchess.Move.from_uciメソッドを使用して、指し手を追加します。最後に、すべての可能な手を反復処理し、それらをnode.add_variationメソッドを使用して追加します。

結論

Pythonのchessライブラリを使用すると、簡単にFEN形式をPGN形式に変換できます。この機能を使用することで、チェスプログラムを作成する場合や、研究する場合などで、有用な機能となります。