KPP評価部分
以下のようにして、listを作成した後、例のlist加算で評価できます。
(ボナンザのソースを見たことがある方はピンとくると思います)
for(pos = 0;pos < 81;pos++) { koma = in.kifu[pos];// 駒種 switch(koma) { case KOMA_FU:// 先手 歩 // KKP加算 ret = ret + kkp[sq_bk0][sq_wk0][kkp_pawn + pos]; // list追加 list0[nlist] = f_pawn + pos; list1[nlist++] = e_pawn + Inv(pos); break; case -KOMA_FU:// 後手 歩 ret = ret - kkp[sq_bk1][sq_wk1][kkp_pawn + Inv(pos)]; list0[nlist] = e_pawn + pos; list1[nlist++] = f_pawn + Inv(pos); break; case KOMA_KY:// 先手 香 ret = ret + kkp[sq_bk0][sq_wk0][kkp_lance + pos]; list0[nlist] = f_lance + pos; list1[nlist++] = e_lance + Inv(pos); break; 以下、同様
例の部分。
sum = 0; for ( i = 0; i < nlist; i++ ) { k0 = list0[i]; k1 = list1[i]; for ( j = 0; j <= i; j++ ) { l0 = list0[j]; l1 = list1[j]; sum += PcPcOnSq2( sq_bk0, k0, l0 ); sum -= PcPcOnSq2( sq_bk1, k1, l1 ); } }
KPPの計算に関しては、むしろ配列版の方が81回のスキャンで済んで簡単なんじゃないかと思います。
これで、ボナンザのfv.binを使えばドーピングをしたかの如く、猛烈に強くなると思います。