Bonanzaの王手生成
上の局面で、後手玉は詰まないことは簡単に分かるけれど、
Bonanzaのdf-pnは詰みと判定します。
以下、Bonanzaの王手生成で、香車が成る手を生成するところ。
bb_piece = BB_BLANCE; while( BBTest( bb_piece ) ) { from = LastOne( bb_piece ); Xor( from, bb_piece ); bb_chk.p[0] = abb_w_gold_attacks[sq_wk].p[0]; bb_chk.p[1] = bb_chk.p[2] = 0; idirec = (int)adirec[sq_wk][from]; if ( idirec && is_pinned_on_white_king( ptree, from, idirec ) ) { add_behind_attacks( &bb_chk, idirec, sq_wk ); } BBAnd( bb_chk, bb_chk, AttackFile( from ) ); BBAnd( bb_chk, bb_chk, abb_minus_rays[from] ); BBAnd( bb_chk, bb_chk, bb_move_to ); while( BBTest( bb_chk ) ) { to = LastOne( bb_chk ); Xor( to, bb_chk ); *pmove++ = To2Move(to) | From2Move(from) | Piece2Move(lance) | Cap2Move(-BOARD[to]) | FLAG_PROMO; } }
add_behind_attacks( &bb_chk, idirec, sq_wk );
と
BBAnd()
で空き王手になるときの香車の移動先の位置をbb_chkに格納しています。
で、その後は香車の移動先が敵陣かどうかを判定せずに、
香車の成りの手を生成しています。
FLAG_PROMOが成りを表しています。
よって、Bonanzaは上記局面を▲2七香成で詰むと判断します。
ということで、空き王手の部分は以下のように修正した方が良いように思います。
from = LastOne( bb_piece ); Xor( from, bb_piece ); idirec = (int)adirec[sq_wk][from]; if ( idirec && is_pinned_on_white_king( ptree, from, idirec ) ) { add_behind_attacks( &bb_chk, idirec, sq_wk ); } else { bb_chk.p[0] = abb_w_gold_attacks[sq_wk].p[0]; } bb_chk.p[1] = bb_chk.p[2] = 0;
この関数は3手詰めルーチンでも呼ばれているのですが、
通常探索時に実際にこの手を指すことはなかったので、
非合法手はうまい具合に指さないようになっている様子。
dfpn server を動作させたときも大丈夫なのかな?
と、全体的な事情がよく分からないけれど、
とりあえずバグ報告しておいた。
追記
返信頂いた。やっぱりバグらしい。