高速一手詰め関数を作ろう(と思う)

と思います。
静止探索で呼び出せば末端が安定するでしょうし、通常探索でも安定すると思う。Bonanzaも呼び出してるようだし(ボナチル?)
内藤國雄さんの必至入門書には、1手詰めは詰め将棋の基本と書いてあった。


進歩本に山下さんが手法を解説していた。そのへんをベースに考えてみようと思います。
既に、bitboard向けの王手時の応手生成ルーチンを作ってるので考え方は近いと思います。


(1)王の周囲の移動可能マスを求める(敵利きの無い空白)
(2)駒打もしくは駒移動で、(1)の移動可能マスをすべて埋める手を探す(もちろん王手なので王にも利きがいる)
   ただし移動場所には自分側の利きがあり(王に取られないため)、かつ、王以外の敵駒から取られない(敵利きが王からの利きのみ)
(3)駒打・移動で、自分の飛び利きを消してしまって、
   移動不可能マスが移動可能なマスになってしまう場合があるので、
   実際に打ってみて、王の応手が0になっているか調べる。


bitboardでは1は簡単。2も駒毎の利きマスクを持ってるので、それとORすればいい。
ここまで判れば、3まで来ることはほとんど無いので、以下は多少時間がかかったも無駄になることは少ない。
実際に駒を置いてみて、応手ルーチンを呼び出す。


王手には、移動王手、駒打王手、遮られた飛び利きを通す空き王手と三種類あるが、
移動王手は、敵王の8近傍への空きマスへの移動で、かつその空きマスには自分の利きがないといけない。それが(2)への候補。
駒打王手は、同じく敵王8近傍への自分の利きのある空きマスへ持っている駒のマスクが逃げ場を塞ぐ場合を調べ、(2)を調べる。


問題は飛び利きでの王手で、これは面倒なんで、考えないでもイイカモ( ´Д`)
8近傍にベタ打する場合は、小駒と同じ考え方でいいと思う。
桂馬は間に駒がいてもいいので、小駒と同じ考え方。王手するには打てる場所は二カ所しかない(そこに敵利きが無い場合のみ)


離れて王手する場合は、王からの飛び利きが通っているビットと飛び駒の利きをANDして、
それが敵王の移動可能マスとANDして、移動可能マスと同一になっていれば、すべて塞いでいるので、(2)の候補になる。
うわーやっぱ飛び駒面倒くさい(^^;
考慮がいるのは、王が移動できないとしても、他の駒が利きを塞ぐ、もしくは飛び駒をとってしまってはダメ。


作ってチェックするだけで何時間もかかりそう……_| ̄|○