扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
目录
团风ssl适用于网站、小程序/APP、API接口等需要进行数据传输应用场景,ssl证书未来市场广阔!成为成都创新互联的ssl证书销售渠道,可以享受市场价格4-6折优惠!如果有意向欢迎电话联系或者加微信:028-86922220(备注:SSL证书合作)期待与您的合作!游戏规则:
geme.h:
test.c:
geme.c:
相信大家都知道三子棋的游戏规则,但是还是啰嗦一下结束一下哈哈哈;规则就是在一个3*3的棋盘中,对应的九个格子,只要双方只要有一方的三颗棋子连成一条线就胜利,要是填满九个格子还没有任意一方的三颗棋子连成一条线,那就是平局了。
okok啰嗦完,开始正式话题。
———————————————————————————————————————————
在我们实现三子棋的时候,我们可以想到用模块化的开发去完成游戏的实现,每一个文件各司其职,比如我们的函数声明可以放到一个建立的.h头文件中,自定义的函数可以写到一个新的.c文件中,游戏的运行以及测试可以放在第一个.c文件中。
那这样下来我们的一个工程中就有以下的三个文件:
geme.h test.c geme.c———————————————————————————————————————————
test.c
在这个.c文件下我们可以先实现我们的游戏菜单:
我们可以在自定义一个函数void test(),这个函数是实现我们游戏的函数:
上来我们可以使用do{}while();(实现重复玩游戏的功能)和switch语句来实现,代码:
#includevoid enmu()
{
printf("************************\n");
printf("*****1、三子棋游戏*******\n");
printf("*****0、退出游戏*********\n");
printf("************************\n");
}
void test()
{
int num1=0;
do
{
enmu();
printf("请选择:\n");
scanf("%d",&num);
switch(num)
{
case 1:
printf("三子棋游戏\n");
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择有误请重新输入:\n");
break;
}
}while(num)
}
int main()
{
test();
return 0;
}
至此我们的菜单就完成了!逻辑通过switch语句也实现了!
———————————————————————————————————————————
geme.c
接着我们可以写 void game()函数,在这个函数中我们可以先实现把棋盘打印出来(如图所示棋盘):
我们从图中可以看出我们实现这个棋盘只要一个二维数组便可以实现!
char board[ROW][COL]
其中 RWO和COL是我们定义的全局变量,这样子的好处就是我们可以随时修改棋盘的大小不仅仅局限于3*3的棋盘。
对此我们需要先实现这个棋盘即初始化,可以写一个void int_board(char board[ROW][COL],int row,int col) 这么一个函数实现。( 其中的小写的row和col对应的是前面所说的全局变量ROW和COL)
代码:
void init_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++)
{
board[i][j] = ' ';
}
}
}
当我们的棋盘初始完后,那我们就需要把棋盘打印到棋盘上面,我们同样是定义一个函数void print_board(char board[ROW][COL],int row,int col)来打印棋盘:
不过在答应这个棋盘之前,需要注意一些问题:
这么一个棋盘我们可以看到
第一行是这样的:
是由空格%c空格|空格%c空格|空格%c空格组成的
那我们就可以把空格%c空格|作为一个单位来输出,输出用循环控制即可(但是需要注意的是最后一个单位是没有|)
一个单位:*3
第二行是这样的:
是由---|---|---组成的并且只是打印两组
那我们就可以以---|为一个单位打印(最后一个单位是没有|)
一个单位:
那我们上代码:
void print_board(char board[ROW][COL],int row,int col)
{
int i=0;
int j=0;
for(i=0;i|
接下里我们就需要解决两个问题:第一个就是玩家下棋;第二个就是电脑下棋
首先我们先解决玩家下棋:
先定义一个函数void player_move(char board[ROW]COL[,int row,int col])
我们实现这个函数时候就需要想一些问题,就是你下的这个位置是不是空的,并且是在我们自己写棋盘范围内,不是空那我们就需要重新输入(我们定义*号为玩家下的棋);还有就是下棋的位置是在数组中的,而面对玩家群体时,他们可不清楚上面是数组,所以我们就需要在数组的位置上+1
代码:
void player_move(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("请玩家下棋(输入棋盘对应的坐标):>\n");
scanf_s("%d %d",&x,&y);
while (1)
{
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");
}
}
}
接着就是电脑下棋:
同样定义一个函数:void computer_move(char board[ROW][COL],int row,int col)
对于电脑下棋我们也需要思考几个问题,第一电脑下的位置是随机的,并且也需要符合玩家下棋的条件。那么对于随机值我们可以用rand和srand(srand这个函数还需要一个无符号返回值,这个返回值可以用time函数数解决)
这一对函数(需要包含头文件:stdlib.h)来解决,可以设置定义一个整型变量来接收rand生成的随机值,并且这个随机值要在数组的范围内,不然会造成数组越界的问题,对此我们只需要对这个随机值进行取模3即可。
代码:
void computer_move(char board[ROW][COL], int row, int col)
{
printf("电脑下棋:\n");
while (1)
{
int x = rand() % row;//0 1 2
int y = rand() % col;//0 1 2
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
到这一步游戏已经可以走起来了我们可以说以及完成这个游戏的百分之八十了,还有剩下的最后百分之二十,那这最后的百分之二十就是要去判断这个游戏的输赢了。
我们可以写一个函数char is_win(char board[ROW][COL],int row,int col),通过这个函数的返回值去判断谁赢,那么就有以下逻辑:
如果返回值是'*'则玩家赢
如果返回值是'#'则玩家赢
如果返回值是'P'则平局
如果返回值是'C'则游戏继续
游戏获胜可以参考前面的游戏规则
代码:
char is_win(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i< row; i++) //判断行是否赢
{
if (board[i][0]==board[i][1]&&board[i][1]==board[i][2]&&board[i][1]!=' ')
{
return board[i][1];
}
}
for (i = 0; i< row; i++) //判断列是否赢
{
if (board[0][i] == board[1][i] && board[0][i] == board[2][i] && board[1][i] != ' ')
{
return board[1][i];
}
}
//判断对角线是否赢
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] & board[1][1] != ' ')
{
return board[1][1];
}
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] & board[1][1] != ' ')
{
return board[1][1];
}
}
其实我们看我这段代码后会发现,没有平局的情况,对于平局的情况我们其实需要另写一个函数int is_full(char board[ROW][COL],int row,int col)的返回值在char is_win(char board[ROW][COL],int row,int col)函数中实现
代码:
int is_full(char board[ROW][COL],int row,int col)
{
int i = 0;
int j = 0;
for (i = 0; i< row; i++)
{
for (j = 0; j< col; j++)
{
if (board[i][j] != ' '&& board[i][j] != '*'&& board[i][j] != '#')
{
return 1;
}
}
}
}
那完整的char is_win(char board[ROW][COL],int row,int col)函数如下:
int is_full(char board[ROW][COL],int row,int col)
{
int i = 0;
int j = 0;
for (i = 0; i< row; i++)
{
for (j = 0; j< col; j++)
{
if (board[i][j] != ' '&& board[i][j] != '*'&& board[i][j] != '#')
{
return 1;
}
}
}
}
char is_win(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i< row; i++) //判断行是否赢
{
if (board[i][0]==board[i][1]&&board[i][1]==board[i][2]&&board[i][1]!=' ')
{
return board[i][1];
}
}
for (i = 0; i< row; i++) //判断列是否赢
{
if (board[0][i] == board[1][i] && board[0][i] == board[2][i] && board[1][i] != ' ')
{
return board[1][i];
}
}
//判断对角线是否赢
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] & board[1][1] != ' ')
{
return board[1][1];
}
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] & board[1][1] != ' ')
{
return board[1][1];
}
//判断是否平局
if (is_full (board,row, col) == 1)
{
return 'P';
}
}
至此,这个三子棋的小游戏就已经完成了。
———————————————————————————————————————————————————————————
game.h
这里就需要包含一下我们函数声明:
#include#define ROW 3
#define COL 3
#include#includevoid init_board(char board[ROW][COL], int row,int col);
void print_board(char board[ROW][COL], int row,int col);
void player_move(char board[ROW][COL], int row, int col);
void computer_move(char board[ROW][COL], int row, int col);
char is_win(char board[ROW][COL], int row, int col);
完整程序:
game.c:
#define _CRT_SECURE_NO_WARANINGS 1
#include"game.h"
void init_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++)
{
board[i][j] = ' ';
}
}
}
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");
}
}
void player_move(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("请玩家下棋(输入棋盘对应的坐标):>\n");
scanf_s("%d %d",&x,&y);
while (1)
{
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");
}
}
}
void computer_move(char board[ROW][COL], int row, int col)
{
printf("电脑下棋:\n");
while (1)
{
int x = rand() % row;//0 1 2
int y = rand() % col;//0 1 2
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
int is_full(char board[ROW][COL],int row,int col)
{
int i = 0;
int j = 0;
for (i = 0; i< row; i++)
{
for (j = 0; j< col; j++)
{
if (board[i][j] != ' '&& board[i][j] != '*'&& board[i][j] != '#')
{
return 1;
}
}
}
}
char is_win(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i< row; i++) //判断行是否赢
{
if (board[i][0]==board[i][1]&&board[i][1]==board[i][2]&&board[i][1]!=' ')
{
return board[i][1];
}
}
for (i = 0; i< row; i++) //判断列是否赢
{
if (board[0][i] == board[1][i] && board[0][i] == board[2][i] && board[1][i] != ' ')
{
return board[1][i];
}
}
//判断对角线是否赢
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] & board[1][1] != ' ')
{
return board[1][1];
}
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] & board[1][1] != ' ')
{
return board[1][1];
}
//判断是否平局
if (is_full (board,row, col) == 1)
{
return 'P';
}
}
game.h:
#define _CRT_SECURE_NO_WARANINGS 1
#include#define ROW 3
#define COL 3
#include#includevoid init_board(char board[ROW][COL], int row,int col);
void print_board(char board[ROW][COL], int row,int col);
void player_move(char board[ROW][COL], int row, int col);
void computer_move(char board[ROW][COL], int row, int col);
char is_win(char board[ROW][COL], int row, int col);
test.c:
#define _CRT_SECURE_NO_WARANINGS 1
#include"game.h"
void menu()
{
printf("********************\n");
printf("*****1、play********\n");
printf("*****0、exit********\n");
printf("********************\n");
}
void game()
{
printf("***三子棋***\n");
char ret=' ';
char board[ROW][COL];
//先给定空棋盘的位置
init_board(board, ROW, COL);
//初始化并且打印棋盘
print_board(board, ROW, COL);
//玩家下棋
while (1)
{
player_move(board, ROW, COL);
print_board(board, ROW, COL);
//判断输赢 //可以让is_win函数返回一个字符串判断输赢:
//玩家赢返回:* 电脑赢返回:# 平局返回:P 以及继续游戏!
ret=is_win(board,ROW,COL);
if (ret == '*')
{
printf("恭喜你赢!\n");
break;
}
else if(ret=='#')
{
printf("抱歉你输了!\n");
break;
}
else if (ret == 'P')
{
printf("平局!\n");
break;
}
else
{
printf("游戏继续!\n");
}
//电脑下棋
computer_move(board,ROW,COL);
print_board(board, ROW, COL);
//判断输赢
ret = is_win(board, ROW, COL);
if (ret == '*')
{
printf("恭喜你赢!\n");
break;
}
else if (ret == '#')
{
printf("抱歉你输了!\n");
break;
}
else if (ret == 'P')
{
printf("平局!\n");
break;
}
else
{
printf("游戏继续!\n");
}
}
}
void test()
{
srand((unsigned int)time(NULL));
int input = 0;
do
{
menu();
printf("请输入选项:>\n");
scanf_s("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("游戏已退出!\n");
break;
default:
printf("输入有误请重新输入:>\n");
}
} while (input);
}
int main()
{
//1、创建一个打印菜单的函数
//2、作为一个游戏我们首先是确定一点就是可以重复玩。
test();
return 0;
}
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流