二维数组的应用之====》扫雷游戏(精简版)详解

简介: 二维数组的应用之====》扫雷游戏(精简版)详解

前言:Hello!我是@每天都要敲代码,今天我们一起来学习一下,二维数组的应用===》扫雷游戏;这算是我们设计的第3个游戏了;它的大体框架和前两个游戏类似,还不太了解的小伙伴不妨去看一下:改版的猜数字游戏和三字棋游戏,下面让我们一起学习吧!


1.大体框架


   这里我们就不在多赘述,有了前面两个游戏的设计,相信我们已经熟练掌握了,下面直接上代码:

64677d54b48843ee84bb56cacad1179a.png逻辑测试:

933844664b3a469b98dd2a55e80fe2ec.png



2.游戏具体功能设计环节


 接下来就是最核心的扫雷游戏的实现环节;老样子我们先封装一函数game();用这个去代替case 1打印的内容,然后把所有的功能函数都写到game()函数里;让我们一起动手写一下把!


2.1 初始化:InitBoard


首先我们要思考我们要初始化什么?要创建几个数组?我们不妨去玩两把扫雷游戏去体验一下:扫雷游戏,这里我们就需要注意两点:


1. 我们需要两个字符数组,一个mine数组用来保存布置雷的信息,另一个show数组用来保存排查出雷的信息,并且我们才开始把mine数组初始化为字符0,随机布置雷的时候在改为字符1;show数组我们需要全部初始化为字符*,当这个位置不是雷的时候,我们在统计它周围有几个雷的信息存储起来。


2.对于数组的大小我们怎么设置呢?假如才开始是9*9的格子,如果数组的大小我们就定义为9*9就会出现问题;如果是边界的情况下,我们去统计它周围雷的信息个数,是不是就会造成越界;所以我们就不妨上下左右都多一行,就是11*11,为了使坐标能对应起来,我们把两个数都设置为相同的大小。例如:以下这种情况,我们设置大一点就不会造成越界!

2de091082c554615b8e632e3cf49f449.png

接下来最关键的来了,我们要初始化两个数组,并且我们两个数组初始化的值还不一样:一个初始化为字符0,一个初始化为字符*;怎么办呢?写两个初始化的函数?所以我们不妨在传参的时候多传一个参数,最终共用一个初始化函数;你传过来什么,我就初始化为什么。


注意:初始化时我们把11*11的网格都要初始化,等我们真正使用打印的时候只用9*9就可以了。


具体代码实现:


1269732c55834f4eac0f45bfdcb4de25.png

b988a1cc44dc4dcdb11a61607b2d689f.png


1c1aa93eea75436ead50af65882f1507.png


2.2 打印:PrintBoard


   对于打印很简单就不在说什么;值得注意的是,我们只打印出来中间9*9的格子就行;并且为了下面排雷输入坐标方便,我们不妨在打印时把序号也打印上。


具体代码实现:


abaf0bd6ed3c4926a8862f3cc25d1ef0.png


逻辑测试:

8c8f826a4bb3474ca1e18e883286028e.png


2.3 布置雷:SetBoard


接下里我们就需要在mine数组里布置雷了,利用产生随机数来布置雷;产生随即数前两个游戏也有很详细的解释了,就是利用rand和srand函数,这里就不在多说。随即数产生后我们想布置几个雷循环就写多少;需要注意的是:我们只有当前坐标位置是字符0时,我们把它改成字符1,才算设置雷成功,让循环次数减少一次;如果当前已经是字符1,就让它重新产生随即数。


具体代码实现:

2d7fa815f6a54dc58714001c2d7dabfc.png


逻辑测试:


543c817ad0b347558e73311c4bf339f7.png


   当然我们在玩的时候,mine数组我们是不该打印的,到时候直接屏蔽掉就可以,这里只是为了更好的测试!

2.4 排查雷:FindBoard


对于排查雷我觉得是整个扫雷游戏中少稍微麻烦难一点的,前面的设计都很简单,这里就需要我们花一点心思:


第一步:我们需要输入排查的的坐标,首先判断坐标的合法性;坐标合法了,再判断是不是雷,是雷就被炸死了,我们就需要打印一下mine数组,告诉玩家你为什么被炸死了;最后break跳出循环。


第二步:如果不是雷呢?我们就需要统计mine数组当前位置周围有几个雷,我们封装个get_mine_count函数,这个函数我目前知道两种实现方法,今天将都展示给大家。需要注意的是我们统计的个数count返回的是int,而我们需要的是字符,所以我们把count+'0'就可以了,并把这个值赋给show数组;接下里打印一下show数组,查看排查的状态,并让变量加1,这样循环次数减少1,直到我们把所有的不是雷的坐标都筛选出来,就跳出循环。


具体代码:


a9d880cd9f1548309792e30232867e82.png

逻辑测试:

正常排雷:

670cf751b2264695b9bb221aa571e5da.png

排到雷炸死了:

441ede717e2f4be59ce1003100001dfa.png


通关:对于全部排出雷通关,我们不妨换个思路,多设置雷,比如设置80个雷,只有一个没有雷,如果我们把这个雷排查出来,显示我们通关了,说明逻辑就没问题:

0dfcdbfe15d6484b89c03032cc72cdd1.png

所有代码:

image.png



总结:对于扫雷游戏只要把逻辑理清楚了,其实比五子棋逻辑简单多了,除了我们排查雷麻烦一点;最主要的还是思路要清晰,理清我们的字符和数之间的转换。还是那句话,能一口气写出来的小伙伴,一定要尝试写成项目的格式!!!这里我是专门整合到一块的,方便理清楚思路和截图。


结束语


今天的分享就到这里,想要提升编程思维的,快快去注册牛客网开始刷题吧!各种大厂面试真题在等你哦!


💬刷题神器,从基础到大厂面试题👉点击跳转刷题网站


184068dc41e94efbb14e555f972eaa17.png

相关文章
|
5月前
|
存储 C语言
数组和函数实践:扫雷游戏玩法和棋盘初始化(1)
数组和函数实践:扫雷游戏玩法和棋盘初始化(1)
|
5月前
|
C语言
C语言之详解数组【附三子棋和扫雷游戏实战】(二)
C语言之详解数组【附三子棋和扫雷游戏实战】(二)
|
5月前
|
存储
扫雷游戏讲解(第一版本)
扫雷游戏讲解(第一版本)
35 0
|
5月前
|
存储
数组和函数实践:扫雷游戏
数组和函数实践:扫雷游戏
|
5月前
|
C语言
以c语言为基础实现的简易扫雷游戏(游戏代码附在文章最后,如有需要请自取)
以c语言为基础实现的简易扫雷游戏(游戏代码附在文章最后,如有需要请自取)
243 1
|
C语言
C/关于扫雷小游戏的创建
C/关于扫雷小游戏的创建
|
5月前
|
存储 编译器 C语言
C语言之详解数组【附三子棋和扫雷游戏实战】(一)
C语言之详解数组【附三子棋和扫雷游戏实战】(一)
|
11月前
|
C语言
扫雷游戏(数组与函数实现)
扫雷游戏(数组与函数实现)
|
C语言
【C语言】数组的应用实例:扫雷游戏
扫雷的游戏规则 扫雷就是要把所有非地雷的格子揭开即胜利;踩到地雷格子就算失败。 游戏主区域由很多个方格组成。使用鼠标左键随机点击一个方格,方格即被打开并显示出方格中的数字;方格中数字则表示其周围的8个方格隐藏了几颗雷。
103 0
【C语言】数组的应用实例:扫雷游戏
|
编译器 程序员 C语言
【C语言】 数组的应用实例:三子棋游戏
三子棋规则 将正方形对角线连起来,相对两边依次摆上三个双方棋子,只要将自己的三个棋子走成一条线,对方就算输了 三子棋游戏运行步骤,进入游戏界面,选择进入游戏或者退出游戏,输入1或者0来实现进入游戏或者退出游戏,棋盘进行初始化处理,打印空棋盘,玩家进行下棋,电脑下棋,判断输赢 判断输赢分为: 玩家赢 电脑赢 棋盘无空位(双方平局) 继续下棋(返回第6步)
122 0
【C语言】 数组的应用实例:三子棋游戏