本帖最后由 乙烯_中国 于 2016-3-20 18:15 编辑

大家好,我是乙烯。今天给大家带来我的扫雷的原理详解以及制作过程中的思考步骤。

此贴与【TRP出品】小游戏复刻系列——扫雷【bug修复】联动,强烈建议过去兜一圈。

在之前呢,还是惯例的闲聊几句。准确的说,我发布的版本是版本6.3。这次的扫雷呢,也是补上了TRP的入组审核,虽然分量还是不够足,但是我觉得制作这样的一个作品的过程,本身就是非常快乐的。虽然在制作版本3和版本4的时候有人给我喝过倒彩,也有人说国外有人做过了。但是我觉得,因此就放弃的话是不对的。
在开坑的时候应该大约是1.7时代,那时我几乎相当于命令方面的小白,只知道有哪些指令及功能,要我自己来写指令,那是完全不可能的。但是,人是一种会在挑战中成长的生物。就在这个过程之中,我自己对命令的认识可以算是大大提升了,而实际上,平时在论坛里的厚积薄发也帮了我很多忙。此外,如果不能坚持读到这句话的人,我觉得成功路上多多少少会有坎坷。



一、整理思路
扫雷,一个风靡全球的小游戏,简单的规则,然而却能够吸引很多的玩家挑战。那么我们现在来分析一下扫雷的规则:
  • 每个被翻开的格子,如果其不是雷,则会写出其周围8个格子所包含的雷数,如果是0则会翻开周围8个格子。翻开的是雷则游戏结束。
  • 翻开的第一个格子永远不会是雷。

好的,那么现在我们确定了一个目标,制作扫雷,那么我们就可以根据规则列出一张扫雷的游戏流程表。(由于在初期计划阶段,我们大概画画就好。)

Ok,那么现在我们有了一个初始的计划图,现在,由于我们是要在mc里制作这样一个游戏,那我们现在开始就要将其模块化条理化并添加mc元素进去。容我们来梳理一下思路:

  • 开局:由于我们要保证第一步翻开的格子肯定不是雷,那么显而易见,我们需要在开局,即翻开第一个格子的时候,生成整个棋局,才能完全保证我们所翻的格子不是雷。而我们也要保证生成完棋局的时候确实那个格子是被翻开的。同时呢,计时器也要开始工作。
  • 游戏中:这个地方很简单,我们需要检测玩家的类左键操作和类右键操作。同时对其进行处理,而我们还需要统计场上出现的旗帜数。最后,我们还需要进行胜利判定。
  • 胜利/失败:这个重点不多,我们只需要将地图剩余未标记的雷和标记错误的格子进行反馈。或者计算出玩家的时间是否能够开启修改英雄榜的方法。
  • 重新开局:这个地方也是非常简单的。直接就可以重置地图,统计,还有时间。
  • 英雄榜:将现有玩家的分数打印出来,同时给予玩家打印自己名字的权限。简单的说就是个打字机。

让我们简洁的整理下思路:
开局:生成雷局,开始计时器。
游戏中:检测输入,统计旗帜,检测胜利。
胜利:检查时间是否低于最优记录。
失败:反馈未正确标记的格子。
重新开局:重置雷局,重置计时器。

仔细看看其实我们要做的也不是特别多嘛,压力还是不大的。那么我们现在可以再将整理过的思路进行填充,增加实现方法。在开工各个部分之前,我们需要定一个整体的规划,这样就可以使我们建造出来的各个模块能够协同工作,可以理解为是某种协议。
  • 首先,扫雷需要是哪种显示方法?当然有很多选择,但是我这里使用的是展示框配合地图的显示方法,因为展示框不是方块,是一个实体,那么就可以很方便的用选择器来进行选择及操作,它可以响应左键右键和中键,而其和地图的联动让其的显示效果丝毫不亚于方块。而操作方法也就在这时候定下来了,单纯的左键右键以及中键。
  • 其次我们现在可以考虑模块之间有哪几种交流。生成雷局的时候,由于我定的规模是初级扫雷,那么就会有十个格子被标记为雷,而这个会在游戏中和失败两个模块里用到。计时器会在胜利模块中用到。旗帜会在失败模块里用到。

二、开工
那么现在我们可以开工了。由于我们选择的是展示框显示屏,所以我们只能通过高频检测的情况来进行正常游戏。
这里我将我的电路截图进行说明,有图为证,整个扫雷的电路的确是模块化的产品:


制作开始。

这里是将地图进行预加载的地方,然而由于失误,我漏掉了没有雷的格子。

注:文中指令方块部分使用了绝对坐标,具体制作中请参考具体地图位置。

第一部分:开局


第二部分:游戏中


好的…实际上到这里,整个扫雷的主体已经完工,接下来就是一些非常简单的玩意儿。

胜利模块


失败模块


英雄榜模块
就是一个tellraw的打字机。鉴于命令过长,我将另外开贴进行说明。
请转至http://www.mcbbs.net/thread-441864-1-1.html观看


  

[groupid=143]The Redpixel[/groupid]