前言
这是本人第一篇博客,更多的是对现阶段c语言学习的一个总结,相当于一篇笔记,代码以及博客文章都存在着很大的不足,望各位大佬指出,本人一定及时纠正并加以补充,愿共同进步!
目录
一:扫雷游戏的基本逻辑
二:游戏的分析与设计
1.分文件编写
2.创建菜单
3.创建棋盘
4.显示棋盘
一:扫雷游戏的基本逻辑
想必大家都有接触过扫雷游戏
我们要想用代码实现一款扫雷游戏,首先便要理清这款游戏的逻辑。
1.一张地图,且地图上有一定数量的雷,在此我们设置地图为9*9,一共有10个雷。
2.游玩方式:如果位置是雷,就炸死了。游戏失败。
如果不是雷,会统计该坐标周围雷的个数,并通过数字显示出来
如果成功找到所有非雷的位置。游戏胜利。
二:游戏的分析与设计
?1.分文件编写
不同功能的函数封装到不同的文件中。 一个.c文件和一个.h文件被称为一个模块。 开发C程序时,稍微大型的项目就需要使用多文件开发(模块化编程)。 当代码量较大功能较复杂时,单一文件程序会使得文件非常巨大,代码量非常大,成千上万行的代码在一个文件中不便于修改和维护,因此需要将不同的功能模块放在不同的文件中。
?好处:
1.程序更加简洁明了
2.利于小组团队共同完成项目
3.便于进行调试
?2.创建菜单
便于进行后续操作
void menu(){printf("--------------------------\n");printf("--------------------------\n");printf("---------1.play-----------\n");printf("---------2.quit-----------\n");printf("--------------------------\n");printf("--------------------------\n");}
用do…while循环实现菜单使用,switch语句进行菜单选择
int main(){int input = 0;do{menu();int n = 0;scanf("%d", &n);switch (n){case 1:Sweepmine();break;case 2:printf("欢迎您下次游玩!");break;deafault:break;}} while (input);return 0;}
?3.创建棋盘
由于考虑到边缘有雷的情况,防止访问出界棋盘应制作9+2=11大小的规格
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | ||
0 | 0 | 0 |
先创建数组
注:由于行,列使用频率较高 在game.h中进行宏定义
?数组1 初始化 使其全部填充“*”视为遮挡、
?数组2 初始化 使其全部填充0,视为无雷,后续填充1作为雷
初始化 函数
?4.显示棋盘
我们很容易利用for循环实现对棋盘的打印,为方便后续的体验以及游玩,我们也可以先打印序号,建立一个平面直角坐标系。
棋盘打印效果如下:
?5.布置雷
要想生成雷,我们先利用生成指定范围的随机数的道理生成两个介于1~9的数字,作为埋雷的坐标,并进行替换。
生成随机坐标,并将坐标位置替换为1。
注:进入while循环每设置一个雷,count减一,直到雷设置完毕跳出循环。
? 调用rand()需要srand()
?6.排查雷
输入坐标,可以设置输入坐标范围以确保坐标在棋盘范围内否则重新输入,判断棋盘范围内坐标是否重复输入,若未重复输入判断是否踩雷,.若踩雷”炸死“游戏结束,放入while循环,若雷没有排查完持续循环,若所有雷被排查出则排雷成功。
void CheckMine(char arr1[ROWS][COLS],char arr2[ROWS][COLS], int row, int col){int x = 0;int y = 0;int win = 0;while (win < ROW*COL-10){printf("请输入坐标");scanf("%d %d", &x, &y);if (x >= 1 && x <= row && y >= 1 && y <= col){if (mine[x][y] != '*'){printf("输入坐标重复,请重新输入\n");}else if (board[x][y] == '1'){printf("很遗憾,你被炸死了\n");break;}else{//不是雷,就统计x,y坐标周围有几个雷int c = Display(mine, x, y);board[x][y] = c + '0';Show(board, ROW, COL);win++;}}else{printf("输入坐标错误,请重新输入\n");}}if (win == ROW*COL-10){printf("排雷成功\n");Show(board, ROW, COL);}}
统计坐标的方法如下:
因为坐标内输入的是字符‘0’,所以统计出个坐标数‘1’之和减去‘0’及为周围雷数
int CheckMine(char arr1[ROWS][COLS], int x, int y){return arr1[x + 1][y] + arr1[x - 1][y] + arr1[x][y + 1] + arr1[x][y - 1] + arr1[x + 1][y + 1] + arr1[x - 1][y - 1] + arr1[x + 1][y - 1] + arr1[x - 1][y + 1]-(8*'0');}
游戏即可正常运行
三:总结与反思
此扫雷小游戏属于简化版,并不能做到像WINDOWS系统自带的扫雷游戏那样。代码也有更多提升的地方以上是本篇文章的全部内容了,如果这篇文章对你有些许帮助你的点赞,收藏,评论都是对我最大的支持与鼓励,另外文章的不足之处也希望大佬们能给我一点小小的建议,我会努力的检查并改进。感谢你的阅读。