詰め

長らくオセロを放置していたことを思い出したので、ソース公開に向けて最後のつめを。move ordering 戦略を iterator で抽象化してみる。iterator じゃなくて高階関数でやりたいけど、まぁいいか。意外とうまくまとまった。

あとは、置換表か。置換表は、結局 alpha, beta 値の初期値を与えるということで OK? 置換表戦略も抽象化できそうだが、あとは template にするか virtual にするか。オーバーヘッドは少し怖い。

探索戦略も抽象化できないだろうか。結局、こんな感じになるんだろうか。NegaScout と Mtd(f)をうまく抽象化できるかなぁ。

 var a, b = init_alpha_beta(board, alpha, beta); // 置換表
 var it = new_movable_iterator(); // move ordering
 while (it.has_next()) {
  var next = it.get_next();
  a = max(a, -alpha_beta(next, a, b)); // 探索戦略
  if (b <= a)
    break; // cut
  it.go_next();
 }
 save_alpha_beta(board, a, b); // 置換表

雰囲気だけ。深さに応じて、3つの戦略を template で選べるようにすればいいのかな?