Stockfish DD – notation 指し手文字列に変換

今回は指し手をUCIの指し手文字列に変換する部分を見ていきます。将棋ではUCIではなくUSIプロトコルとなっています。以下、UCIと書いてある部分はUSIと読み換えて理解してください。

UCIプロトコルでは、思考を開始する局面は、普通、startpos(平手の初期局面)からの指し手を示す文字列が送られてきます。と言うことは、常識的には、UCI表記での指し手文字列を思考エンジンが内部で使っている指し手構造体に変換する必要があります。ところが、Stockfishにはこの変換をダイレクトに行なう関数は存在しません。さて、どうやっているのでしょうか。

実は、現在の局面の合法手すべてを生成して、それをmove_to_uci( )でそれをUCIの指し手文字列に変換し、それが与えられた文字列と一致したら、そのmove_to_uci( )で変換する前の指し手構造体を返すという実装になっています。少し遅いのが気になりますが、思考開始のときに送られてくるだけなのでこの部分が多少遅くとも誤差の範疇です。

これは、大変エレガントな実装だと私は思います。

ところが、将棋倶楽部24にオートパイロットでやねうら王を参戦させていたとき(2014年5月のことで、将棋倶楽部24公認のイベントでした。念のため。)、将棋倶楽部24ではサーバー側から王手放置の局面が送られてくるんです。将棋倶楽部24にPCで対局していると王手放置で逆王手とか出来るので知っている人も多いかと思います。こんな指し手は非合法手なので普通サーバー側判定で弾くべきですが、将棋倶楽部24ではそうはなっていません。

そこで、将棋倶楽部24に参加する思考エンジンは非合法手でも指し手を受け取れるようにする必要があり、そのためにはUSIの指し手文字列をダイレクトに思考エンジンが使っている指し手構造体に変換する処理が必要になります。

「大変エレガント」だったはずの実装が、将棋倶楽部24のせいで書き直しを迫られたという話でした。

 


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です