按照五子棋规则,当一方的棋子,在横向,纵向或斜向连续五个均为同一用户的棋子时,代表胜利。
另外,胜利判断只需要在一个新子落子时判断,且仅需要判断新子所在的四条线上(纵横加两个斜线)是否满足条件即可。
所以,可以以新子坐标为基准点,判断四次。
比如横向的,需要判断左侧和右侧连续的同类棋子个数,如果左侧+右侧+1(自身)总数>=5,则为胜利。
参考代码如下:
static int map[100][100]; // 全局变量棋盘。未下子时值为0,下子时值为1或2,区分下子人。
int check_win(int m, int n)
{
int total = 1;
int i;
for(i = m-1; i >= 0; i --)//统计同行左侧连续同样棋子个数。
if(map[i][n] == map[m][n]) total++;
else break;
for(i = m+1; i < 100; i ++)//统计同行右侧连续同样棋子个数。
if(map[i][n] == map[m][n]) total++;
else break;
if(total>=5) return 1;//胜利。
return 0; //没有胜利。
}
其它类似。
#include
#include
void graph();
void chooseONE(int row,int col);
void chooseTWO(int row,int col);
int dra(int row,int col);
int win(int row, int col);
int arr[100][100]={0};
int row=0;
int col=0;
int i=0;
int j=0;
int m=0,n=0;
int ro=0,co=0;
int time=0;
int fico=0,firo=0;
int five=0;
int fi=0;
int out=0;
int a=0,b=0,c=0 ;
int NUM1=0; //纪录玩家1赢的次数
int NUM2=0; //纪录玩家2赢的次数
void main()
{char type='\n';
while (type=='\n')
{
int draw=0;
printf("请输入你想要的棋盘大小 5~20\n");
printf(" 直的需要几个\n");
scanf("%d",&j);
printf("横的需要几个\n");
scanf("%d",&i); //防呆
while(i<5||i>20||j>20||j<5)
{
printf("输入错误请重新输入\n");
printf(" 直的需要几个\n");
scanf("%d",&j);
printf("横的需要几个\n");
scanf("%d",&i);
}
graph();
out=win(j,i);
draw=dra(j,i);
while(out!=1||draw==1)
{
time++;
if(time%2!=0)
{
chooseONE(i,j);
}
else
chooseTWO(i,j);
graph();
out=win(j,i);
draw=dra(j,i);
}
system("pause");
if(out==0&&draw==1)printf("和局:NUM1=%d,NUM2=%d",NUM1,NUM2);
else
{
if(time%2!=0)NUM2++;
else NUM1++;
printf("NUM1=%d,NUM2=%d\n",NUM1,NUM2);
type=getchar();
}
}
}
void graph()
{
for(row=1;row<=i;row++)
{
for(col=1;col<=j;col++)
{
if(arr[row][col]==1)
printf("%c ",01);
if(arr[row][col]==2)
printf("%c ",02);
if(arr[row][col]==0)
printf("o ");
}
printf("\n");
}
}
void chooseONE(int row,int col)
{
printf("第一玩家请选择下棋位置\n");
printf("第几个直的\n");
scanf("%d",&co);
printf("第几个横的\n");
scanf("%d",&ro);
while(arr[ro][co]==1||arr[ro][co]==2)
{
printf("重复了!!!\n");
printf("第几个直的\n");
scanf("%d",&co);
printf("第几个横的\n");
scanf("%d",&ro);
}
while(ro>row||ro<1||co>col||co<1)
{
printf("输入错误!!!\n");
printf("第几个直的\n");
scanf("%d",&co);
printf("第几个横的\n");
scanf("%d",&ro);
}
arr[ro][co]=1;
}
void chooseTWO(int row,int col)
{
printf("第二玩家请选择下棋位置\n");
printf("第几个直的\n");
scanf("%d",&co);
printf("第几个横的\n");
scanf("%d",&ro);
while(arr[ro][co]==1||arr[ro][co]==2)
{
printf("重复了!!!\n");
printf("第几个直的\n");
scanf("%d",&co);
printf("第几个横的\n");
scanf("%d",&ro);
}
while(ro>row||ro<1||co>col||co<1)
{
printf("输入错误!!!\n");
printf("第几个直的\n");
scanf("%d",&co);
printf("第几个横的\n");
scanf("%d",&ro);
}
arr[ro][co]=2;
}
int win(int row, int col)
{ //胜利函式
int k = 0,l = 0;
int flag = 0; //胜利标记
for(k=2;k
if(arr[k][l]!=0&&arr[k-2][l-2]==arr[k][l]&&arr[k-1][l-1]==arr[k][l]&&arr[k+1][l+1]==arr[k][l]&&arr[k+2][l+2]==arr[k][l])
{flag=1;break;}
if(arr[k][l]!=0&&arr[k+2][l-2]==arr[k][l]&&arr[k+1][l-1]==arr[k][l]&&arr[k-1][l+1]==arr[k][l]&&arr[k-2][l+2]==arr[k][l])
{flag=1;break;}
}
if(flag==0) //两斜线,无胜情况下,判断直线
for(k=0;k
if(arr[k][l]!=0&&arr[k][l-2]==arr[k][l]&&arr[k][l-1]==arr[k][l]&&arr[k][l+1]==arr[k][l]&&arr[k][l+2]==arr[k][l])
{flag=1;break;}
}
if(flag==0) //两斜线及直线无胜情况下,判断横线
for(k=2;k
if(arr[k][l]!=0&&arr[k+2][l]==arr[k][l]&&arr[k+1][l]==arr[k][l]&&arr[k-1][l]==arr[k][l]&&arr[k-2][l]==arr[k][l])
{flag=1;break;}
}
return flag; //返回判断结果,有胜为1,无为0,谁胜无必要判断,因为,谁尾手了的一定是胜的。
}
int dra(int row,int col)
{
int i,j,draw=1;
for(i=0;i
return draw;
}
我将其改成这样,你看能否看明白,不懂还可以再问
呵呵
dra函式是用来判断是不是和局。
关于不能清屏,我教你个方法,把main 函数的那个大循环去掉,再把NUM1和NM2的存储形式改为static。那样就可以在清屏后不会连数据也清了。
崇拜~~
你们都是高手,我也学过C怎么就遍布出来呢!!