評価関数

int evalute()
{
 make_list()
 for(..)
 {
   PcOnSq()
 }
 score += sum;score /= FV_SCALE;
 score += MATERIAL;
 return turn ? -score:score
}


make_listの中身

  score += kkp[sq_bk0][sq_wk0][ kkp_hand_pawn   + I2HandPawn(HAND_B) ];

sq_bk0/wk0は王様の座標みたい。
王と王の位置で、持ち駒の評価を変えている? 

  n2 = 0;
  bb = BB_BPAWN;
  while ( BBToU(bb) ) {
    sq = first_one( bb );
    Xor( sq, bb );

    list0[nlist] = f_pawn + sq;
    list2[n2]    = e_pawn + Inv(sq);
    score += kkp[sq_bk0][sq_wk0][ kkp_pawn + sq ];
    nlist += 1;
    n2    += 1;
  }

Bitboard方式をやってない人には見慣れないと思いますが、
first_oneは初めにビットが立つ位置を見つける関数(きっとアセンブラ
歩兵のビットボードの初めにビットがたっている位置=sq
歩兵のビットボードとXorすると、sqの位置は0になり、他はOR
これは王と王による歩兵の位置評価みたいですね
kkp配列は、王と王による○○が格納されている学習評価関数らしい


make_listで評価した駒の数だけ(返値nlist)

	  sum += PcPcOnSq( sq_bk, k0, l0 );

sq_bkは王様位置なので
王様の位置毎に、駒と駒の位置を評価している(駒は先手後手混在)
これは3駒の位置評価で、隣接駒じゃなくて、すべての場合で駒と駒の位置評価?凄い

estimate_score_diff()
  diff  = -(int)PcOnSq( ibk, aipos[15+ipc_cap]+ito );

evaldiff.cではPcOnSqはこういう呼び方を
ibkはSQ_BKING


bitboardでも結局はbanとかboard配列いるよね。みたいな話だったと思うけど
bonaのevalではそういうのがない。
bitboardで駒の数x価値とすればmatrialは求まるし、
bitboardさえあれば、盤の配列はいらない。考えてみればたしかにそうだよね。盲点盲点 orz