2015-12-16_06.03.42

作者:nenn(百度id:正正正正正好

注1:本文中提到的所有Minecraft版本均为1.8.8。

注2:禁庄转。


关于生存模式的玩法,大家各不相同。有些玩家倾向于娱乐玩法,和朋友一起种种田养养牛,生活好不滋润。有些玩家倾向于PVP或者PVE,喜欢那些经过设计的游戏地图。当然,还有些玩家执着于技术玩法,他们探索Minecraft的规律,并尝试实现某些他人未曾实现的功能为乐趣。

这篇文章则不完全是为了这些技术玩家准备的。或者说,这篇帖子的核心内容不是什么新鲜的科技,而是已经被技术玩家熟练掌握若干年的游戏机制——游戏的刷怪机制。但是刷怪机制要不静静地躺在游戏的源代码里,要不就是躺在大触的文字堆里(详见《【半教程向】超高效刷怪装置的设计》),很难被普通玩家接受并熟悉。

这样的状况造成了技术发展的两极化。大触精通技术,但是却没有一种合适的渠道表达,使得技术更容易被接受;普通玩家则对一些机制不感兴趣,虽然经常遇到问题,但是却束手无策。本文尝试使用CB(命令方块)来使游戏的刷怪机制变得可视化,希望这样能够更容易被接受或记忆。如果这样,那么我写本文也达到了期望。

刷怪小实验

过于基础或者偏题的内容这里就不赘述了,比如有什么怪啦,刷怪有什么用啦。每一种怪有每一种怪的生成机制,但是大体可以分为三类:

1)游戏自然刷怪

2)刷怪笼刷怪

3)地狱门刷怪

游戏自然刷怪是指游戏根据玩家位置以及周围环境进行的刷怪。例如晚上草原上的骷髅和僵尸,地狱里的僵尸猪人,末地的末影人等等,但是自然刷怪都存在上限,因此你不会看见漫山遍野的怪物朝你涌来。刷怪笼刷怪则是指通过刷怪笼刷出的怪物,其最大的特点是不存在上限,只要满足刷怪条件,就可以无限生成怪物。地狱门刷怪则是特制地狱门刷出僵尸猪人的机制。其比较特殊,同样不受制于上限,可以无限刷。

本文的刷怪机制是自然刷怪。我们想看看,当满足刷怪条件时,刷怪遵循什么样的空间分布。

我们将怪物生成的位置和种类用彩色玻璃记录下来,然后杀死怪物。在x=8,y=4,z=8处如此挂机一段时间后,看到了这样的结果:

QQ20151213070033

我们发现,这个分布着实有意思。看起来大部分怪物都集中在了一个类似光盘的带状区域内。但是还有一些怪物生成在这个区域外侧。我们继续挂机。随着刷怪越来越多,这个分布也越来越清晰。

QQ20151213085129

这里的红色方块是参考用的,表示一个区块的大小。我们可以看到,绝大部分怪物生成在了以玩家为中心的15×15个区块内,但以玩家为中心,48格为直径的圆内却不会有任何怪物生成。

虽然这个结果看起来非常整齐,但是当刷怪较少时,那个圆形区域又是什么呢?

这次我们尝试使用了彩色羊毛进行刷怪,与彩色玻璃不同的是,彩色羊毛上可以继续刷怪。此外,这次我们选择了另一个地点(x=0,y=30,z=0)进行挂机。刷出怪物后也稍微增加了些延时再将怪物位置和种类记录成彩色羊毛。挂机一段时间以后,我们却看到了下面的分布:

QQ20151213195822

QQ20151213195751

这里可以清晰地看见一个以玩家为中心,直径达到256格的圆形区域,但是中间的圆形区域不复存在。此外,边上还能看见一个边长约260的正方形轮廓,但是这个正方形却不以玩家为中心,而是以玩家所在的区块为中心。

QQ20151216075257

此外,有些怪物甚至生成在距离15×15个区块边界16格外的地方。这也说明了,可刷怪区域达到了19×19个区块。

根据这些现象,我们可以归纳出下面的结论:

1)怪物不会在离玩家24格以内的地方生成。

2)绝大部分怪物生成在以玩家所在区块为中心的15×15个区块的正方形范围内,所有怪物不会在同中心的19×19区块以外生成。

3)上条体积的区域内,离玩家128以内,更多怪物被CB记录。

上面这几条里面,3)含有的信息量是最大的。这说明,如果生成怪物和使用CB记录怪物这两件事情相差更多的时间,那么正方形区域内以玩家为圆心的大圆以外,会有更少的怪物被记录。2)的信息量同样不小,它说明怪物的生成存在一个范围,但是这个范围却不是以任何区块为边界。

刷怪机制

这样的小测试是不是更容易激发起对刷怪这件事情的思考呢?那么是时候搬出源代码触读取到的游戏机制了。我们来看看德芙(Defanive)如何解释刷怪机制:

【详解】刷怪塔的设计原理及技巧

刷怪循环过程

一个刷怪循环进行的过程比较复杂,在这里只讨论怪物的刷怪情况:
判断怪物数量是否达到怪物总数封顶,如果达到封顶则取消本次循环
选择一种刷出的怪物,进行一组怪物的刷怪尝试
从主角为中心的15×15个chunk(一个chunk是16x16x256大小)中随机选取一个可用的位置,作为这组怪物的刷怪中心
一个可用位置的判断是:这个位置必须是非实体方块和非液体方块;下方必须是实体方块;上方必须是非实体方块;怪物不会被其他方块窒息;主角空间距离24格之外
如果位置符合,这一组进行12次刷怪尝试,最多刷出4只怪物
每次刷怪尝试,从41x41x1的空间内选择一个可用的位置
然后进行亮度判断,根据亮度不同会随机选择是否否决本次刷怪,亮度从0到7否决率增加,7以上否决率100%;如果收到天顶亮光(阳光或者是月光),否决率再增加50%
史莱姆和小黑增加90%的否决率
如果一切都符合并且未被否决,那么在这个位置刷出一个怪物

800px-Mob_spawning_ranges

根据怪物与主角的空间距离,怪物会有不同的行为
注意这里是空间距离,也就是说是以主角为中心的球体范围
16以内:刷怪笼刷怪
24以外:刷怪循环刷怪
32以外:怪物不运动,随机消失
128以外:怪物立即消失
关于32格以外时的随机消失,在每个game tick中怪物有1/800的机会消失
平均来说一个怪物离开主角32格之后只能存活40秒
精确的来说,半衰期是27.73秒

也就是说,怪物不会在距离玩家24格以内的地方生成,但是绝大多数会生成在以玩家所在区块为中心,15×15个区块的范围内。此外,刷出的怪物远离玩家128格以外,则会很快被游戏删除,这也就是为何我们会看到一个巨大的圆形区域,其内被CB记录的怪物更密集。

可以看到,小实验的结果与刷怪机制吻合非常好。德芙(Defanive)解释的刷怪机制能够解释小实验中的每一个细节。

刷怪小实验细节

我们开启一张空地图,将其设置为超平坦。然后关闭地图的昼夜循环。

/gamerule doDaylightCycle false

根据要求选择不同位置进行挂机。我们希望CB能够记录下怪物的生成位置,也就是在怪物脚下放置作为标记的方块。为了避免在同一个地点重复刷怪,我们希望放置的方块是透明方块。这样,怪物就不会生成在标记用的方块上。我们还希望标记的方块能够记录怪物的种类,因此彩色玻璃是不错的选择。

/execute @e[type=Zombie] ~ ~ ~ setblock ~ ~-1 ~ stained_glass 13
/execute @e[type=Skeleton] ~ ~ ~ setblock ~ ~-1 ~ stained_glass 0
/execute @e[type=Creeper] ~ ~ ~ setblock ~ ~-1 ~ stained_glass 5
/execute @e[type=Enderman] ~ ~ ~ setblock ~ ~-1 ~ stained_glass 15
/execute @e[type=Spider] ~ ~ ~ setblock ~ ~-1 ~ stained_glass 12
/execute @e[type=Witch] ~ ~ ~ setblock ~ ~-1 ~ stained_glass 10

上面这段代码的意思是,不同的颜色对应不同的怪物:

Grid_Green_Wool僵尸

Grid_White_Wool骷髅

Grid_Lime_Wool爬行者

Grid_Black_Wool末影人

Grid_Brown_Wool蜘蛛

Grid_Purple_Wool女巫

但如果我希望标记方块不会影响怪物的生成,那么彩色羊毛就是不错的选择。

每次放置方块后,我们都希望怪物被立即删除,以免影响后续的刷怪。因此我们还需要一个CB执行下面的代码。

/kill @e[type=!Player]

我们使用一个带有比较器的时钟信号发生器,就可以不断激活写有上述代码的CB。千万别忘了,需要不断将天气调节到晴天,以免下雨影响末影人的行为。
/weather clear

于是我们就可以开启时钟信号发生器开始挂机了。

关于刷怪塔的设计

刷怪塔的设计并不困难,只要熟悉刷怪机制,那么很容易建造出效率理想的刷怪塔。虽然之前的小实验揭示了怪物生成的空间分布,但是这并不是完整的刷怪机制。还需要补充的内容就是,刷怪存在刷怪上限,如果怪物数量已经到达了刷怪上限,那么刷怪循环就会停止,也不会有怪物生成了。因此把握刷怪塔设计的关键在于两个方面:

1)如何获得更大的有效面积,使刷怪尽可能多

2)如何更快杀死刷出的怪物,避免其占据上限

所有成熟的基于自然刷怪循环的刷怪塔方案,都是统筹考虑了这两方面的因素才进行设计的。关于刷怪塔设计的其他细节,推荐下面这些链接。这些链接从原理上分析刷怪塔应该如何建造,因此能够保证方案足够成熟和优化,这相比于普通的未经推敲和实验的方案来说,含金量高得多。

【详解】刷怪塔的设计原理及技巧

【半教程向】超高效刷怪装置的设计

只要看懂了这两个帖子,设计刷怪塔就不再需要大触的帮助了。因为这时候,你自己已经大触附体。当然, 当你再回顾本文的时候,会觉得本文通俗易懂。

逆天小实验

其实之前的小实验不够严谨,只给出了x和z方向上的刷怪分布,不知道有多少人看出来了这一点。不过没关系,这次我来让你一饱眼福。

我们假设刷出的羊毛不再放置于怪物脚底,而是直接放在怪物的位置,那么羊毛将逐渐垒高。我们可以想象,当垒高到一定程度时,距离玩家24格以内的区域则不再刷怪。所以理想情况应该是,通过这种方法可以得到一个半径为24格的球形,其中没有任何怪物生成。

于是我真的去做了。。。真的。。。虽然代价有点大。。。

把挂机位置选在x=8,y=30,z=8。

把那些标记用的CB代码换成:
/execute @e[type=Zombie] ~ ~ ~ setblock ~ ~ ~ wool 13
/execute @e[type=Skeleton] ~ ~ ~ setblock ~ ~ ~ wool 0
/execute @e[type=Creeper] ~ ~ ~ setblock ~ ~ ~ wool 5
/execute @e[type=Enderman] ~ ~ ~ setblock ~ ~ ~ wool 15
/execute @e[type=Spider] ~ ~ ~ setblock ~ ~ ~ wool 12
/execute @e[type=Witch] ~ ~ ~ setblock ~ ~ ~ wool 10

然后,挂机2天。对,48小时。当然,你可以用mod加速游戏时间,但是为了表达忠于原版的态度(其实只是懒得测试mod的影响,蹭了实验室电脑挂机而已,别想太多),我们还是使用了原版。

得到的结果是非常有趣的。

当挂机一天左右的时候,我们可以看到一个巨大的方形区域,以及中间真空的半径24格的半球。当然, 这只是个轮廓。

2015-12-15_01.22.08
2015-12-15_01.22.58
QQ20151216075027

挂机第二天,一个半球就非常明显了。

2015-12-15_06.34.23

继续挂机以后,半球形越加明显。
2015-12-15_13.19.22
最有趣的还是其边缘。还记得第一天的时候只有一个方形区域,而到了第二天,则出现了一个圆柱形。这个现象的原因也很好解释,由于挂机在y=30处,因此当第一天时,由于刷怪的位置几乎都在离玩家128格以外,因此羊毛的密度差不多。但是当第二天后,一些羊毛垒得较高,进入了距离玩家128格以内的区域,因此被CB记录下来的几率大大增加。由于y方向上怪物总是生成在羊毛顶部,因此也只有x和z方向可以清晰看到这种分布,得到的结果就是这种圆柱形轮廓。

2015-12-15_13.21.20 2015-12-16_05.56.23
2015-12-16_05.57.47
2015-12-16_05.58.38
2015-12-16_05.59.03
QQ20151216074953

总结

对已经精通刷怪机制的技术玩家来说,这个实验的解释也许是非常无聊的。对游戏机制不感兴趣的玩家,这个实验的解释同样非常无聊。也只有对那些对游戏机制比较感兴趣但还没有得刷怪十八掌的玩家,本文会有点意思吧。

不过,这个小实验远不止小实验这么简单。它提醒我们,研究游戏机制并非需要依赖源代码触解读源代码。很多游戏机制我们可以通过简单的CB技术来探索。我们来假设一种情况,一个新玩家,他会简单的CB技术。有一天,他想了解了解刷怪的空间分布,于是做了上面的这个小实验。虽然他可能没有拜读过德芙(Defanive)关于刷怪机制的讲解,但是理解也不会差很多吧。他也完全可以基于这个实验,设计出更成熟的刷怪塔方案。这才是本文真正想表达的想法。

这不是一句空话,基于这种方法,我们就可以确切知道,以前源代码触解读的那些源代码是否解读正确,也可以知道比如到底间隔多久收一次甘蔗效率最高,或者是点洞不彻底会对女巫塔的效率产生具体多大的影响这类研究性问题的答案。

希望这种思维方式能够启发更多的技术玩家,借助于CB技术和聪明的思维,解决更多技术问题。


特别感谢:

好时(百度id:Hershey4)为搭建官网做出的巨大贡献。

Dim White(百度id:滚大幕)提供的redstone_player皮肤。

Defanive(百度id:defanive2)提供的关于刷怪机制的源代码解读。

Mackler(百度id:maple_in_thu)提供的关于刷怪球的思路。

墨鱼服(OctopusCraft)全体。

【游戏机制】自由落体的运动规律——理论部分

作者:nenn(百度id:正正正正正好) 注1:本文中提到的所有Minecraft版本均为1.8.8。 注2:禁庄转。 注3:高中以下学历可以适当跳过一些推导过程。相比推导...

阅读全文

【15w43a快照】1.9独立的CB系统及其新应用

作者:nenn(百度id:正正正正正好) 注1:本文中提到的所有Minecraft版本均为15w43a。 注2:禁庄转。 1.9将对命令方块(Command Block,下简称CB)进行彻...

阅读全文

评论已经关闭。