若き研究者の日常

技術寄りの事かポエムを書く。

KIF形式のファイルに対しcshogiを用いた可視化する

cshogiという便利なツールがある.詳しくはリポジトリDocumentation,そして作者様のブログを見てほしい.

(問題) https://tadaoyamaoka.hatenablog.com/entry/2019/10/28/233237 このブログポストに書かれているColabのプロジェクトを動かそうとしたが,棋譜の可視化のところがうまくいかなかった.サンプルコードではcshogi.KIF.Parserオブジェクトが下図や*1のようにリスト内のdictオブジェクトっぽくなっているが,

2024年現在のcshogiの実装だと以下の実行結果のようにTypeError: 'Parser' object is not subscriptableエラーが出てしまう.

現在の実装を見てみると,cshogi.KIF.Parser.movesメソッドがUSIの値を返さずに内部で用いられているint型の値(https://tadaoyamaoka.github.io/cshogi/cshogi.html#cshogi.to_usiによると,move (int) – A move represented as an integer.)を返すように仕様変更されているようである.

(解決策) cshogi.to_usi(),またはcshogi.move_to_usi()が内部のint型の値をusi形式に直してくれるっぽい(to_usiはbyte型,move_to_usiはstr型で返ってくる),また,cshorgi.Boardクラスのpush_usiメソッドらは内部のint型の値を返してくれるっぽい(つまり,cshogi.move_to_usi()と cshorgi.Board.push_usi( )は逆のメソッド)ので,上記のブログのColabのコードの可視化の部分は

from IPython.display import SVG, display
board = Board()
for usi in kif[0]["moves"]:
  move = board.push_usi(usi)
  display(SVG(board.to_svg(move)))

ではなく,簡潔に

from IPython.display import SVG, display
board = Board()
for move in kif.moves:
  display(SVG(board.to_svg(move)))

で動いた.

サンプルコードはこちら

colab.research.google.com

[{'moves': ['3g3f',
   '6a7b',
   '4i4h',
   '7c7d',
   '6i7h',
   '4a3b',
   '5g5f',
   '5c5d',
   '3i3h',
   '7a6b',
   '4h5g',
   '3a4b',
   '5g4f',
   '4b5c',
   '7i6h',
   '5c6d',
   '6h5g',
   '6d7e',
   '7g7f',
   '3c3d',
   '8h2b',
   '7e6f',
   '2b3a+',
   '6f7g+',
   '3a4b',
   '5a6a',
   '4b3a',
   '7g7h',
   '3a4b',
   'G*7e',
   '4b3a',
   '6a5b',
   '3a4b',
   '5b4b',
   'B*5a',
   '4b5c',
   '5a1e+',
   '5c6d',
   '1e4b',
   'B*5c',
   '4b3a',
   '7e8e',
   '3a4b',
   '8e9f',
   '4b3a',
   '9f9g',
   '9i9g',
   '7h6h',
   '5i4h',
   '6h7i',
   'G*3e',
   '7i8i',
   '3a4b',
   'N*4d',
   '4b3a',
   '8c8d',
   '3a4b',
   '8b8c',
   '4b3a',
   '8c7c',
   '3a4b',
   '2c2d',
   '4b3a',
   '3b2c',
   '3a4b',
   '7b7a',
   '4b3a',
   '5c3a',
   '3e2e',
   '3a5c',
   '2e1d',
   'B*5i',
   '4h4i',
   '7a8b',
   '4i3i',
   '8b8c',
   '1d1c',
   '1a1c',
   '3i4i',
   'G*7e',
   '4i3i',
   '7e8e',
   '3i4i',
   '8e9f',
   '4i3i',
   '8c9d',
   '3i4i',
   'P*1h',
   '4i5h',
   '9f9g',
   '4f3e',
   'L*8b',
   '5g4f',
   '9a9b',
   '3e2e',
   '1c1d',
   '2e1d',
   '2c1c',
   'L*6f'],
  'names': ['dqn', 'dqn'],
  'sfen': 'lnsgkgsnl/1r5b1/ppppppppp/9/9/9/PPPPPPPPP/1B5R1/LNSGKGSNL b - 1',
  'win': 'b'}]

*ちなみにKIFファイルについて: 棋譜ファイル KIF 形式