sakurapyon’s blog

sakurapyon’s blog

成れるかどうかの判定

れさぴょんでは、成れる駒かどうかを示す配列と移動元移動先の段数の比較により成りを判定している。
移動する手の生成のときに毎回呼ばれるんで、ちょっとでも高速化しておきたい。

(うさぴょんもだいたい同じロジック。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);
}