//一个可以实现5~9棋盘格局的双人五子棋小游戏,
//新增了可以输入姓名,更改棋盘大小,当然,你想改6子棋,可以直接在开头的define里改N的值
//输入两个数字分别对应:行、列。(从1行1列开始,不包括0行!!!)
//代码如下
#include <stdio.h>
#define N 5
int main()
{
printf("********欢迎使用五子棋小程序********\n"); //下棋姓名
char n[2][20];
int i,j;//临时变量
for(i=0;i<2;i++)
{
printf("请输入第%d位选手姓名:",i+1);
scanf("%s",*(n+i));
printf("\n%s 做好准备!\n",*(n+i)); //两位选手
}
int size();//棋盘长度
int xyz(int size,char thexy[size][size]);//输出棋盘程序
int winCol(int size,char thexy[size][size]);//判断胜利
int size_m= size();//输出棋盘长宽表面文章
const int sizeN=size_m;
char thexy[sizeN][sizeN]; //棋盘储存
for(i=0;i<size_m;i++)//把xy格填满*
{
for(j=0;j<size_m;j++)
{
*(*(thexy+i)+j)='*';//thexy[i][j];
}
}
xyz(size_m,thexy);//定义并输出棋盘格局
printf("\n开始下棋!\n");
i=0;//1,2号玩家
int star=1;//裁判程序
int xy_s;//玩家输入
int x,y;//长宽
int win=0;//胜利条件
do//下棋程序
{
printf("\n%s玩家开始下棋\n",*(n+i));
if(i==0)
printf("你的棋子是“o”\n");
if(i==1)
printf("你的棋子是“x”\n");
printf("你下的棋子为(两位数):");
scanf("%d",&xy_s);//记录xy坐标
x= (xy_s/10)-1;//x坐标
y= (xy_s%10)-1;//y坐标
if(i==0)
{
if(thexy[x][y]=='*')//判断能否下棋
thexy[x][y]='o';//下棋程序 o
else
{
printf("请勿重复下棋\n");
continue;
}
}
else if(i==1)
{
if(thexy[x][y]=='*')//判断能否下棋
thexy[x][y]='x';//下棋程序 x
else
{
printf("请勿重复下棋\n");
continue;
}
}
win=winCol(size_m,thexy);//进行胜负判断
xyz(size_m,thexy);//输出棋盘格局
if(win==1)//胜利判断
{
printf("\n|---------------%s玩家获胜---------------|\n",*(n+0));
}
else if(win==2)//胜利判断
{
printf("\n|---------------%s玩家获胜---------------|\n",*(n+1));
}
if(win!=0)//
{
printf("\n开始下一局吗?(1 or 0)\n");
scanf("%d",&star);
if(star==1)//继续游戏
{
win =0;
int q,w;
for(q=0;q<size_m;q++)//把xy格填满*
{
for(w=0;w<size_m;w++)
{
*(*(thexy+q)+w)='*';//thexy[i][j];
}
}
xyz(size_m,thexy);//输出棋盘格局
}
}
i++;
if(i==2)i=0;//使i循环,轮到下一位下棋
}while(star!=0);
printf("\n_______________感谢你玩我的游戏!_______________\n");
}
int size()//棋盘长度
{
int size;
do{
printf("请输入棋盘格局(需要输入一个大于%d的数字):",N-1);
scanf("%d",&size);//自定义棋盘长宽
if(size<N)
{
printf("\n输入有误\n");
}
}while(size<N);
printf("\n棋盘格局为:%d*%d\n",size,size);
return size;
}
int xyz(int size,char thexy[size][size])//输出棋盘程序
{
int i,j;
printf(" ");
for(i=1;i<=size;i++)
{
printf("%d ",i); // 1~size长度
}
printf("\n");
for(i=0;i<size;i++)
{
for(j=0;j<size;j++)
{
if(j==0)
printf("%d ",i+1);
printf("%c ",thexy[i][j]);//输出xy的棋盘
}
printf("\n");
}
}
int winCol(int size,char thexy[size][size])//判断胜利条件
{
int i,j;//行,列
int x1,o1;
for(i=0;i<size;i++)//行检测
{
x1=0;
o1=0;
for(j=0;j<size;j++)
{
if(thexy[i][j]=='x')
{
o1=0;
x1=x1+1;
}
else if(thexy[i][j]=='o')
{
x1=0;
o1=o1+1;
}
else if(thexy[i][j]=='*')
{
x1=0;
o1=0;
}
if(x1==N)
return 2;
if(o1==N)
return 1;
}
}
for(i=0;i<size;i++)//列检测
{
x1=0;
o1=0;
for(j=0;j<size;j++)
{
if(thexy[j][i]=='x')
{
o1=0;
x1=x1+1;
}
else if(thexy[j][i]=='o')
{
x1=0;
o1=o1+1;
}
else if(thexy[j][i]=='*')
{
x1=0;
o1=0;
}
if(x1==N)
return 2;
if(o1==N)
return 1;
}
}
for(i=4;i<size;i++)//斜线 / 上检测
{
x1=0;
o1=0;
for(j=0;j<=i;j++)
{
if(thexy[i-j][j]=='x')
{
o1=0;
x1=x1+1;
}
else if(thexy[i-j][j]=='o')
{
x1=0;
o1=o1+1;
}
else if(thexy[i-j][j]=='*')
{
x1=0;
o1=0;
}
if(x1==N)
return 2;
if(o1==N)
return 1;
}
}
for(j=0;j<=size-5;j++)//斜线 \ 上检测
{
x1=0;
o1=0;
for(i=0;i<=size-j;i++)
{
if(thexy[i][j+i]=='x')
{
o1=0;
x1=x1+1;
}
else if(thexy[i][j+i]=='o')
{
x1=0;
o1=o1+1;
}
else if(thexy[i][j+i]=='*')
{
x1=0;
o1=0;
}
if(x1==N)
return 2;
if(o1==N)
return 1;
}
}
int xi=0;//下检测的加数
for(j=1;j<=size-5;j++)//斜线 / 下检测
{
x1=0;
o1=0;
xi=0;
for(i=size-1;i>=j;i--,xi++)
{
if(thexy[i][j+xi]=='x')
{
o1=0;
x1=x1+1;
}
else if(thexy[i][j+xi]=='o')
{
x1=0;
o1=o1+1;
}
else if(thexy[i][j+xi]=='*')
{
x1=0;
o1=0;
}
if(x1==N)
return 2;
if(o1==N)
return 1;
}
}
for(i=size-5;i>0;i--)//斜线 \ 下检测
{
x1=0;
o1=0;
xi=0;
for(j=0;j<=size-i;j++,xi++)
{
if(thexy[i+xi][j]=='x')
{
o1=0;
x1=x1+1;
}
else if(thexy[i+xi][j]=='o')
{
x1=0;
o1=o1+1;
}
else if(thexy[i+xi][j]=='*')
{
x1=0;
o1=0;
}
if(x1==N)
return 2;
if(o1==N)
return 1;
}
}
return 0;
}