1、扫雷游戏的功能说明
1.1:基本功能
1、使用控制台实现经典的扫雷游戏
2、游戏可以通过菜单实现继续玩或者退出游戏
3、扫雷游戏的棋盘是9*9的格子
4、随机布置10个雷
5、可以排查雷
(1)、如果位置不是雷,就显示周围有几个雷
(2)、如果是雷,就炸死游戏结束
(3)、 把除10个雷之外的所有非雷都找出来,则排雷成功,游戏结束
1.2:游戏分析和设计
1.2.1:数据结构分析
扫雷过程中,布置雷和排查雷都是需要存储的,所以我们需要一定的数据结构来存储这些 信息。
因为我们需要9*9的棋盘上布置雷的信息和排查雷,我们首先会想到创建一个9*9的数组来 存放这些信息。
如果某个位置布置雷,我们就存放1,其他的存放0。
在棋盘中,例如我们派排查5,5这个位置,如果不是雷,那得算出他附近的八个格子有几 个雷,然后显示在5,5这个位置。但是我们会发现如果是边界的几个格子,要想排查周围 八个格子就会越界。但是我们也暂时想不到有没有什么方法是专门解决这个问题的,因为 会越界的格子还是挺多,而且情况都有些许不一样。
我们可以创建一个比9*9大一圈的棋盘,即设置成11*11的棋盘,然后在设置棋盘的时候就 只对里面的9*9的棋盘进行操作。如下图所示:
还有就是当排雷的时候,如果周围就只有一个雷,那么和我们布置雷的时候的1就冲突 了。我们可以在布置雷的时候不使用数字来表示是否有雷。我们可以使用其他字来 表 示,使用其他的字符来布置就好了。
还有就是在一个棋盘上有雷的信息,非雷的信息,还要有这个格子附近有几个雷的信 息,这些信息在一起太混乱了。
我们可以设置两个棋盘,一个棋盘用来放布置好的雷(对应数组mine)的信息,另一 个棋盘(对应数组show)用来放排查好雷的信息。
同时我们要把给用户看的棋盘(show)初始化成字符' * ',然后布置雷的棋盘我们先初 始化为字符" 0 "。这个功能我们可以定义一个函数来实现。
大概就是上面的效果了。
1.2.2:文件结构设计
前面我们在函数那个章节学到了多文件的形式对函数的声明和定义,我们这边 通过这个例子实践一下
1、 text.c//写游戏的测试逻辑
2、game.h//写游戏需要的函数声明和数据类型
3、game.c//定义函数。
2、main函数的大致逻辑
这里和前面的 猜数字游戏基本一致,我们在此实现一个菜单,然后在main函数中让用户 选择。
3、创建棋盘
创建两个11*11的数组,一个用来存放布置雷的信息,一个用来排查雷
因为我们使用字符来表示是否是雷,使用创建一个char类型的。
4、棋盘初始化
我们对存放雷的数组先初始化为字符0。对排查雷的就先初始化为字符" * "。
由于这个功能需要重复使用,所以我们可以定义一个函数来实现这个功能,
1、初始化棋盘函数的名字:我们要取一个看名字就可以大概知道这个函数要实现的功能是 什么的名字。所以我们取名lnitboard。
2、函数参数:我们要对数组进行初始化,所以参数肯定要有一个是数组,然后我们要对其 元素进行遍历,所以要将数组的行数和列数也传递给函数,还有就是要初始 化的内容。
3、改进:我们现在如果要实现中级和高级难道的扫雷游戏的话,就要对数组的行数列数进 行改变,这样有点麻烦,我们可以把代表棋盘大小的数据用define定义一下。我 们可以定义一个常数9。我们要11*11的棋盘就在其基础上+2即可。
这上面的我们放在gema.h文件中,在text.c中包含这个头文件即可。我们把对数 组初始化的函数声明也放在game.h文件中,然后在game.c文件中对函数进行定义
5、打印棋盘
经过上面的初始化,但是我们现在还看不到棋盘,我们可以写一个函数来实现棋盘的打印, 将棋盘打印出来看我们每一步有没有正确实现。
1、函数名:我们可以使用和库函数里打印函数差不多的名字:printfboard。
2、函数参数:首先要传递数组给函数,还有就是数组的行数和列数,但是我们的棋盘是9*9 的那个部分,所以要传递的是ROW和COL。
3、函数的声明:和上面的初始化函数一样,我们在game.h文件声明,在game.c文件中定义
我们在游戏中只需要将存放排查雷的那个数组给用户看,不要将存放雷的数组打印了。
6、布置雷
在上面对游戏的分析,我们使用字符" 1 "代表雷,,字符" 0 "代表不是雷,则要将字符
" 1 "随机存放进数组mine这时候就又遇到了朋友随机数了。
1、函数名字:因为是要在数组mine上布置,所以我取为:SetMine。
2、参数:即为数组,还有数组的行和列,还有就是雷的个数也是一个常数,我们也可以使 用define来定义一下。
3、函数实现:
我们首先要在9*9的棋盘上随机放置" 1 "字符,所以得产生1~9即1~ROW的随机数
然后就是布置雷,将" 1 "放进数组中的随机位置。这个要注意的是存放的时候要除 去已经是雷的位置,这里我们使用一个if语句,然后是这个位置不是雷就存放,然 后雷的个数减1,当雷的个数变成0个的时候雷就存放好了。
7、排查雷
排查雷的关键就是判断用户输入的坐标是不是字符" 1 "。如果是字符1就说明踩到雷了,则游 戏结束,如果不是字符1,则不是雷,则要统计其周围有几个雷,即统计周围有几个字符1。 这个操作就要对mine数组和show数组进行操作了。
1、函数名:我根据其功能将其命名为Findboard.
2、函数的参数:因为涉及两个数组,使用参数肯定有数组,然后还有就是用户要排查的范 围应该在棋盘内,所以将棋盘的大小也传递给函数,然后还有就是雷的个数
3、函数的实现
1、首先我们提示用户输入要排的位置,并且输入的数据要在棋盘内,如果用户输入有误 就提示用户输入有误,重新输入
2、用户输入一个符合要求的坐标后,就判断输入的位置是不是雷,如果是雷就直接炸 死,游戏结束,而且当玩家游戏失败后我们可以将棋盘打印出来让玩家看咋输的。
3、然后这个位置如果不是雷我们就要计算这个位置周围八个的格子有几个雷。这里我们 可以再创建一个函数来计算。
4、如何计算雷的个数是个问题,因为我们使用的是字符0和字符1来表示的是不是雷,无 法和整型0,1一样直接计算,不过我们知道的是字符0的ASCII码为48,字符1的ASCII 码为49,那么使用字符1减字符0就是1了,就可以代表有几个雷了,那么我们可以将 附近八个格子的ASCII码相加然后减去8个字符0的ASCII码就是有几个雷了。
5、然后就是把这个结果返回给show数组了,我们可以将得到附近雷的个数加上字符0的 ASCII码就将其变成字符了,那么就可以直接赋个排查的这个格子了。
6、结束游戏的条件,当玩家将雷都排查出来游戏就完成了,我们可以创建一个变量win 来统计玩家已经排查的格子,当已经排查的格子win==row*col-count这个时候就说明 雷已经排查完了,也就是说循环的判断表达式应该为win<row*col-count。
7、函数的实现还是一样函数的声明放在game.h文件,定义放在game.c文件中,然后统 计附近雷的个数的函数要在Findboard的前面,因为在Findboard要使用。
8、源代码
9、如何将游戏分享给朋友玩
在vs中将其改成这样,然后运行一次,然后去文件夹找到Relese。找到扩展名为exe的可执行文化即可。
我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=6c6da1gg1x0b
标签:字符,游戏,排查,简易版,扫雷,数组,棋盘,我们,函数 From: https://blog.csdn.net/2302_81083101/article/details/143580840