c语言简易五子棋cmd程序代码

#include
#include
int panding(int i,int j,char q,char s[25][50])/*ab用来表示横竖坐标变化来判断是否相连*/
{
int a=0,b=0,a1=0,a2=0,a3=0,a4=0,p=0;/*a1a2a3a4分别代表四中量程五子的方向上连接的个数,a1横a2竖a3左下右上a4左上右下,p用来判断和返回*/
a=j;
b=i;
while(a>0&&a<25&&b>0&&b<25&&a<=j+3&&p==0)/*从当前所下的子为原点开始判断与其an的正与反方向有几个相同的子相连*/
{
if(s[24-b][a*2]==s[24-(b+1)][(a+1)*2])
{
a++;
b++;
a3++;
}
else
{
p=1;
}
}
a=j;
b=i;
p=0;
while(a>0&&a<25&&b>0&&b<25&&a>=j-3&&p==0)
{
if(s[24-b][a*2]==s[24-(b-1)][(a-1)*2])
{
a--;
b--;
a3++;
}
else
{
p=1;
}
}
a=j;
b=i;
p=0;
while(a>0&&a<25&&a<=j+3&&p==0)
{
if(s[24-b][a*2]==s[24-b][(a+1)*2])
{
a++;
a1++;
}
else
{
p=1;
}
}
a=j;
b=i;
p=0;
while(a>0&&a<25&&a>=j-3&&p==0)
{
if(s[24-b][a*2]==s[24-b][(a-1)*2])
{
a--;
a1++;
}
else
{
p=1;
}
}
a=j;
b=i;
p=0;
while(b>0&&b<25&&b>=j-3&&p==0)
{
if(s[24-b][a*2]==s[24-(b-1)][a*2])
{
b--;
a2++;
}
else
{
p=1;
}
}
a=j;
b=i;
p=0;
while(b>0&&b<25&&b<=j+3&&p==0)
{
if(s[24-b][a*2]==s[24-(b+1)][a*2])
{
b++;
a2++;
}
else
{
p=1;
}
}
a=j;
b=i;
p=0;
while(a>0&&a<25&&b>0&&b<25&&a>=j-3&&p==0)
{
if(s[24-b][a*2]==s[24-(b+1)][(a-1)*2])
{
a--;
b++;
a4++;
}
else
{
p=1;
}
}
a=j;
b=i;
p=0;
while(a>0&&a<25&&b>0&&b<25&&a<=j+3&&p==0)
{
if(s[24-b][a*2]==s[24-(b-1)][(a+1)*2])
{
a++;
b--;
a4++;
}
else
{
p=1;
}
}
if(a1>=4||a2>=4||a3>=4||a4>=4)/*相连的子大于等于4时加上本身就是5个,将p值返回给k*/
{
if(q==2)
{
p=1;
}
else if(q==1)
{
p=2;
}
}
else
{
p=0;
}
return p;
}
int main()
{
char s[25][50];/*用二元数组在绘制棋盘和计算棋子坐标时计算方便,因为输出时横向排列密集,是纵向的2倍,所以横向定义为2倍,输出时用空格间隔,使棋盘横竖均匀*/
int i=0,j=0,b=1,k=0,p=0,b1=0,b0=0,w1=0,w0=0;/*ij代表纵横坐标,k用来判定此局是否胜利,k=1黑胜k=2白胜k=0无人胜,p用作期间问题的选项,b用来判断流程,b=1黑子下b=2白子下b=10黑悔棋b=20白子悔棋,用10和20方便计算,b1b0w1w0为黑白胜负的局数*/
char h=2,w=1;/*用于上面panding()函数的输入,在上一个函数最后需要输入来判定胜利的是黑子还是白子*/
while(i<25)/*将横向数组用‘+’和‘ ’间隔表示*/
{
while(j<=50)
{
s[i][j]='+';/*将可以下子的位置显示为‘+’方便计算和观察*/
s[i][j+1]=' ';
j=j+2;
}
j=0;
i++;
}
i=0;
while(i<25)/*每行数组末尾为‘\n’保证棋盘输出时每组行数组占有一行*/
{
s[i][49]=

'\n';
i++;
}
s[24][50]='\0';/*数组末尾加‘\0’结束数组*/
i=0;
while(i<25)/*为棋盘加上坐标,因为二元数组从左上起始坐标从左下起始所以要将纵坐标倒置,且因为数组需要用char型输出,所以注意数字与字符之间的关系*/
{
if((25-i-1)>=10&&(25-i-1)<20)
{
s[i][0]='1';
s[i][1]=25-i-1-10+'0';
}
if((25-i-1)>=20)
{
s[i][0]='2';
s[i][1]=25-i-1-20+'0';
}
if((25-i-1)<10)
{
s[i][0]=' ';
s[i][1]=25-i-1+'0';
}
i++;
}
j=0;
while(j<50)
{
if(j/2<10)
{
s[24][j]=j/2+'0';
}
if(j/2>=10&&j/2<20)
{
s[24][j]=j/2-10+'0';
s[24][j-1]='1';
}
if(j/2>=20)
{
s[24][j]=j/2-20+'0';
s[24][j-1]='2';
}
j=j+2;
}
s[24][0]=' ';/*将原点处‘00’改为‘ 0’*/
printf("双人对弈五子棋\n\t\t\t\t%c%c谢兴安制作%c%c\n黑子先下\n请分别输入横纵坐标来下棋\n不同环境下运行棋子显示可能有些不同\n游戏时请保持窗口的最大化\n由于技术有限造成的不便请谅解\n",3,4,4,3);
printf("%s",s);/*要注意开始时和每次子有变动时都要输出棋盘,每次重新开始时都要重新定义棋盘*/
while(k==0)/*整个下棋的过程在一个大的while()里,包含黑棋步骤白棋步骤悔棋步骤等,一直如此循环直到玩家输入相应数值来结束游戏时方可跳出循环*/
{
p=0;/*一定注意用于判断的变量判断结束后一定要与下面与其相关的步骤的需要保持一致以免发生错误,因此错误不易查出所以为保险可以在每次用到它之前重新赋值,不管它之前是多少*/

while(b==1&&k==0)/*在黑子步骤且无人胜利的情况下进行黑子步骤*/
{
printf("请下黑棋\n");
while(p==0)/*下子之前计算好输入值如实际值的对应,这里用循环是需要判定输入的坐标是否符合要求,如不符合则循环输入直到符合为止*/
{
scanf("%d%d",&j,&i);
if(s[24-i][j*2]=='+'&&i>0&&i<25&&j>0&&j<25)/*一定要注意输入量的条件和范围,错误的数值输入可能导致程序的紊乱*/
{
s[24-i][j*2]=2;
printf("%s",s);
p=1;
}
else
{
printf("无效操作\n");/*错误的输入值不能用于计算,需要重输*/
p=0;
}
}
p=0;
printf("是否悔棋?\n1.是\t2.否\n");/*因为坐标密集可能看错下错所以每下完一次都可以悔棋一次*/
while(p==0)
{
scanf("%d",&p);
if(p==1)
{
b=10;
p=1;
}
else if(p==2)
{
b=2;
p=1;
}
else
{
printf("无效操作\n");
p=0;
}
}
p=0;
k=panding(i,j,h,s);/*判定*//*用上面定义的panding()判定这个子是否与其他子相连大于等于5个*/
}
while(b==2&&k==0)/*白棋步骤与黑棋类似*/
{
printf("请下白棋\n");
while(p==0)
{
scanf("%d%d",&j,&i);
if(s[24-i

][j*2]=='+'&&i>0&&i<25&&j>0&&j<25)
{
s[24-i][j*2]=1;
printf("%s",s);
p=1;
}
else
{
printf("无效操作\n");
p=0;
}
}
p=0;
printf("是否悔棋?\n1.是\t2.否\n");
while(p==0)
{
scanf("%d",&p);
if(p==1)
{
b=20;
p=1;
}
else if(p==2)
{
b=1;
p=1;
}
else
{
printf("无效操作\n");
p=0;
}
}
p=0;
k=panding(i,j,w,s);/*判定*/
}
if(b>9)/*悔棋步骤,当b=10 或 20时不符合黑白棋步骤条件而来到此,悔棋时的b与对应颜色的棋的b成10倍方便计算*/
{
s[24-i][j*2]='+';/*将上一步下的子抹去重新写为‘+’*/
b=b/10;
printf("%s",s);
}
if(k>0)/*当panding()判定出有一方胜出,则返回的k值不再为0,进入最后的步骤*/
{
if(k==1)/*判定究竟是谁胜利*/
{
printf("黑方胜利\n");
++b1;/*计算胜负次数*/
++w0;
}
if(k==2)
{
printf("白方胜利\n");
++w1;
++b0;
}
printf("是否继续?\n1.是\t2.否\n");/*“是否继续”步骤,判定玩家是否还像继续游戏,想的话胜负局数累加,将k重新改为0,重新定义棋盘,不想的话不改变k值而跳出大循环*/
while(p==0)
{
scanf("%d",&p);
if(p==1)
{
k=0;
b=1;
p=1;
i=0;
j=0;
while(i<25)
{
while(j<=50)
{
s[i][j]='+';
s[i][j+1]=' ';
j=j+2;
}
j=0;
i++;
}
i=0;
while(i<25)
{
s[i][49]='\n';
i++;
}
s[24][50]='\0';
i=0;
while(i<25)
{
if((25-i-1)>=10&&(25-i-1)<20)
{
s[i][0]='1';
s[i][1]=25-i-1-10+'0';
}
if((25-i-1)>=20)
{
s[i][0]='2';
s[i][1]=25-i-1-20+'0';
}
if((25-i-1)<10)
{
s[i][0]=' ';
s[i][1]=25-i-1+'0';
}
i++;
}
j=0;
while(j<50)
{
if(j/2<10)
{
s[24][j]=j/2+'0';
}
if(j/2>=10&&j/2<20)
{
s[24][j]=j/2-10+'0';
s[24][j-1]='1';
}
if(j/2>=20)
{
s[24][j]=j/2-20+'0';
s[24][j-1]='2';
}
j=j+2;
}
s[24][0]=' ';
printf("%s",s);
}
else if(p==2)
{
printf("游戏结束\n");
p=1;
}
else
{
printf("无效操作\n");
p=0;
}
}
}
}
printf("黑方\t%d胜\t%d负\n白方\t%d胜\t%d负\n",b1,b0,w1,w0);/*输出游戏结果*/
if(b1>w1)
{
printf("%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c\n黑方实力雄厚啊~\n%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c\n",3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3);
}
else if(b1{
printf("%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c\n白方实力惊人哇~\n%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c\n",3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3

,3,3,3,3);
}
else if(b1==w1)
{
printf("%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c\n两个人实力差不多嘛~\n%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c\n",1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2);
}
system("pause");
return 0;
}

相关文档
最新文档