在我们学习二维数组的时候,难住了很大一部分人的开始我想就是三子棋了,写代码就像盖房子,我们思路有了不就手到擒来了嘛!!!!.
三子棋顾名思义我们应该都玩过就像是这样的一个小游戏.
对于新手当我们第一次看到这个棋盘我们应该就已经开始害怕了....
don't worry!!!!!
首先我们要有写这个代码的大致思路
一.准备阶段
1.我们需要一个游戏开始的菜单
2.游戏开始时我们需要一个棋盘
3.我们需要把棋盘初始化
4我们当然还要把棋盘打印出来
二.下棋阶段
1.玩家下棋
2.电脑下棋
3.当然还要判断输赢啦
接下来需要我们具体怎么做,直接上代码!!!
void menu()
{
printf("*************\n");
printf("* 1.play *\n");
printf("* 0.over *\n");
printf("*************\n");
}
void test()
{
int a = 0;
do
{
menu();
printf("请选择\n");
scanf("%d", &a);
switch (a)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误\n");
break;
}
} while (a);
}
int main()
{
test();
return 0;
}
这就是关于打印菜单这一段的代码啦,这里面的game()函数内执行的就是我们游戏的主体
当我们选择进入游戏的时候就进入我们的game()函数,接下来的一系列操作全都在game()函数里面了
char arr[3][3];
int i = 0;
for(i=0;i<3;i++)
{
int j = 0;
for (j = 0; j < 3; j++)
{
arr[i][j] = ' ';
}
}
这段是进入game()以后,我们初始化棋盘,其实我们可以把棋盘看成一个二维数组,而每个坐标都相当于数组里面的一个元素,由于一开始我们什么都没有,就让每个位置都是空格。
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
{
printf(" %c ", arr[i][j]);
if (j < 2)
{
printf("|");
}
}
printf("\n");
if(i<2)
for (j = 0; j < 3; j++)
{
printf("---");
if (j < 2)
{
printf("|");
}
}
printf("\n");
}
这里我们就是把棋盘打印了出来,我们将每个元素与”|“看成一个整体将“---”与“|”也看成一个整体
但我们要注意的是只有两行的---与两列的|的,所以我们在打印时要加入一些限制条件。
while (1)
{
int x = 0;
int y = 0;
scanf("%d %d", &x, &y);
if (x >= 1 && x <= 3 && y >= 1 && y <= 3)
{
if (arr[x - 1][y - 1] == ' ')
{
arr[x - 1][y - 1] = '*';
break;
}
else
printf("输入错误请重新输入\n");
}
else
printf("输入非法\n");
}
这就到了我们下棋的部分了,假如我们让人先下,我们下的位置就是在数组元素,当我们输入后我们要判断该位置是否存在,是否可以下,如果不满足我们就需要重新输入,直到条件满足为止。
while (1)
{
int x = rand() % 3;
int y = rand() % 3;
if (arr[x][y] == ' ')
{
arr[x][y] = '#';
break;
}
}
}
接着就是我们电脑下棋了与人相比唯一不同,就是电脑下棋时需要获取一个随机数,这时候就需要使用我们的rand()函数了(在使用时需要先使用srand(time(NULL))这个函数而参数我们选择时间戳,给它传一个空指针就可以了)但是这个随机数的大小我们要控制在0-2之间,所以我们需要%3来保证。
int i = 0;
//判断三行
for (i = 0; i < 3; i++)
{
if (arr[i][0] == arr[i][1] && arr[i][1] == arr[i][2] && arr[i][0] != ' ')
{
return arr[i][0];
}
}
//判断三列
for (i = 0; i < 3; i++)
{
if (arr[0][i] == arr[1][i] && arr[1][i] == arr[2][i] && arr[0][i] != ' ')
{
return arr[0][i];
}
}
//对角线
if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[1][1] != ' ')
{
return arr[1][1];
}
if (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0] && arr[1][1] != ' ')
{
return arr[1][1];
}
//平局?
if (is_full(arr, 3, 3) == 1)
{
return 'Q';
}
//继续
//没有玩家或者电脑赢,也没有平局,游戏继续
return 'C';
int is_full(char arr[3][3], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (arr[i][j] == ' ')
{
return 0;
}
}
}
return 1;
}
//继续
//没有玩家或者电脑赢,也没有平局,游戏继续
return 'C';
接下来我们就是判断输赢啦,如果还没下完游戏还要继续
我们为了方便,以及安全性可以把代码模块化就像
下面这是game.h里面的内容
这是我们test.c里面的内容包含的是我们整个代码的逻辑
而逻辑部分执行的内容都在我们的game.c中了
我们为了通用就用#define定义了行和列,这样假如我们想要整个五子棋也不是不可以啦
这就是我们整个三子棋的完整代码!!!