探索木のvalidatorを書こう!! その7
前回の問題の解答を。
配列、Board[sq]上に先手玉が二つあるとき、1)〜10)のどこに引っかかるでしょうか。
Bonanzaでは、玉のBitboardというのは存在しなくて(BB_HDKのように他の駒と合成されたBitboardは存在する)、先手玉の位置はSQ_BKINGという変数(実体はdefineマクロですが)が保持しています。
ということは、盤上に先手玉が二つあっても、前回の10)の
if ( BOARD[SQ_BKING] != king ) { DOut( "SQ_BKING" ); }
このチェックは抜けてしまいます。
また、7)でBitboard同士の冗長性を確認しようにも、そもそも玉はBitboardとして持っていないのでこのチェックにも引っかからず…。
また同様にBitboardとBoard[sq]との整合性をチェックする8)もすり抜けてしまいそうです。それ以外にはチェックに引っかかりそうな項目はありません。
困ったようですが、8)に一つトリックがあって、BB_BKINGという玉の位置を表現するBitboardを即席で作ります。
次のマクロが用意されています。
#define BB_BKING (abb_mask[SQ_BKING])
ゆえに、8)のチェックで、王のBitboardとBoard[sq]との整合性がチェックできるということです。
自分でvalidatorを書くときに王が二つあるかのチェックは忘れてしまいがちなので注意を促すために書きました。
以上でBonanzaのvalidatorの解説は終わりです。