三子棋是一种民间传统游戏,又叫九宫棋、圈圈叉叉棋、一条龙、井字棋等。游戏分为双方对战,双方依次在9宫格棋盘上摆放棋子,率先将自己的三个棋子走成一条线就视为胜利,而对方就算输了,但是三子棋在很多时候会出现和棋的局面。
一、三子棋的大体思路
(一)创建一个菜单,供玩家选择游玩或者退出。
(二)开始游戏后,我们需要将棋盘打印出来。
(三)就到了玩家落子。
(四)电脑落子。
(五)判断输赢与否。
(六)选择是否继续游玩。
二、三子棋的实现
为了使代码更加简洁美观,我们需要将代码模块化
😊
test.c (逻辑测试)
game.h(函数声明)
game.c(函数定义)
1.菜单的创建
详情请见代码:
void menu()
{
printf("\n");
printf(" 三子棋 \n"); //游戏菜单,提示玩家输入对应数字选择是否开始游戏
printf("\n");
printf("请选择是否开始游戏\n");
printf("1.开始\n");
printf("0.退出\n");
}
void test()
{
int input = 0;
do //这里让游戏重复进行
{
scanf("%d", &input);
if (input == 1) //如果输入1则开始游戏
{
printf("游戏开始\n");
game(); //这里进入到游戏代码
menu(); //一局游戏结束提示是否继续游戏
}
else if (input == 0) //输入0则结束游戏
{
printf("感谢游玩\n");
}
else //输入非0非1则提示重新输入
printf("请重新输入\n");
} while (input);// 输入非0则游戏,0则退出游戏,结束循环
}
int main()
{
menu();
test();
return 0;
}
2.棋盘打印
如果要打印棋盘,则先要将棋盘初始化,那么不难想到,要用到二维数组,打印3*3的棋盘。
//我们在这里可以用define定义,来修改整个程序的行数和列数
#define ROW 3 //行数
#define COL 3 //列数
void game()
{
char arr[ROW][COL];
//初始化棋盘
init_arr(arr, ROW, COL); //传参时将ROW,COL传过去,方便以后修改
//打印棋盘
print_arr(arr, ROW, COL);
}
初始化棋盘,要定义一个函数,声明并使用它。则我们再game.c中来定义这个初始化函数,在test.c中进行使用,当然使用时要对声明一下,否则用不了,这个就交给我们的game.h。
.首先将棋盘初始化,二维数组 arr[ROW][COL] 初始化为 ’ '
void init_arr(char arr[ROW][COL],int row,int col)
{
int i = 0;
for(i = 0; i < row; i++)
{
int j = 0;
for (j = 0; j < col; j++)
{
arr[i][j] = ' ';
}
}
}
1.
初始化完成后,我们就要打印棋盘。
2.
要想完成这样的打印,我们就将棋盘分分组,分组来打印,组合到一起。
3.
我们首先想到的就是红蓝为一组,然后打印三次就可以,最后将第三组打印的蓝删除就行。
但是这样就有个问题,限制了列数,只能打印 N行3列 的棋盘,所以我们将棋盘分组如下:
这样我们就可以完成 N行N列 的棋盘打印,最后将多余的‘|’以及‘—’删除就行。
代码实现如下:
void print_arr(char arr[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
int j = 0;
for (j = 0; j < col; j++)
{
printf(" %c ", arr[i][j]);
if (j < col - 1) //判断最右边是否多余'|',并不打印
{
printf("|");
}
}
printf("\n");
int a = 0;
if (i < row - 1) //判断最下边是否多余'---',并不打印
{
for (a = 0; a < col; a++)
{
printf("---");
if (a <col - 1) //判断最右边是否多余'|',并不打印
{
printf("|");
}
}
}
printf("\n");
}
}
这样打印出来的棋盘就很好看了。
😍
棋盘成功打印后,就该我们的真正下棋了。
大体逻辑为玩家落子,打印棋盘,电脑落子,打印棋盘,循环往复,最后判断输赢。
代码实现如下:
void game()
{
char arr[ROW][COL];
//初始化棋盘
init_arr(arr, ROW, COL);
//打印棋盘
print_arr(arr, ROW, COL);
char ret = 0;
while (1)
{
//玩家落子
player_move(arr, ROW, COL);
print_arr(arr, ROW, COL);
/*system("cls");*/
ret = is_win(arr, ROW, COL);
if (ret != 'c')
{
break;
}
//电脑落子
computer_move(arr, ROW, COL);
print_arr(arr, ROW, COL);
ret = is_win(arr, ROW, COL);
if (ret != 'c')
{
break;
}
}
//判断输赢
if (ret == 'o')
{
printf(