扫雷游戏的基础版实现

张开发
2026/6/1 21:35:22 15 分钟阅读
扫雷游戏的基础版实现
一、扫雷游戏的规则1.题目要求1使用控制台实现经典的扫雷游戏2游戏可以通过菜单实现继续玩或者是退出游戏3扫雷的棋盘是9*9的格子4默认设置10个雷5可以排查雷1如果排查的位置不是雷就现在当前位置周围有几个雷2如果排查的位置是雷就会被炸死游戏结束2.游戏结束的两种情况排查出所有不是雷的地方即成功玩完游戏游戏结束排查出的地方是雷被炸死即游戏失败游戏结束二、扫雷游戏的可能存在的问题及解决方法1.分析这个游戏我们采用多文件的方式实现1我们可以先在test.c文件中测试扫雷游戏的代码2在game.c文件中执行扫雷游戏的实现3在game.h中进行各种函数声明2.9*9的格子怎么产生1看到行和列用我们C语言所学的知识最先想到的就是二维数组定义一个二维数组行为9列为9。2那二维数组的类型是什么呢取决与我们要存储的元素类型是什么在整个游戏中假设我们用0表示这个位置不是雷1表示这个位置是雷但这个时候当排查出的位置不是雷的时候我们需要在这个位置显示这个位置周围有几个雷如果这个位置周围有一个雷时我们用1所表示的意思会出现歧义,这个时候我们该怎么办呢暂且有一下两种方法我们用法2【1】换一种表示方法雷不是雷*#【2】定义两个一样大的二维数组数组1放布置好雷的信息用字符0表示不是雷字符1表示雷数组2放排查出雷的信息用数字表示排查出不是雷的位置 周围雷的信息所以数组元素要么为数字要么为数字字符所以可以创建char类型的二维数组。3.在统计最边上坐标周围雷的信息时数组会出现越界的风险与在定义布置雷或排查雷的数组时数组个数的问题如果不想越界可以在数组的上下左右都加上一列即11* 11的格子但我们要排查的中心仍是9*9的格子这个时候你会发现对于不同的地方数组的常量值也不一样所以我们可以在game.h文件中对于数组的常量值进行声明在test.c文件中使用时需要加上#includegame.h#define ROW 9 //行 #define COL 9 //列 #define ROWS ROW2 #define COLS COL2这样写的好处未来你想增加难度扩大格子范围只需要在game.h中修改ROW 与COL即可。三、扫雷游戏1.扫雷游戏的逻辑测试分析需要一个菜单上面有玩游戏与退出游戏两个选择在测试函数中需要根据玩家的选择开始相应的游戏内容。这里需要用到分支语句switch而分支语句的判断条件与菜单展示的选择有关。菜单我们也用函数进行分装并且题目要求通过菜单实现继续玩或者是退出游戏 可知这里需要一个循环来判断我是要继续玩游戏还是退出游戏。但无论是哪种选择我的菜单必须是要先打印一次的所以这个循环的特点是先执行后判断——do while循环test.c----测试游戏逻辑#includestdio.hvoidmenu(){printf(-------------------------\n);printf(----- 1.play -----\n);printf(----- 0.exit -----\n);printf(-------------------------\n);}voidtest(){intinput0;//需要定义一个变量接受输入的选择do{menu();//先打印菜单printf(请选择);scanf(%d,input);switch(input){case1:printf(玩游戏\n);//玩游戏的实现逻辑会在game.c文件中break;case0:printf(退出游戏\n);break;default:printf(选择错误请重新选择\n);break;}}while(input);}intmain(){test();}运行截图2.扫雷游戏的实现将测试逻辑中的玩游戏写一个函数实现即game()函数第一步我们需要先提前定义好两个数组charmine[ROWS][COLS]{0};//存放布置好雷的信息//期望 mine数组最开始都是字符0--’0’表示一个雷也没有charshow[ROWS][COLS]{0};//存放排查出雷的信息//期望 show数组最开始都是字符*---‘*’表示还没有开始排查这个时候数组的常量值为什么不是ROW与COL呢而是ROWS COLS ,就是为了避免越界*第二步初始化数组-*–用函数分装初始化的过程放在game.c中但我想要即想要在game.c中实现函数逻辑又想在test.c文件中调用就要在game.h中先进行声明然后再各自的文件中加上头文件game.h中声明game.c中实现功能test.c中调用#includegame.h后就可以使用了。以下是定义函数时三个文件所需要做的这个时候你会发现为什么函数在传递参数时用大写的ROWS COLS,但在函数声明和功能实现时的定义用小写呢这是因为大写表示的时宏常量-----是全局变量小写是函数的形参—是局部变量初始化数组功能的实现初始化要先遍历数组元素然后给它们赋上相应的值这个时候请大家先停一下自己先赋一下值你会发现一个问题我们的初始化函数是传入相应的参数赋相应的值但下面的代码无法实现所以我们要么写两次这个代码要么在传值时也把相应的值传过去显然第二个更好修改后第三步 打印棋盘在开篇的图片中我们就看到了如果要玩游戏你要先打印出棋盘这样才能方便后期选择坐标进行排雷但是我们有两个棋盘在游戏是究竟要打印哪一个呢我们需要打印出我们进行排雷的棋盘----显示排雷信息的数组布置雷的数组棋盘可不能打印不然就会暴露雷的位置打印棋盘的实现打印棋盘只打印9*9的中心格子多出的不用打印所以在传递行和列的参数时传递的是row col我们要打印的是show数组的棋盘用DisplayBoard打印棋盘也先要遍历我们需要通过输入坐标来进行排查雷所以我们可以在每一个棋盘的最上面和最左边加上坐标最上面的坐标要在棋盘打印之前就要打印出来为了是这个观赏性更高我们可以加入一些小的提示语句你也可以通过这个函数来检查棋盘在初始化时有没有成功第四步 布置雷这一步是在mine数组中进行实现的我们用Setmine函数名布置雷肯定是要随机布置了这就要使用到随机函数了不知道的小伙伴可以看一下我上期的博客猜数字游戏里面有rand函数的介绍在这里就不过多赘述了。怎么布置雷1.要明确我们需要布置10个雷布置一个就少一个所以我们可以使用循环来实现布置雷的步骤且用’1‘表示雷什么时候停止布置雷呢当雷已经布置完时循环结束布置雷的这一步完成所以我们用while循环2.布置雷的时候选中的位置会被重复选择吗这要求我们要有一个判断所选位置有么有被布置过雷3.布置雷应该在9*9的表格中进行所以在传递参数时我们要注意传递的行和列是col,row但传递的数组的行和列是COLS ROWS而且雷的布置要基于行和列的坐标要在这个范围内4.随机函数放在哪里每一个雷的位置的选择都是随机的所以我们放在循环里面。5.我们要传递的参数有数组行列布置雷的实现通过Display函数来判断一下雷有没有布置成功使用的时候记得在game()函数中布置雷这一步加上打印的这个函数哦第五步 排查雷排查雷是将在mine函数中排查的信息放在show函数里面为什么实在mine函数中排查的信息呢你可以这样想mine的这个棋盘和show函数这个棋盘是摞在一起的mine在下show在上我们在玩这个已经布置好雷的游戏时我们看不到mine的任何信息但是我们可以看见show, 我们是隔着show在mine上选择的但游戏要有可玩性show函数在我们选择之后要有反馈这个反馈的信息就是mine传递给show的所以要传递的参数有mineshow真正需要显示的行和列排查是有范围的所以我们需要判断我们选择的坐标是否在排查范围之内如果在的话选择坐标之后会有两种反馈1.选的位置不是雷要显示这个位置周围雷的信息游戏继续2.选的位置是雷被炸死游戏结束这个时候我们可以显示一下雷的信息。如果不在的话坐标非法需要重新选择。这个时候有没有感受到相似的步骤对是循环我们不可能只选择一次就会结束排查雷的这一步所以要循环循环到我们排查出所有的雷游戏成功游戏结束或者是选到了雷被炸死跳出循环游戏结束这是一次判断以上就是扫雷游戏的全部逻辑下面这个是我gitee仓库里面的代码大家可以看一下扫雷游戏代码以上讲解中如有疑问或错误欢迎大家在评论区指出

更多文章