扫雷游戏分析和设计

一.扫雷游戏概述


扫雷游戏是一款经典游戏,是在一个9*9(还有其它大小的)的棋盘上,默认里面有10个雷,每个格子有两种状态,有地雷或者没有地雷,当我们成功避开所有的雷时游戏胜利。游戏


 二.游戏规则介绍


1.在游戏界面随机点一个位置

2.如果位置是雷,就炸死游戏结束

3.如果位置不是雷,就显⽰周围有⼏个雷

4.再继续选择,如果位置不是雷,就显⽰周围有⼏个雷,如果位置是雷,就炸死游戏结束

5.把除10个雷之外的所有⾮雷都找出来,排雷成功,游戏结束


三.游戏的分析和设计

1.先创建一个菜单用于选择是否进入游戏或退出游戏。

2.创建布置雷的棋盘并且初始化,布置雷时用1表示雷,不是雷用0表示。

3.布置雷,打印初始化的棋盘

4.输入排查的坐标

5.等待结果

四.rand和srand函数

1.rand

C语⾔提供了⼀个函数叫rand,这函数是可以⽣成随机数的rand函数会返回⼀个伪随机数,这个随机数的范围是在0~RAND_MAX之间,这个RAND_MAX的⼤⼩依赖编译器上实现的,但是⼤部分编译器上是32767。
rand函数的使⽤需要包含⼀个头⽂件是:stdlib.h

其实rand函数⽣成的随机数是伪随机的,伪随机数不是真正的随机数,是通过某种算法⽣成的随机数。真正的随机数的是⽆法预测下⼀个值是多少的。⽽rand函数是对⼀个叫“种⼦”的基准值进⾏运算⽣成的随机数。如果要⽣成不同的随机数,就要让种⼦是变化的。

2.srand

C语⾔中⼜提供了⼀个函数叫srand,⽤来初始化随机数的⽣成器的
程序中在调⽤rand函数之前先调⽤srand函数,通过srand函数的参数seed来设置rand函数⽣成随
机数的时候的种⼦,只要种⼦在变化,每次⽣成的随机数序列也就变化起来了

五.代码实现

1.⽂件结构设计

2.创建主函数main()

在主函数中创建一个整形变量input,在创建一个do......while循环,用input表示输入的值判断菜单的选择,通过do....while语句的特点先打印出菜单(需要先创建菜单函数),在创建switch语句通过之前输入的Input判断,如果输入的是1则进入游戏,如果输入的是0则退出游戏,输入非0非1则显示错误,重新选择。

3.创建菜单函数

4.创建game函数

①棋盘的范围

棋盘的创建根据游戏规则选中非雷的格子时需要显示以它为中心周围八个格子中的雷的个数,
我们遇到一种问题当坐标现在最外一圈时会出现越界问题,这时我们只需要扩大一圈即可,即打印11*11

②棋盘的数量

假设我们排查了某⼀个位置后,这个坐标处不是雷,这个坐标的周围有1个雷,那我们需要将排查出的雷的数量信息记录存储,并打印出来,作为排雷的重要参考信息的。那这个雷的个数信息存放在哪⾥呢?如果存放在布置雷的数组中,这样雷的信息和雷的个数信息就可能或产⽣混淆和打印上的困难。

这⾥我们采⽤⼀种⽅案,我们专⻔给⼀个棋盘(对应⼀个数组mine)存放布置好的雷的信息,再给另外⼀个棋盘(对应另外⼀个数组show)存放排查出的雷的信息。这样就互不⼲扰了,把雷布置到mine数组,在mine数组中排查雷,排查出的数据存放在show数组,并且打印show数组的信息。

③棋盘初始化

同时为了保持神秘,show数组开始时初始化为字符'*',为了保持两个数组的类型⼀致,可以使⽤同⼀套函数处理,mine数组最开始也初始化为字符'0',布置雷改成'1'。如下如

test.c

game.c

game.h

④打印棋盘

因为将mine数组的信息传给show数组,所以只要打印show数组就行。首先我们从0开始打印列的序号,在打印好第一行后换行,此后换行后第一个数都是打印行的序号,最后结果如下

⑤布置雷

已知雷的个数为10,创建while循环,当雷的数量为0时不在循环,同时要⽣成随机的坐标,布置雷,要确定雷的范围均在行和列的范围内,这时我们创建整形变量x,y确定雷的范围在区域内,在这里我们需要用到rand函数(这函数是可以⽣成随机数的)。

为了防止布置雷在同一地方,可以通过if判断

⑥排查雷

字符’0‘ASCII为48,字符’1‘的ASCII为49,我们可以将所选的格子周围8个格子里的字符ASCII相加在减去8个字符’0‘的ASCII,char转化为int方便计算。

然后创建while循环和整形win(代表排雷次数),条件为win < row * col - EASY_COUNT就是:排查的次数<行*列--雷的个数,先输入坐标如果坐标在棋盘范围内,则进入if循环,如果不在坐标内则提示重新输入,进入if循环后如果中”雷“,则打印你被炸死了并且打印mine数组,如果没中”雷“则将周围雷的个数由int重新转化为char,并且win++

六.全部源码

test.c

game.c

game.h

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值