静止探索を読もう
深さとか考慮して1手詰めを読んでますね
3手詰め読みは探索が終わって戻る前でやっている
MakeMove( turn, MOVE_CURR, ply ); if ( InCheck(turn) ) { UnMakeMove( turn, MOVE_CURR, ply ); continue; }
移動してから自王に詰みがないか確認して自殺なら戻している
ということは手生成時に自殺手を除外していないってことか。
考えてみたら、探索で差すかどうかも解らない手の自殺手確認までしてたらもったいないかも
(ただ、手の数が水増しになるので、one_replyとかややこしくなる)
昔は手生成でかならず確認していて遅かったけど、今はpinを使って除外してるけど、
探索時に除外するのが効率良いのかも。ある意味、基本的な所で自分は間違っていたかも orz
(までも逐次生成をやってないので、手が増えるとオーダリングに時間もとられるし、作り方次第かな)
差分利きをやってないbonaがinCheckをどういう風に高速に処理しているか読んでみます。
attack.cの中でis_white_attacked関数で判定していた。
な、なるほど!
判定するマスに対する利きを全bitboardからorしてやっている。
なにも全体の利き情報はいらない。
差分利きがないし、かといえbitboard利きを求めるのもそれなりにコストがいるので
1マスだけの利きを求めるのはコストが安い。
うー参考になった(T_T)保木さんありがとう!
if ( qui_ply >= QUIES_PLY_LIMIT && ( ( UToCap(move) == pawn && ! I2IsPromote(move) ) || ( ! UToCap(move) && I2PieceMove(move) != pawn ) ) )
深いところで手を減らす奴ですね