从玩“扫雷”游戏推测出其中所使用的算法

来源:小歪说事    2019/8/14 10:56:08
责任编辑:张小俊
字体:

“扫雷”这款游戏相信大家都有玩过,难度分为简单,中等和困难。会玩扫雷的同学都知道其中的一些窍门和原理。

下面以简单难度为例。

1、简单难度是9*9的格子,一共10颗雷。

2、扫雷的时候,点开一个格子,如果是“雷”,那么gameover,

如果不是雷,那就有两种情况,第一种如果这个格子周围的其他八个格子中有“雷”,那么当前这个格子就会显示“雷”的个数,第二种如果周围的八个格子没有“雷”,那么这几个格子会被全部清空,且这种情况会裂变下去,只要打开的格子周围没有“雷”,那么它周围的格子就会清空,知道碰到“雷”才会停止。

3、最后只剩下10个格子,则游戏胜利。

以上就是扫雷游戏的特征。那么我们来研究一下其中所用到的算法。。。

1、首先我们得绘制9*9的方格,然后在其中安排10颗“雷”,9*9的方格可以用9个数组,每个数组包含9个元素来创建,10颗雷是随机排放的,很多系统都支持随机数的创建,利用随机数可以设置雷的位置(例如随机数是5,那就把雷放在坐标为(0,5),随机数是9,那就把雷放在坐标为(1,0))。

2、扫雷的时候需要对当前点开的格子进行判断,如果是雷,那么gameover。

如果不是雷,那就需要统计周围八格的“雷”的个数并进行显示,如果雷的个数为0,那么就需要将周围八格清空,并依次将八个格子周围雷的个数标注出来,如果同样存在个数为0的格子,那么这种清空的方式就会裂变下去。这里用到了一个比较常用也略微复杂的算法—“递归”。

“递归”算法主要是用来解决同一类问题,这种方式用起来比较简单,但是理解起来有点抽象。递归算法经典案例就是用来解决“汉诺塔”的问题,有兴趣的童鞋可以去网上搜索一下。今天我们主要讲解扫雷如何使用“递归”。

上面说到了,如果当前点开的格子周围的“雷”个数是0,那就需要对周围8个清空,然后依次对这8个格子进行检验,如果还有存在“雷”数为0的格子,那么对当前的格子采取相同的算法,这种过程会持续下去,直达碰到有“雷”的格子才会返回执行上一阶段的任务。举个很抽象的例子吧。就像是在一条大马路上开车,遇到岔路了(岔路就是触发条件,例如雷的个数为0),就将当前岔路都走一遍,过程中如果同样碰到岔路也以同样的方式开下去。

例如从A出发,先去B然后D,然后返回B,然后返回A,之后是C然后是E然后返回C,之后是F,然后返回C,然后返回A,结束。没错和二叉树很类似。这样就形成了一个“裂变的过程”。所以你会发现有时候点开一个格子会消失一大片,就是这样的工作流程。

最后留一个问题给大家,假如在扫雷之前需要将每个格子填上周围“雷”的个数,那么应该怎么设计这个算法?欢迎大家留言。

关注我,在之后的日子里与君共勉!

请注意:本文为编辑制作专题提供的资讯,页面显示的时间仅为生成静态页面时间而非具体内容事件发生的时间,由此给您带来的不便敬请谅解!

相关攻略及问答:

扫雷中布雷的算法

问:把算法仔细的说下

答:首先,你要先定义一个n*n的二维数组,该数组的i-1到i+1,j-1到j+1除去i,j本身。值为周围有几个雷。如果该数组的值为10则本身是雷。 接着,你自动生成m个雷,让这m个雷分布在界面上。被选中的值i,j点的值为10,从i-1到i+1,从j-1到j+1的值都+1;...

扫雷算法,自然语文或流程图描述均可

答:一般都第一个都是随便点的, 然后就开始计算了, 这处1、1、1说明有一个炸弹,三个一可以确定角山是一个炸弹,那就点开剩下的, 就变成这样了,有数字2就说明那里有两个炸弹,确定两个炸弹位置,其他与2相接的肯定不是炸弹 以此类推 就会出结果...

使用Javascript实现扫雷游戏的算法,用自然语言表...

答:做个10x10的div矩阵,然后产生随机数对其中10个赋予id=1,然后for循环遍历,赋予onclick事件,事件对应函数内有判断,是否有id,有的话游戏结束,没有则判断周围一圈有几个雷(这个用数学方法找一下就好),改变当前innerHTML值为几个

游戏扫雷有一种算法能分析出哪个是雷,是怎么算的...

答:当点开一大遍时,你就要跟据数字提示去推算,如有一排四个格没有点开,四个格旁边有一组提示数字,如2231,就可以分析,2周围八个方格里有2个雷,后面的数字也是,那就是前面三个是雷 求采纳

java扫雷递归算法

问:用java做一个扫雷,现在就剩关键的算法翻开周围没有雷德格子以及和他相...

答:根据规则,应该有个 “打开没有空白方格时递归打开周围空白或数字方格” 的方法; 还要有个 “点击数字方格时,判断周围8个方格标记地雷数量与数字是否相同,相同打开未标记地雷的方块” 的方法。 方格类的思路应该是 class fangGe{ //标记是数字空...

求一个六边形扫雷的算法!用java实现

答:扫雷是八个边吧? 用链表,初始化的时候每颗雷都以自己为中心,指向其他雷 class Mine { bool ismine; Mine up; Mine down; Mine left; Mine right; Mine leftup; Mine rightup; Mine leftdown; Mine rightdown; } void init() { Mine myMine[1...

c语言 扫雷的代码中当点开为空白时展开一大片的算...

答:一个效率较低的算法如下: 在WM_PAINT消息绘制窗口中,如果要绘的格子为空白并且已被点开,就找四周八个格的空白格子,设置为已经点开的。 设成计时发送WM_PAINT。

C语言扫雷算法,也可以别的语言,解释清楚算法就好

问:做一个数组随机布雷要固定雷的个数怎么用C语言解决,还有按出一大片无雷...

答:在这上面不好说明, 我有C的代码, 你看一下(DEVC++) #include #include #include #include #define n 15int restart=0;int last_sel_x,last_sel_y;char in[20];struct POINT{int x;int y;} pt;//设置CMD窗口光标位置void setxy(int x, int y){ CO...

C语言扫雷点到空白地方一次打开一大片的算法求解

问:我想写成递归的方式 void ClickBlank(int x,int y) //x,y分别为点击点的...

答:能把代码再多给点吗? 那8个递归其实可以用两个for来做的 void ClickBlank(int x, int y) {int i, j;if (isBlank(x, y)) {ShowAroundBlock(x, y);for (i = -1; i

Windows扫雷游戏地雷的分布是完全随机还是遵循一定...

问:Windows扫雷游戏地雷的分布是完全随机还是遵循一定算法?

答:那个扫雷一共有9999个。就是说。随机出给你。你也不会玩对同一个地图。。

www.haoxyx.com true http://getqq.haoxyx.com/g/2827/28276496.html report 4334 “扫雷”这款游戏相信大家都有玩过,难度分为简单,中等和困难。会玩扫雷的同学都知道其中的一些窍门和原理。下面以简单难度为例。1、简单难度是9*9的格子,一共10颗雷。2、扫雷的时候,点开一个格子,如果是“雷”,那么gameover,如果不是雷,那就有两种情况,第一种如果这个格子周围的其他八个格子中有“雷”,那么当前这个格子就会显示“雷”的个数,第二种如果周围的八个格子没有“雷”,那么这几个格子会被全部清空,且这种情况会裂变下去,只要打开的格子周围没有“雷”,那么它周围的格子就会清空,知道碰到“雷”才会停止。
最近关注
首页推荐
热门图片
最新添加资讯
24小时热门资讯
精彩资讯
精彩推荐
热点推荐
真视界
精彩图片
社区精粹
关于本站 | 广告服务 | 手机版 | 商务合作 | 免责申明 | 招聘信息 | 联系我们
Copyright © 2004-2017 haoxyx.com All Rights Reserved. 好心游戏网 版权所有
京ICP备10044368号-1 京公网安备11010802011102号