用户:
Mellin_Amp查看:31 回复:29 评论:31 创建时间:2020-07-21T22:03:10
从扫雷开始的kitten进阶教程II
“我有一个梦想....就是要成为编程猫的code star!”

在阅读完了上一篇帖子之后:
(传送门)
精 【从扫雷开始的kitten进阶教程】巧建地图————二维数组的构建与应用
https://shequ.codemao.cn/wiki/forum/320472
有了神器(二维数组思想)的帮助,训练师阿短决心自己尝试制作扫雷
经过114514个日夜的冥思苦想,阿短终于自己悟出了布雷的方法

用喜闻乐见的随机数 每次都在1到256号随机一个格子(16*16的棋盘 格子编号是1-256)
想必有耐心看完第一篇帖子的训练师都知道
阿短肯定是又错了!
虽然的确能够实现随机布雷的效果,但各位也一定看到了
随机数随机数,要是随机出了重复的数,岂不是会让总的雷数减少?
比如运气很背,每次都随机出了1,结果这40次都往1号格子上按个雷
最终结果就非常尴尬了
为了避免出现同一个位置布雷两次的情况,屑慕斯就对此做出了一点点的改进如下
在抽取随机数的时候,如果随机到布过雷的位置
就让它再抽一次换一个位置,一直换到空地为止!
(因为雷数总小于格子数,所以不会有喵循环产生)
以上,便是“布雷”(过于简单)
有的小朋友就要问了:

那么接下来要做的,就是去“标数字”啦
我们不妨让0代表空地 1代表周围有一个雷……以此类推
标数字要从头到尾一个个标,所以先拿一个变量a
采用循环结构,对第a个格子进行分析,分析完了再令a增加1
这样就实现对每个格子数字的标注
众所周知,标数字有如下规则:
第一: 有雷的格子不能标数

第二:每个格子周围的数字数等于其周围8个格子的雷数(如图中央绿色的2)
那么这就很简单了吧
我们只需要把它一圈的格子,全都看一遍
是雷的就记录,不是雷就不管
对于某一格子 先创建变量sum=0 对周围一圈逐个判断如果遇到雷就使sum增加1
如何在抽象的数组里找到“上下左右”对应格子的编号呢?
我们拿出一个格子

想必各位高手们得出这一关系轻而易举(小学数学)
那么用编程猫的积木实现也就是这样的:
只要对它周围一圈的积木判断,是雷就将sum增加1

主要的想法我们已经实现了,接下来就是完善一些细节

看看这个被红色圈起来的格子,它周围有一个雷
但是难点来了,这个格子在边界处,它右面没有格子
这样的话我们的判定必须要排除这样的情况
比如如果想要看它正右方的格子有没有雷
前提是它正右方得“有格子”
结合上一节课的getx与gety函数我们可以知道
右面有格子:x≠16
左面有格子:x≠1
上面有格子:y≠1
下面有格子:y≠16
注:对于左上方之类的“复合”方向,只需要同时满足两个条件即可
上图这是对于它正右方有没有雷的判断
如果它不是最后一列,而且它右面有雷
就对这个格子周围雷数也就是变量sum增加1
我们以此类推(经过漫长的体力劳动)对周围的八个格子重复八次
就可以得出了这个!

是不是非常的amazing()
没错 只需要这些判断就能达成目标
就这样,我们就可以轻松地做出扫雷喜闻乐见的布雷和计算雷周围格子的数字了!
好了本期的教程就结束了(水完了)
很抱歉第一期讲述的内容不太清晰
这一次作者尝试采用更多代码配图和思路讲解
希望能得到更优的效果
还是老规矩,在结束时布置几个任务,供各位训练师练习