前言
❤️ 铁汁们大家好,欢迎大家来到出小月的博客里, 🤗🤗🤗之前呢,我分享了C语言的函数篇。。。。今天呢,给大家分享一个很经典的小游戏“三子棋小游戏”,这个小游戏系统地把之前学的循环语句,还有函数都结合起来了,希望大家看完我这篇文章都能够“涨芝士”,感觉小月写的还不错的话,记得👍🏻点赞加关注😘鼓励一下博主哦,不然下次可找不到我啦❗❗
作者简介
❤️ 作者的gitee:出小月;
❤️ 作者的主页:出小月的《程序员历险记》
❤️专栏:《C语言》,《数据结构初阶》
😊希望大家都能够:好好学习,天天编程❗❗❗
文章目录
一、🤗三子棋的最终页面
二、🤗三子棋步骤分析
1.菜单
🐷展示一个页面,提示用户,你选择1就进入游戏,你要是选择0就退出游戏,主要是为了更美观❗❗❗
void menu()
{
printf("******************************\n");
printf("********* 1、play *******\n");
printf("********* 0、exit *******\n");
printf("******************************\n");
}
2.总体框架
🐷根据菜单提示,1就进入游戏,0就退出游戏。
🐻因此我输入一个0或者1,然后用switch语句,我输入1就进入game()中开始玩游戏,玩完游戏还可以回到菜单页面继续输入1或者0继续玩;
🦒输入0就直接break结束switch循环语句重新进入do-while循环输入1或者0,但是我想要的是输入0就会退出,也就是结束do-while循环,那什么时候do-while循环结束呢❓❓就是while()里面的条件为假时,我们都知道0就是假,因此直接把input放到条件就行;
🐹如果我输的不是1也不是0呢,就会提示“您选择错误”,继续回到菜单页面继续输入1或者0继续玩。
void test()
{
int input = 0;
do {
menu();
printf("请选择->");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误\n");
break;
}
} while (input);
}
3、游戏内容
🐷首先,我定义一个ROW行,COL列的二维数组(三子棋中ROW=COL=3),然后初始化棋盘都为空格,再打印初始化完的棋盘(这里打印应该打印出棋盘的边框)
🐻然后玩家下棋,下完棋我得判断一下是否赢了?
🦒怎么判断谁输谁赢呢❓❓❓这里我规定‘*’代表玩家赢,‘#’代表电脑赢,‘Q’(quit)平局,‘C’(continue)游戏继续。
🐹如果ret的返回值是‘C’,就继续让电脑下棋,电脑下完棋,判断谁输谁赢。
void game()
{
char board[ROW][COL];
char ret = 0;
init_board(board, ROW, COL);
print_board(board, ROW, COL);
while (1)
{
player_move(board, ROW, COL);
print_board(board, ROW, COL);
//判断输赢
ret = is_win(board, ROW, COL);
if (ret != 'c')
{
break;
}
computer_move(board, ROW, COL);
print_board(board, ROW, COL);
//判断输赢
ret = is_win(board, ROW, COL);
if (ret != 'c')
{
break;
}
}
if (ret == '*')
printf("玩家赢\n");
else if (ret == '#')
printf("电脑赢\n");
else if (ret == 'q')
printf("平局\n");
}
4、初始化棋盘
🐷把整个二维数组置空
void init_board(char board[ROW][COL], int row, int col)
{
for (int i = 0; i < row; i++)
{
int j = 0;
for ( j = 0; j < col; j++)
{
board[i][j] = ' ';
}
}
}
5、打印棋盘
🐷首先最外层有个循环,然后有两个小循环:第一个循环打印【‘字符’+‘|’】打印三次(其中加个条件时’|'只打印两次)这打印的是一行;第二个循环【‘- - - ’+‘|’】打印三次(其中加个条件时‘|’只打印两次)这打印的也是一行;最外层循环把第一个小循环循环三次,把第二个小循环循环两次
void print_board(char board[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 ", board[i][j]);
if (j<col-1)
printf("|");
}
printf("\n");
if (i < row - 1)
{
for (j = 0; j < col; j++)
{
printf("---");
if (j < col - 1)
printf("|");
}
printf("\n");
}
}
}
6、玩家下棋
🐷玩家输入要下的坐标,如果这个坐标合法,并且为空,就把‘*’放上面,然后break跳出while循环。
🐻如果玩家输入的坐标不合法,就重新输入;如果坐标合法但是被占用也要重新输入。
void player_move(char board[ROW][COL], int row, int col)
{
printf("玩家下棋:\n");
while (1)
{
printf("请输入要下棋的坐标:");
int x = 0;
int y = 0;
scanf("%d%d", &x,&y);
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if (board[x-1][y-1] == ' ')
{
board[x-1][y-1] = '*';
break;
}
else
{
printf("该坐标已经被占用\n");
}
}
else
{
printf("坐标非法\n");
}
}
}
7、电脑下棋
🐻电脑下棋就是随机生成下标,如果这个位置为空就放上‘#’
void computer_move(char board[ROW][COL], int row, int col)
{
printf("电脑下棋\n");
while (1)
{
int x = rand() % row;//如果row是3,那么x就是0-2;
int y = rand() % col;
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
8、判断输赢
🐻判断三行是否一样,判断三列是否一样,判断对角线是否一样?
这里判断对角线这里如果不是三子棋呢?是十字棋呢?难道要一个一个判断吗?大家先思考一下,下篇文章会提到❗❗❗
char is_win(char board[ROW][COL], int row, int col)
{
//判断三行
for (int i = 0; i <row; i++)
{
if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ')
return board[i][0];
}
//判断三列
for (int j = 0; j < col; j++)
{
if (board[0][j] == board[1][j] && board[1][j]==board[2][j]&&board[0][j]!=' ')
return board[0][j];
}
//判断对角线
if (board[0][0]==board[1][1]&&board[1][1]==board[2][2]&&board[0][0]!=' ')
{
return board[0][0];
}
if (board[0][2]==board[1][1]&&board[1][1]==board[2][0]&&board[0][2]!=' ')
{
return board[0][0];
}
if (is_full(board, row, col) == 1)
{
return 'q';
}
return 'c';
}
9、判断键盘是否满
🐻如果棋盘满了,就是平局;
static int is_full( char board[ROW][COL], int row, int col)
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
if (board[i][j]==' ')
{
return 0;
}
}
}
return 1;
}
总结
❤️❤️❤️今天的分享就到这里了,给大家留了一个问题,大家可以思考思考,如果实在不明白,关注小月,下篇文章会出详解。。。