【C语言/C++】扫雷小游戏

1、代码规划

1、创建一个源文件test.c 游戏的测试逻辑
2、创建一个源文件game.c 游戏的实现逻辑
3、创建一个头文件game.h 游戏实现函数的声明

2、构思代码

1、首先我们需要一个简易的游戏界面
2、初级的扫雷游戏需要9*9的雷阵,所以我们要初始化雷阵
3、打印雷阵进行游戏
4、布置雷的信息(在玩家不可见的雷阵上)
5、排查雷的信息
6、

3、代码模块实现

1、游戏菜单

运用do-while循环来实现菜单的打印
在这里插入图片描述
在这里插入图片描述

2、初始化雷阵

创建一个函数InitBoard用于初始化雷阵
1、由于初级难度的扫雷游戏需要9*9的雷阵,所以我们自然而然的联想到二维数组的知识。
2、我们需要创建两个棋盘,一个棋盘用于存储布置好的雷的信息,另一个棋盘用于存储玩家排查出的雷的信息
3、由于考虑到我们排查雷阵边界的雷时,有可能会产生的数组越界的问题,所以在创建二维数组的时候,我们选择将 9 * 9的二维数组拓展到11 *11的大小,这样及时排查到雷阵的边界,也不会产生数组越界的问题
在这里插入图片描述
利用宏定义来限制雷阵的大小,其有点是未来想要修改雷阵的大小时,我们只需要修改宏定义之后的数字就可以轻松做到修改雷阵大小。
在这里插入图片描述
在这里插入图片描述

3、打印雷阵

1、我们将隐藏的雷阵(全初始化成字符0)和展示给玩家的雷阵(全初始化成字符’ * ')都初始化完成之后,需要打印出来查看效果
2、创建一个打印棋盘的函数DisplayBoard
在这里插入图片描述
在这里插入图片描述
最后创建的两个棋盘效果如下
在这里插入图片描述
为了让棋盘足够的美观,我们可以在打印棋盘的时候添加上棋盘的行号列号
在这里插入图片描述
这样打印出来的雷阵就会自带行号和列号,需要排查哪个位置的雷就一目了然。

4、布置雷的逻辑

1、我们需要运用随机数来生成雷,需要运用到库函数的srand函数

srand((unsigned int)time(NULL));

1、time函数需要引用头文件time.h
2、srand函数需要引用头文件stdlib.h
3、编写一个SetMine函数来实现布置雷的功能
首先我们需要将生成的随机数限制在1~9之间,才能让雷处于雷阵之中
所以我们将随机数分别对行数和列数取余,并把余数+1,得到的数字范围就是在1~9之内
在这里插入图片描述
布置好雷之后我们将雷阵打印出来看一下雷阵是否是我们想要的效果

在这里插入图片描述
最后得到一个这样的雷阵。

5、排查雷的逻辑(重点)

1、首先我们要在mine雷阵(玩家看不到)之内排雷,然后将雷阵该点的信息让show雷阵接收。
2、限制玩家的排雷坐标,如果玩家输入的坐标超出雷阵的范围,我们需要提醒玩家坐标非法
3、如果排雷失败就告诉玩家“排雷失败”,并且将mine雷阵打印出来给玩家查看,让玩家知道自己是怎么失败的
4、如果排雷成功,需要告诉玩家,该点周围有几个雷
首先我们要创建一个FineMine函数来实现排雷的功能
在这里插入图片描述
再创建一个get_mine_count函数来实现对排查点位周围雷的数量的统计
在这里插入图片描述
由于我们之前创建雷阵的时候将数组全都初始化成字符’ 0 ‘,布置雷的时候将雷布置成字符’ 1 ',所以在计算雷的数量的时候,我们需要把排查点位的周围八个点位相加,并减去8 * ’ 0 '(字符0)才能够得出我们想要的数字。
Tips:
1、数字1 +字符’ 0 ’ = 字符’ 1 ’
2、字符’ 1 ’ - 字符’ 0 ’ =数字1
3、在函数前加static修饰函数,使函数只能在game.c中被调用

6、判断胜负

点完所有没有雷的地区,即为游戏胜利,所以我们可以创建一个变量win,win与 没有雷的格数 比大小,判断游戏的胜负
在这里插入图片描述

4、深度思考

扫雷游戏展开一片空白的效果如何实现:
1、该处坐标不是雷
2、该坐标的周围也没有雷
综合1,2两点,可以的出结论,将该坐标设置为空格’ ’
3、该坐标没有被排查过
综合上诉条件,我们可以使用递归的方法去排查

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值