C语言初阶之扫雷小游戏

前言

扫雷小游戏相信很多人都不陌生,它的规则是在最短的时间内,玩家选择一个方格,若此方格没有地雷,那么该方格会显示与它相邻的八个方格中雷的个数,若此方格有地雷,那么游戏失败,当玩家把除了有地雷的方格外的其他方格都成功翻开时,游戏胜利,踩到一个雷则全盘皆输。如下图:
在这里插入图片描述

一、游戏框架

test.c:游戏逻辑的测试,包含游戏菜单的打印,游戏设计的基本逻辑的展示。
game.c:游戏功能的具体实现,这部分是整个游戏的核心代码,一般不会展示给用户。
game.h:相关头文件的包含、符号的声明以及函数的声明。

在这里插入图片描述

二、游戏实现步骤

1、游戏菜单

1:先准备好游戏菜单,规则为: 1 为玩游戏, 0 为退出游戏。
2:打印完菜单,准备输出数字进行选择,如果选1,就开始游戏,如果选0,就退出游戏,如果是其他,就返回并重新输入数字,这时候就需要循环了,因为至少需要执行一次,所以用do,while循环,条件为输入的那个数。

在这里插入图片描述

2、创建雷盘

#define ROW 9
#define COL 9

#define ROWS ROW+2
#define COLS COL+2

我们定义了两个棋盘,一个用于展示给玩家,并储存排雷信息;一个用于在后台随机生成雷并储存。这样就可以避免二者相互干扰或者相互覆盖;

同时,我们使用宏来定义雷盘的大小以及雷的个数,这样做的好处是当我们以后想使用更大的雷盘或者想增加扫雷的难度的时候,我们只需要改动这里一次即可,增加了代码的可维护性。

为什么在上面第二个定义行列加上2呢?
在这里插入图片描述

如图:假如我们要打印9X9的棋盘,那我们的二维数组大小也是9X9的吗?,不能,当我们排查位置1时,如果位置1处不是雷,那么我们就会依次检查位置1周围8个坐标是否有地雷,如果有,就会把地雷的数量显示在位置1处;但是当我们排查位置2时,我们发现, 数组排查雷时会发生越界,所以为了避免数组越界,我们就需要增加一系列限制条件,这样做无疑是比较麻烦的,所以有的大佬就想出了这样一种办法:在定义数组长度时我们直接在上下各加一行,左右各加一列的空间,并把这些空间中的数据初始化为非雷,这样,就轻松解决了数组越界的问题。

创建数组

char mine[ROWS][COLS] = { 0 };//mine数组 存放布置好的雷的信息
char show[ROWS][COLS] = { 0 };//show数组 存放排查出的雷的信息

3、初始化雷盘

初始化数组

在这里插入图片描述

因为我们两个数组都需要初始化,但是初始化的数值是不一样的,为了进行区分,我们直接增加一个参数set,然后传到初始化数组里面再去调用。
传值为字符 0 时,把mine数组元素内容初始化为字符 0 ,传值为字符 * 时,把show数组元素内容初始化为字符 * 。

在这里插入图片描述

4、打印雷盘

打印雷盘的时候,这里一共有两个雷盘,我们需要打印的雷盘是专门展示给玩家,并储存排雷信息的棋盘,即用 ‘ * ’ 初始化的棋盘。
所以我们打印出来给玩家看的是show数组,而mine数组,一般不会打印,因为布置好的雷不会让玩家看到。mine数组是为了方便我们去写代码和传值用的。

在这里插入图片描述

为了方便玩家看清楚我们排雷是在几行几列,我们就加上对应的行号和列号。

在这里插入图片描述

我们实际玩的是9X9的雷盘,所以我们只需要打印9X9的雷盘就可以。
传过来的是ROWS和COLS,我们后面接收参数的时候,只需要接收row和col就可以了。

5、布置雷

上面经过初始化打印出来的雷盘还没有埋雷,接下来我们就开始埋雷。
定义

#include <time.h>
#include <stdlib.h>
#define EASY_COUNT 10//简单版本的雷10个,之后可改动值

雷的分布位置: 每次雷的分布的位置是不一样的,是随机分布的。我们在布置雷的时候需要检查该位置是否已经有雷,避免重复布置。
所以我们在布雷操作的时候要调用随机函数rand( ),在使用随机函数之前,我们要先在主函数中使用srand( )函数生成随机起点,这样就可以保证每次雷的位置不一样了。

在这里插入图片描述

在这里插入图片描述
我们可以看到上图雷已经布置好,雷的位置是随机的,每次都不一样。

布置雷的范围: 因为我们玩家进行排雷是在9X9的棋盘内进行的,所以我们需限定布雷的范围也在9X9的范围内。
传过来的是ROWS和COLS,我们后面接收参数的时候,只需要接收row和col就可以了。
雷的个数: 每布置一个,要布置的数量就减少一个。

6、排雷

排查雷的时候我们首先需要让用户输入需要排查的坐标,然后判断坐标的合法性,如果坐标不在雷盘范围内,坐标非法,需重新输入。
该坐标已被排查时,不能重复排查。
统计排查坐标周边八个位置的雷的个数。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

如果坐标处是雷的话就炸死了,停止循环,打印出全部雷的位置,让玩家知道自己踩了哪颗雷被炸死,游戏结束。如果坐标处不是雷的话,就统计坐标周围八个位置雷的个数,然后放到show数组里打印。
已知9X9的雷盘有81个坐标,减去10个雷的坐标,剩下71个非雷的坐标,如果我们把不是雷的坐标全部都排完,则打印出全部雷的位置,游戏胜利。

在这里插入图片描述
以上程序,已经可以基本实现我们的扫雷了,当然这只是最基础的程序,还有很大的优化空间。

五、总代码

game.h内容

在这里插入图片描述

game.c内容

在这里插入图片描述

test.c内容

在这里插入图片描述

总结

感谢观看,欢迎三连,如有错误,欢迎指正。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值