2012/07/28
■ Bitboardによる手の生成(駒を取る手)
駒を取る銀の手の生成。隣接手は簡単。
target=p->bitboard[WHITE][P_OCCUPY]; // 相手駒の位置 org=p->bitboard[BLACK][piece]; while ( test128(org) ) { // 駒がある from=bit_fscan(&org); // 駒位置 bit_reset(org,from); // 駒を消す t.x=and128(attack_gin_b[from],target); // 先手銀の利きのbitboardを押し付ける while ( test128(t) ) { // 利きのある数 to=bit_fscan(&t); // 移動先の位置 bit_reset(t,to); // 移動先を消す pin_check() 手の格納 } }
飛び駒の取る手生成には、邪魔駒の判定が必要(相手駒へ利きがあるか)。
target=p->bitboard[WHITE][P_OCCUPY]; // 相手駒の位置 t.x=and128(slider_attack[from],target); // 先手飛び駒の利きのbitboardを押し付ける while ( test128(t) ) { // 利きのある数 to=bit_fscan(&t); // 移動先の位置 bit_reset(t,to); // 移動先を消す t.x=and128(slider_attack[from],slider_opposite[to]); // 間の枡を抽出 if ( !andtest128(t,p->occ) ) { // 邪魔駒が無い pin_check() 手の格納 } }