BonanzaのCSAファイル読み込み部 補足
CSAファイルの読み込み部分の解説が終わったのでCSAファイルの書き出しについて解説していこうと思うのですが、その前に、in_CSA_headerの引数で渡しているflagの意味を書いておきます。これは書き出しのときも共通です。
enum { flag_time = b0001, // CSAファイル読み込み時に、考慮時間を // sec_w_total(先手側の考慮時間) // sec_b_total(後手側の考慮時間) // に反映させる。 flag_history = b0010, // make_move_rootという、対局盤面(探索のときの開始局面)を次の局面にする関数があり、 // そのなかでmake_moveを呼び出すのだが、そのときにこのフラグが立っていると // out_CSAを呼び出して指し手をファイルに書きだしていく。 flag_rep = b0100, // 千日手チェック用のフラグ。このフラグが立っていると千日手のチェックを行なう。 flag_detect_hang = b1000, // 王様が取られたかどうかのチェックを行なうかどうか。 flag_nomake_move = b0010 << 4, // 指し手が合法かどうかだけチェックして、実際には局面を進めたくないときに使うフラグ flag_nofmargin = b0100 << 4 }; // 棋譜からの学習の時に使うフラグ。意味はまた棋譜からの学習部を説明するときに詳しく。
flag_detect_hangについては少し説明を要するかも知れません。
将棋では王様を取る前に詰みが確定して、終局になるため、王様を取る手自体が棋譜上に現れることは普通は無いと思うのですが、そのような棋譜がCSA形式のファイルとして不正であるかどうかは、CSA形式の仕様書*1に書かれていないため、そういうCSAファイルがあってもおかしくないのか、それとも、そういうCSAファイルは本来ソフトが出力してはならないのか、私にはよくわかりません。
常識的にはそういう棋譜を書きだすソフトは無いとは思うのですが…。
あと、flag_repについても少し言及しておきます。
これは千日手をチェックするためのフラグなのですが、将棋の現在のルールでは、千日手の成立は同一局面4回となっています。つまり、手順をチェックするのではなく局面自体をチェックしなければなりません。
局面自体は、普通、コンピューター将棋では、置換表を実装してあると思うので、それを使って同一局面が4回出現したかどうかを比較することになります。
つまり、CSAファイル読み込みのために指し手生成やら、置換表やらが必要になって、「CSAファイルの読み込み部がきちんと動いているなら、コンピューター将棋プログラムの1/3ぐらいは書けていることになるのではないか?」と思ったりもします。