反転可能石
オセロ局面 状態評価 ルーチンで使用するのに便利な、
着手可能石と、その着手で反転されて着手者側のものになる石とを
一気に求めるルーチンです。
このルーチンで求めたビット列を「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;
}
/* ココマデ*/
最終更新:2006年09月28日 00:32