1手で反転されうる石

反転可能石


オセロ局面 状態評価 ルーチンで使用するのに便利な、
着手可能石と、その着手で反転されて着手者側のものになる石とを
一気に求めるルーチンです。

このルーチンで求めたビット列を「1手で反転されうる石」と呼ぶとして、
相手側の準確定石等と呼ばれる石は、
(相手側の石の内、1手では反転できない石)
=((相手側のボード)& ((相手側のボード)xor (1手で反転されうる石))
と、簡単に求めることができます。

誰か、モット 早いのを、よろしく。


/*unsigned char [8]形式で、白石または黒石の所在を保持するビット列を引数にして、
   着手可能数を戻り値として返しつつ、着手可能石または1手で反転可能な石をを示すビット配列を返す関数*/

int pscan10(unsigned char *pbo,	/*着手者側のボード へのポインタ*/
unsigned char *pbt,	/*相手側のボード へのポインタ*/
unsigned char *abo)	/*着手可能石または、その着手で着手者側の石になる石を示すビット配列*/
{  /* scan 1 level */
  unsigned char nos[8];
  unsigned char tb1[8];
  unsigned char *rp;
  unsigned int m;
  ypos y,y2;
  int d,d2;
  int turn;
  turn=0;
  for(y=0;y<8;y++)nos[y]= ~ ((boad->b[y]) | (boad->w[y]));
  {
     	            /* x-1,1+y */
     for(y=0;y<7;y++){
        tb1[y] = (pbt[y]) & (pbo[1+y]<<1);
     }
     for(d=2;d<8;d++){
        for(y=0;y< (8-d);y++){
           m= nos[y]& (tb1[y]=tb1[1+y]<<1);
    for(rp= &(abo[y]),d2=d;m&&d2;rp++,m>>=1,d2--){*rp |=m;turn++;}
    tb1[y]&= pbt[y];
        }
     }
  }
  {
                      /* x  ,1+y */
     for(y=0;y<7;y++){
        tb1[y]= (pbt[y])&(pbo[1+y])  ;
     }
     for(d=2;d<8;d++){
        for(y=0;y< (8-d);y++){
           m= nos[y]& (tb1[y]=tb1[1+y]   );
           for(rp= &(abo[y]),d2=d;m&&d2;rp++,      d2--){*rp |=m;turn++;}
           tb1[y]&= pbt[y];
        }
     }
  }
  {
                      /* x+1,1+y */
     for(y=0;y<7;y++){
        tb1[y]=(pbt[y])&(pbo[1+y]>>1);
     }
     for(d=2;d<8;d++){
        for(y=0;y< (8-d);y++){
           m= nos[y]& (tb1[y]=tb1[1+y]>>1);
           for(rp= &(abo[y]),d2=d;m&&d2;rp++,m<<=1,d2--){*rp |=m;turn++;}
           tb1[y]&= pbt[y];
        }
     }
  }
  {
                      /* x+1,y-1 */
     for(y=7;y>0;y--){
        tb1[y] =(pbt[y])&(pbo[y-1]>>1);
     }
     for(d=2;d<8;d++){
        for(y=7;y>=(  d);y--){
           m= nos[y]& (tb1[y]=tb1[y-1]>>1);
           for(rp= &(abo[y]),d2=d;m&&d2;rp--,m<<=1,d2--){*rp |=m;turn++;}
           tb1[y]&= pbt[y];
        }
     }
  }
  {
                     /* x  ,y-1 */
     for(y=7;y>0;y--){
        tb1[y] =(pbt[y])&(pbo[y-1])   ;
     }
     for(d=2;d<8;d++){
        for(y=7;y>=(  d);y--){
           m= nos[y]& (tb1[y]=tb1[y-1]   );
           for(rp= &(abo[y]),d2=d;m&&d2;rp--,      d2--){*rp |=m;turn++;}
           tb1[y]&= pbt[y];
        }
     }
  }
  {
     	            /* x-1,y-1 */
     for(y=7;y>0;y--){
        tb1[y] =(pbt[y])&(pbo[y-1]<<1);
     }
     for(d=2;d<8;d++){
        for(y=7;y>=(  d);y--){
           m= nos[y]& (tb1[y]=tb1[y-1]<<1);
           for(rp= &(abo[y]),d2=d;m&&d2;rp--,m>>=1,d2--){*rp |=m;turn++;}
           tb1[y]&= pbt[y];
        }
     }
  }
  {
                      /* x+1,y   */
     for(y=7;y>=  0 ;y--){
        tb1[y] =(pbt[y])&(pbo[y  ]>>1);
     }
     for(d=2;d<8;d++){
        for(y=7;y>=  0 ;y--){
    m= nos[y]& (tb1[y]=tb1[y  ]>>1);
    if(m){
              abo[y]|= (m<<d)-m;
       turn++;
    }
           tb1[y]&= pbt[y];
        }
     }
  }
  {
                      /* x-1,y   */
     for(y=0;y<=7;y++){
        tb1[y] =(pbt[y])&(pbo[y  ]<<1);
     }
     for(d=2;d<8;d++){
        for(y=0;y<=7;y++){
           m= nos[y]& (tb1[y]=tb1[y  ]<<1);
           if(m){
       abo[y]|= m+m-(m>>(d-1));
       turn++;
    }
           tb1[y]&= pbt[y];
        }
     }
  }
  return turn;
}
/* ココマデ*/
+ タグ編集
  • タグ:
  • オセロ
  • 反転可能石
  • 準確定石
  • 着手可能石

このサイトはreCAPTCHAによって保護されており、Googleの プライバシーポリシー利用規約 が適用されます。

最終更新:2006年09月28日 00:32
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。