成れるかどうかの判定
れさぴょんでは、成れる駒かどうかを示す配列と移動元移動先の段数の比較により成りを判定している。
移動する手の生成のときに毎回呼ばれるんで、ちょっとでも高速化しておきたい。
(うさぴょんもだいたい同じロジック。id:usapyon さんが高速化してないってことはあまり意味が無いのかな?)
// 成ることが出来る駒か? int CanPromote[]={ // 空空空空空空空空空空空空空空空空空歩香桂銀金角飛王と杏圭全金馬龍 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,1,1,0,0,0,0,0,0,0,0, // 空歩香桂銀金角飛王と杏圭全金馬龍壁空空空空空空空空空空空空空空空 0,1,1,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }; : if (SorE==SELF && (fromDan<=3 || dan <=3) && CanPromote[ban[from]]) { teTop[teNum++]=Te(from,to,ban[from],ban[to],1); } else if (SorE==ENEMY && (fromDan>=7 || dan>=7) && CanPromote[ban[from]]){ teTop[teNum++]=Te(from,to,ban[from],ban[to],1); }
1つの駒が成れるのかの判定のためにこれだけ条件比較をするのはもったいないので、なんとかできないか考えてみた。
配列参照が増えちゃうんだよなあ。どっちがいいんだろ。pDanの参照も64bit変数に押し込むことはできそうだが...
static const unsigned char pDan[] = { 0,0,0,0, 0,0,0, 0,0,0, 0,0,0,0,0,0, 0,1,1,1, 0,0,0, 0,0,0, 0,0,0,0,0,0, //ENEMY 0,0,0,0, 0,0,0, 1,1,1, 0,0,0,0,0,0 };//SELF inline int canPromote(int SorE,int pos,int pos2, KomaInf koma) { const uint64 CanPromote = 0x000000de00de00de; if ((CanPromote&(1ULL<<koma))==0) return 0; return canPromote(SorE,pos,pos2); }