今天来分享我的三子棋算法,会对其中的一些地方进行讲解,帮助大家避坑,犹如代码比较粗糙,只是一遍打的,不建议新手模仿。
#include <stdio.h>
#include <stdlib.h>
#define ROW 3
#define COL 3
void menu(void)
{
printf("____________________\n");
printf(" 1 开始精彩的三字棋游戏\n");
printf(" 0 退出 \n");
printf("____________________\n");
}
void print(int a[ROW][COL])
{
int i=0;
int j=0;
int x=0;
for(i=0;i<ROW;i++)
{
for(j=0;j<COL;j++)
{
printf("%c",a[i][j]);
if(j==2)
{
break;
}
printf("|");
}
printf("\n");
if(i==2)
{
break;
}
for(x=0;x<ROW;x++)
{
printf("一");
}
printf("\n");
}
}
void person(int a[ROW][COL])
{
int i=0;
int j=0;
while(1)
{
scanf("%d %d",&i,&j);
if(i>=1&&i<=3&&j>=1&&j<=3&&a[i-1][j-1]==' ')
{
a[i-1][j-1]='*';
break;
}
else
{
printf("输入错误");
}
}
}
void computer(int a[ROW][COL])
{
while(1)
{
int i=rand()%ROW+1;
int j=rand()%COL+1;
if(i>=1&&i<=3&&j>=1&&j<+3&&a[i-1][j-1]==' ')
{
a[i-1][j-1]='+';
break;
}
}
}
void judge(int a[ROW][COL])
{
if(a[0][0]=='*'&&a[0][1]=='*'&&a[0][2]=='*')
{
printf("person win\n");
exit(-1);
}
if(a[1][1]=='*'&&a[1][0]=='*'&&a[1][2]=='*')
{
printf("person win\n");
exit(-1);
}
if(a[2][0]=='*'&&a[2][1]=='*'&&a[2][2]=='*')
{
printf("person win\n");
exit(-1);
}
if(a[0][0]=='+'&&a[0][1]=='+'&&a[0][2]=='+')
{
printf("computer win\n");
exit(-1);
}
if(a[1][1]=='+'&&a[1][0]=='+'&&a[1][2]=='+')
{
printf("computer win\n");
exit(-1);
}
if(a[2][0]=='+'&&a[2][1]=='+'&&a[2][2]=='+')
{
printf("computer win\n");
exit(-1);
}
if(a[0][0]=='*'&&a[1][1]=='*'&&a[2][2]=='*')
{
printf("person win\n");
exit(-1);
}
if(a[0][2]=='*'&&a[1][1]=='*'&&a[2][0]=='*')
{
printf("person win\n");
exit(-1);
}
if(a[0][0]=='+'&&a[1][1]=='+'&&a[2][2]=='+')
{
printf("computer win\n");
exit(-1);
}
if(a[0][2]=='+'&&a[1][1]=='+'&&a[2][0]=='+')
{
printf("computer win\n");
exit(-1);
}
}
void game(int a[ROW][COL])
{
while(1)
{
person(a);
print(a);
printf("\n");
judge(a);
computer(a);
print(a);
printf("\n");
judge(a);
}
}
int main()
{
int a[ROW][COL]={0};
int i=0;
int j=0;
for(i=0;i<ROW;i++)
{
for(j=0;j<COL;j++)
{
a[i][j]=' ';
}
}
menu();
int n=0;
do
{
scanf("%d",&n);
switch(n)
{
case 1:
game(a);
break;
case 0:
break;
default:
printf("输入错误,笨狗");
}
}while(n);
return 0;
}
上面就是我所打出来的代码,可以轻而易举的看到有些地方方法过于复杂,一眼就能看出来的部分就是判断谁赢了的时候,这是非常繁琐的,例如一行为相同的时候赢得时候完全可以借用for循环,听过使行不变,其余向数组后面遍历,并且通过两个简单的if语句就可以判断谁赢了游戏。
由于本人比较懒,也就不把调试好的简易版本呈上了,有时间会发在评论区(实际上根本不会)。
上面就是为了能够不断进行游戏,无论是玩家还是电脑选好地方填入后都会打印一次并且进行一次判断,防止有人赢了都不知道。
主函数就比较简单,三子棋就创建一个三位数组,并且把每一个元素都变成空格,方便后面填入,并且需要一个数来表明玩家的心意,也就是你到底玩不玩,不玩就可以退出,如果你输错,就会叫你笨狗。
玩家如果填错,必须得有机会才行,不能一棍打死,要让你再次输入,所以必须用一个while循环,并且要一直进行,如果填对了,就要走出循环,用一个break正好,computer也是如此,毕竟他是随机填入,可能需要填写好几次才能填对。
可以看到i和j,他们分别是除余,只可能会有0,1,2存在,不会有三,这就不行,因为玩家可能不理解内部程序,只会以为这只是普通游戏一样,一就代表第一行,这显然不行,所以后面的加一显得尤为重要。