五子棋规则的判断:
byte CFive::Judge(byte num)
{
byte len,chong4a,huo3,chong4,longl,i,x=movelog[num].x,y=movelog[num].y;
int x1,y1,x2;
rule line[4];
huo3=chong4=longl=0;
for(i=0;i<=16;i++)
{
line[0].r_line[i]=board[i][y];
line[1].r_line[i]=board[x][i];
}
line[0].r_current=x;
line[1].r_current=y;
//line[2]---------------------------
i=0;
while(board[x-i][y-i]!=6) //6:F_BIAN
i++;
x1=x-i;
y1=y-i;
i=0;
while(board[x+i][y+i]!=6) //6:F_BIAN
i++;
x2=x+i;
for(i=0;i<(x2-x1);i++)
line[2].r_line[i]=board[x1+i][y1+i];
line[2].r_current=x-x1;
//line[3]---------------------------
i=0;
while(board[x-i][y+i]!=6) //6:F_BIAN
i++;
x1=x-i;
y1=y+i;
i=0;
while(board[x+i][y-i]!=6) //6:F_BIAN
i++;
x2=x+i;
for(i=0;i<(x2-x1);i++)
line[3].r_line[i]=board[x1+i][y1-i];
line[3].r_current=x-x1;
for(i=0;i<4;i++)
{
len=Length(line[i].r_line,line[i].r_current);
if(num%2==0) //now is black stone
{
chong4a=four_4(line[i].r_line,line[i].r_current);
if(len==5)
return BLACK_WIN;
if(len>5)
longl++;
if(chong4a>=1)
{
if(chong4a==2&&len==3)
chong4+=2;
if(chong4a==1)
chong4++;
if(chong4a==2&&len==4)
chong4++;
}
if(chong4a==0)
huo3+=findhou3(line[i].r_line,line[i].r_current);
}
else //now is white stone
if(len>=5)
return WHITE_WIN;
}
if(huo3>=2¦¦chong4>=2¦¦longl>=1)
return JIN_SHOU;
if((huo3<2&&chong4<2)¦¦num%2!=0)
return HE_FA;
}byte CFive::Length(byte aline[17], byte current)
{
byte i,j,color,line[17];
for(i=0;i<17;i++)
line[i]=aline[i];
i=j=0;
color=line[current];
while(line[current-i-1]==color)
i++;
while(line[current+j+1]==color)
j++;
return i+j+1;
}byte CFive::PutWhite(byte aline[17], byte current)
{
byte i,j,left,right,line[17];
for(i=0;i<17;i++)
line[i]=aline[i];
left=right=i=j=0;
//left:
while(line[current-i-1]==1) //1:F_BLACK
i++;
if(line[current-i-1]==0) //0:F_EMPTY
{
line[current-i-1]=F_WHITE;
left=PutBlack(line,current);
line[current-i-1]=F_EMPTY;
}
//right
while(line[current+j+1]==1) //1:F_BLACK
j++;
if(line[current+j+1]==0) //0:F_EMPTY
{
line[current+j+1]=F_WHITE;
right=PutBlack(line,current);
}
return left+right;
}byte CFive::PutBlack(byte aline[17], byte current)
{
byte i,j,left,right,line[17];
for(i=0;i<17;i++)
line[i]=aline[i];
left=right=i=j=0;
//left:
while(line[current-i-1]==1) //1:F_BLACK
i++;
if(line[current-i-1]==0) //0:F_EMPTY
{
line[current-i-1]=F_BLACK;
if(Length(line,current)==5)
left=1;
else
left=PutWhite(line,current);
line[current-i-1]=F_EMPTY;
}
//right
while(line[current+j+1]==1) //1:F_BLACK
j++;
if(line[current+j+1]==0) //0:F_EMPTY
{
line[current+j+1]=F_BLACK;
if(Length(line,current)==5)
right=1;
else
right=PutWhite(line,current);
}
return left+right;
}byte CFive::four_4(byte aline[17], byte current)
{
byte i,j,num,m,n,line[17];
for(i=0;i<17;i++)
line[i]=aline[i];
num=i=j=0;
//left
m=line[current-1];
n=line[current];
while(line[current-i-1]==1) //1:F_BLACK
i++;
if(line[current-i-1]==0) //0:F_EMPTY
{
line[current-i-1]=F_BLACK;
if(Length(line,current)==5)
num++;
line[current-i-1]=F_EMPTY;
}
//right
while(line[current+j+1]==1) //1:F_BLACK
j++;
if(line[current+j+1]==0) //0:F_EMPTY
{
line[current+j+1]=F_BLACK;
if(Length(line,current)==5)
num++;
}
return num;
}byte CFive::findhou3(byte aline[17], byte current)
{
byte i,j,left,n,right,line[17];
for(i=0;i<17;i++)
line[i]=aline[i];
left=right=i=j=n=0;
//left:
while(line[current-i-1]==1) //1:F_BLACK
i++;
if(line[current-i-1]==0) //0:F_EMPTY
{
line[current-i-1]=F_BLACK;
left=PutWhite(line,current);
line[current-i-1]=F_EMPTY;
}
//right
while(line[current+j+1]==1) //1:F_BLACK
j++;
if(line[current+j+1]==0) //0:F_EMPTY
{
line[current+j+1]=F_BLACK;
right=PutWhite(line,current);
}
if(left>=2¦¦right>=2)
n++;
return n;
}
byte CFive::Judge(byte num)
{
byte len,chong4a,huo3,chong4,longl,i,x=movelog[num].x,y=movelog[num].y;
int x1,y1,x2;
rule line[4];
huo3=chong4=longl=0;
for(i=0;i<=16;i++)
{
line[0].r_line[i]=board[i][y];
line[1].r_line[i]=board[x][i];
}
line[0].r_current=x;
line[1].r_current=y;
//line[2]---------------------------
i=0;
while(board[x-i][y-i]!=6) //6:F_BIAN
i++;
x1=x-i;
y1=y-i;
i=0;
while(board[x+i][y+i]!=6) //6:F_BIAN
i++;
x2=x+i;
for(i=0;i<(x2-x1);i++)
line[2].r_line[i]=board[x1+i][y1+i];
line[2].r_current=x-x1;
//line[3]---------------------------
i=0;
while(board[x-i][y+i]!=6) //6:F_BIAN
i++;
x1=x-i;
y1=y+i;
i=0;
while(board[x+i][y-i]!=6) //6:F_BIAN
i++;
x2=x+i;
for(i=0;i<(x2-x1);i++)
line[3].r_line[i]=board[x1+i][y1-i];
line[3].r_current=x-x1;
for(i=0;i<4;i++)
{
len=Length(line[i].r_line,line[i].r_current);
if(num%2==0) //now is black stone
{
chong4a=four_4(line[i].r_line,line[i].r_current);
if(len==5)
return BLACK_WIN;
if(len>5)
longl++;
if(chong4a>=1)
{
if(chong4a==2&&len==3)
chong4+=2;
if(chong4a==1)
chong4++;
if(chong4a==2&&len==4)
chong4++;
}
if(chong4a==0)
huo3+=findhou3(line[i].r_line,line[i].r_current);
}
else //now is white stone
if(len>=5)
return WHITE_WIN;
}
if(huo3>=2¦¦chong4>=2¦¦longl>=1)
return JIN_SHOU;
if((huo3<2&&chong4<2)¦¦num%2!=0)
return HE_FA;
}byte CFive::Length(byte aline[17], byte current)
{
byte i,j,color,line[17];
for(i=0;i<17;i++)
line[i]=aline[i];
i=j=0;
color=line[current];
while(line[current-i-1]==color)
i++;
while(line[current+j+1]==color)
j++;
return i+j+1;
}byte CFive::PutWhite(byte aline[17], byte current)
{
byte i,j,left,right,line[17];
for(i=0;i<17;i++)
line[i]=aline[i];
left=right=i=j=0;
//left:
while(line[current-i-1]==1) //1:F_BLACK
i++;
if(line[current-i-1]==0) //0:F_EMPTY
{
line[current-i-1]=F_WHITE;
left=PutBlack(line,current);
line[current-i-1]=F_EMPTY;
}
//right
while(line[current+j+1]==1) //1:F_BLACK
j++;
if(line[current+j+1]==0) //0:F_EMPTY
{
line[current+j+1]=F_WHITE;
right=PutBlack(line,current);
}
return left+right;
}byte CFive::PutBlack(byte aline[17], byte current)
{
byte i,j,left,right,line[17];
for(i=0;i<17;i++)
line[i]=aline[i];
left=right=i=j=0;
//left:
while(line[current-i-1]==1) //1:F_BLACK
i++;
if(line[current-i-1]==0) //0:F_EMPTY
{
line[current-i-1]=F_BLACK;
if(Length(line,current)==5)
left=1;
else
left=PutWhite(line,current);
line[current-i-1]=F_EMPTY;
}
//right
while(line[current+j+1]==1) //1:F_BLACK
j++;
if(line[current+j+1]==0) //0:F_EMPTY
{
line[current+j+1]=F_BLACK;
if(Length(line,current)==5)
right=1;
else
right=PutWhite(line,current);
}
return left+right;
}byte CFive::four_4(byte aline[17], byte current)
{
byte i,j,num,m,n,line[17];
for(i=0;i<17;i++)
line[i]=aline[i];
num=i=j=0;
//left
m=line[current-1];
n=line[current];
while(line[current-i-1]==1) //1:F_BLACK
i++;
if(line[current-i-1]==0) //0:F_EMPTY
{
line[current-i-1]=F_BLACK;
if(Length(line,current)==5)
num++;
line[current-i-1]=F_EMPTY;
}
//right
while(line[current+j+1]==1) //1:F_BLACK
j++;
if(line[current+j+1]==0) //0:F_EMPTY
{
line[current+j+1]=F_BLACK;
if(Length(line,current)==5)
num++;
}
return num;
}byte CFive::findhou3(byte aline[17], byte current)
{
byte i,j,left,n,right,line[17];
for(i=0;i<17;i++)
line[i]=aline[i];
left=right=i=j=n=0;
//left:
while(line[current-i-1]==1) //1:F_BLACK
i++;
if(line[current-i-1]==0) //0:F_EMPTY
{
line[current-i-1]=F_BLACK;
left=PutWhite(line,current);
line[current-i-1]=F_EMPTY;
}
//right
while(line[current+j+1]==1) //1:F_BLACK
j++;
if(line[current+j+1]==0) //0:F_EMPTY
{
line[current+j+1]=F_BLACK;
right=PutWhite(line,current);
}
if(left>=2¦¦right>=2)
n++;
return n;
}
解决方案 »
- VC中如何进行【基址】和【偏移地址】相加 ?????
- 404,我真的不懂
- 在GDI+中,如何将一个bitmap的数据拷贝到另外一个bitmap中?
- vs2003中无法打开包含文件:fstream.h
- 谁给个ListBox控件操作的例子 SDK程序
- 请问怎样为对话条的按钮添加消息处理
- 请问高手,用MFC ODBC,在程序中动态注册ODBC,或直接指名路径调用数据库呢?
- 如何判断鼠标是否出了对话框?
- 初学简单问题:这个create函数参数的意义是什么。
- 怎样在制作VC向导程序的时候加入编译器设置
- 如何获取一个DLL或者EXE文件中的 光标,位图等的资源信息?以及如何使用他们?
- 大菜鸟的问题:我就是不信---有几万VC编程者的CSDN就没有人给出解决这个问题的建议?
{
byte r_current,r_line[17];
};struct pos
{
byte x,y;
};
class CFive
{
public:
void InitValue();
void Start();
byte Repent();
byte Put(byte x,byte y);
CFive();
virtual ~CFive();
byte board[17][17];
pos movelog[225];
byte m_current;
private:
byte Judge(byte num);
byte findhou3(byte aline[], byte current);
byte four_4(byte aline[], byte current);
byte PutBlack(byte aline[], byte current);
byte PutWhite(byte aline[],byte current);
byte Length(byte line[],byte current);
};
{
byte r_current,r_line[17]; //r_current:当前子在串中的位置,r_line[17]:串
};struct pos
{
byte x,y; //不用说了
};
class CFive
{
public:
void InitValue();
void Start();
byte Repent();
byte Put(byte x,byte y);
CFive();
virtual ~CFive();
byte board[17][17]; //棋盘
pos movelog[225];
byte m_current;
private:
byte Judge(byte num); //判断,返回:禁手(对黑的而言),胜
byte findhou3(byte aline[], byte current); //返回有几个活三
byte four_4(byte aline[], byte current); //有几个冲四
byte PutBlack(byte aline[], byte current); //放黑子(间接递归函数)
byte PutWhite(byte aline[],byte current); //放白子(间接递归函数)
byte Length(byte line[],byte current); //返回当前串的长度
};