扫雷游戏的实现

本文详细介绍了扫雷游戏的基本原理,包括如何利用两个棋盘进行雷的分析和隐藏,以及如何在控制台上实现雷的扩散和判断。通过使用字符0和1表示非雷和雷,以及棋盘1和2的配合,展示了游戏设计的关键步骤和技术细节。
摘要由CSDN通过智能技术生成

一、扫雷游戏的基本原理

     首先棋盘上非雷与雷都是未知的。当我们点击其中某一个格子时,出现的只有两种情况非雷和雷,其中是非雷的格子,如果该格子周围(从格子旁边一个环绕一圈)没有雷,那么则显示为空白,如图1;如果该格子周围有雷则显示雷的个数(1-8),如图2;而在平常扫雷游戏中如果该格子周围无雷,它就会向周围扩散,周围的格子都会被显示出来,以此类推,直到扩散到空白格子周围有雷情况时,也就是一群数字包裹空白是时,如图3。通过非雷位置上显示的周围雷的信息,将所有非雷的位置全部排查完游戏才结束。这就是扫雷游戏的一个基本原理,这是一个扫雷游戏网页链接:http://www.minesweeper.cn/

 


、扫雷游戏的简单分析

1.根据上述对扫雷游戏的基本理解,我们不难发现第一步需要一个棋盘来放置我们的雷和非雷,可是即使我们用了一个棋盘放置了雷,但在控制台上实现时,连带着雷的信息也被打印出来了,那么有什么办法呢?耶,那就是再用一个棋盘来展示给玩家看,同时也遮盖了原来棋盘上雷的信息,那很多小伙伴到这可能就有问题了,有两个棋盘怎么分析呢?啥时候调用棋盘1,啥时候调用棋盘2呢?其实不难,棋盘1只有雷与非雷,单单用于来分析坐标位置上雷的信息,以及分析位置周围雷的个数;而棋盘2用于接收来自棋盘1的分析结果,也就时坐标周围雷的个数,然后将该位置周围雷个数打印出来。所以,调用棋盘1只用于布雷与分析,调用棋盘2只用于展示与接受分析结果。

2.有了两个棋盘后,那控制台上非雷与雷用啥表示呢?棋盘2的遮盖又用啥呢?有小伙伴可能会说“简单,用0,1”,“用*,#”等等,我们先分析一下哈,假设我们用0,1表示雷和非雷,哦?那不对哦!!!如果这0,1要是数字那就惨了,那我棋盘2用啥遮掩?也用数字?我们棋盘2本来就是用来接收周围雷的个数信息的,现在倒好,也用数字遮掩,那不就混淆了,Emmm...我棋盘2不用数字,用字符,那你得考虑一个问题,棋盘1是整形数组实现,棋盘2是字符数组实现,后面用棋盘1分析出雷的个数是整形,而棋盘2要的是字符,这不麻烦吗?可能又小伙伴说了分析出的结果加个字符'0',哈哈,当然这也是一种方法哈,那么作者我这为了方便还是推荐大家用字符'0'和'1',之后再传给棋盘2时也用字符的1,2,3,4...9。好了好了,后面为了方便,作者后面棋盘1雷用字符'1',非雷用字符'1',棋盘2遮盖用*号,大家在敲代码时建议跟我一样哈,不一样也没关系,加字符,字符相减一堆方法哈。这里就不再跟大家多赘婿了,爱用啥用啥,道路千万条,条条皆可通罗马。

3.棋局1,棋局2用啥表示不用我多说了吧,用两个二维数组哈哈。那么对这两个数组有啥要求呢?首先我们来看棋盘1,用于布雷与分析,布雷哈,那就是你想玩几乘几棋盘就创建多大的呗,可是棋盘1还有分析坐标周围雷的个数的作用,如果坐标在中心还好办,周围一圈的8个格子都在,如图4,那要是坐标在棋盘1的周围一圈,那就不好搞了,坐标周围一圈8个格子不全了,如图5,所以还是不能只以游戏棋盘大小来创建,要补全外围坐标8个格子,那就只有给棋盘1加一圈,也就是行列各加上2。棋盘1因为要分析的原因加了一圈,棋盘2加不加呢,我的建议是如果你不想找事那就加上,这样就能保证棋盘1和棋盘2的坐标一一对应,传的时候不需要改坐标,方便后面棋盘1坐标周围雷的信息传给棋盘2。注意一下,这里可能又有小伙伴问了,棋盘2展示的不只有游戏棋盘大小,加一圈在这里打印的时候不就麻烦了嘛,其实不不不,如图6,打印时我们还要在左上加横纵轴来方便观察,相当于我们用轴遮住了棋盘2的外围,而且打印棋盘时我们不打印棋盘2的外围,而是从[1][1]开始打印,所以关系不大。

4.还有一个重要的点就是,平常我们在玩扫雷游戏格子周围无雷,它就会向周围扩散,周围的格子都会被显示出来,以此类推,直到扩散到空白格子周围有雷情况时,那这个怎么搞的,其实分析就可看出,先查坐标周围8格,再查8格周围8格,以此类推,直到周围都是格子周围有雷的情况,就结束一轮。

三.扫雷游戏的基本步骤

1.大体游戏设计

tect.c来写游戏的大体,游戏菜单等,game.c来放我们游戏时用的函数,game.h头文件来声明函数,关键字等

 

2.棋盘大小的规定

这里建议大家用关键字定义大小和雷的个数,方便后面改大小,用ROW表示行,COL表示列,用ROWs表示ROW+2,用COLs表示COL+2,用Grade表示雷的个数。如:#define ROW 9,这里定义了一个关键字,注意,#define是定义,ROW关键字名称,9就是给关键字赋的值。

2.棋盘1和棋盘2的创建

上面我们讨论了,很简单哈,用char mine[ROWs][[COLs]表示棋盘1,mine就是我们自己可见的,用char show[ROWs][[COLs]表示棋盘2,show表就是给玩家看的,上面讨论了1,2的行列要相同。

3.初始化棋盘

棋盘1上全部先布置成非雷,字符0,再在非雷上布置雷,棋盘2上全部布置成*号。这里要打印两个数组,设计一个打印函数Print_board,如下图

4.布置雷

5.打印棋盘2

6.判断雷

 

 

                                                                                           

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值