pythonで棋譜データを扱う
棋譜データをpythonで読み込む方法についてのメモです。こちらのライブラリを使用させて頂いています。GitHub - gunyarakun/python-shogi: A pure Python shogi library with move generation and validation and handling of common formats.
元となる棋譜データはCSA形式を想定しています。サンプルデータには「将棋DB2」のCSA形式ファイルを使用しました。
例 羽生善治 vs. 藤井猛 順位戦 - 無料の棋譜サービス 将棋DB2
サンプルコード
import shogi.CSA kif = shogi.CSA.Parser.parse_file('test.csa')[0] board = shogi.Board() for move in kif['moves']: # どこからどこに移動したか USIプロトコル形式 print(move) # 移動 board.push_usi(move) # 盤面表示 print(board) # テキスト形式(ASCII文字) print(board.kif_str()) # テキスト形式(KIFスタイル) # 占有している駒の位置 右下から左に移動という方向で表記されている print('{:0=81b}'.format(board.occupied[shogi.BLACK]))# 先手 print('{:0=81b}'.format(board.occupied[shogi.WHITE]))# 後手 # 先手の持ち駒 参考 : https://tadaoyamaoka.hatenablog.com/entry/2017/04/08/165742 hand = board.pieces_in_hand hand_b = hand[shogi.BLACK] for p in hand_b.keys(): print("piece: {0}, num: {1}".format(shogi.Piece(p, shogi.BLACK).symbol(), hand_b[p])) print("piece: {0}, num: {1}".format(shogi.Piece(p, shogi.BLACK).japanese_symbol(), hand_b[p])) print('-'*100)
USI形式について
駒の表記法、位置の表記法についてはこちらをご覧ください将棋所:USIプロトコルとは
駒の表記法
盤面を表記するとき、1段目の左側(9筋側)から駒の種類を書いていきます。空白の升は、空白が続く個数の数字を書きます。
平手初期局面の場合、1段目は、左から後手の駒が香桂銀金玉金銀桂香と並んでいるので、lnsgkgsnlとなります。2段目は、空白が1升、後手の飛車、空白が5升、後手の角、空白が1升というように並んでいるので、1r5b1となります。
位置の表記法
指し手に関しては、駒の移動元の位置と移動先の位置を並べて書きます。7七の駒が7六に移動したのであれば、7g7fと表記します。(駒の種類を表記する必要はありません。)
駒が成るときは、最後に+を追加します。8八の駒が2二に移動して成るなら8h2b+と表記します。
持ち駒を打つときは、最初に駒の種類を大文字で書き、それに*を追加し、さらに打った場所を追加します。金を5二に打つ場合はG*5bとなります
このブログにコメントするにはログインが必要です。
さんログアウト
この記事には許可ユーザしかコメントができません。