本帖最后由 素履信游 于 2011-1-12 23:50 编辑
顾名思义,这篇帖子只适用于万圣节更新之前的游戏版本。也许你要问我为什么要翻过时的帖子——因为我也是翻了以后才知道过时了。。。
感谢baizuo的
补充指正,看来本文还没有过时。我直接把它拿过来吧:
哦哦,你居然翻了这个帖子,我有打算的……只是嫌麻烦(虽然为了造自己的刷怪塔很久以前就通篇看完了)
另外很重要的一点:因为大量玩家(当然包括我在内拉~)反对万圣节新的超可怕的刷怪模式,Notch已经在1.2.2把这部分code换回了原来的模式:也就是说本文对于1.2.2还是适用的:只是可能会有一些不为人知的小修正,那就不得而知了。
一些补充和指正
第一节:
7)303的怪物箭可以不受这个数量限制
9)那个补丁已经过时了,Risugami也移除了他的史莱姆补丁,现在1.2.2版仿佛能够正确地刷出史莱姆
第二节:
1.2.2版本Notch说减少了刷怪的cpu消耗,所以现在应该不到20次;至于核心算法有没有改变还不得而知
刷怪子循环:
14)直接翻译为骷髅骑射手就行——至今只见过一只,残念
顺便一提最简单的找0,0 chunk方法:
1.打开存档,找到0目录,删掉0目录下面的0目录
2.打开MCedit
3.发现你的地图上有一个真空chunk,那就是0,0 chunk了
目前我只有一个40 block高的小塔,只有9层,不过产出率基本能满足日常需求~
原帖:
点我
帖子里有个熟悉而陌生的名词:
chunk
因为MC里的方块数目太多,因此Notch使用更大的单位来度量地图,那就是chunk,我这里译作“组块”
一个组块就是16×16×128(长×宽×高)个方块,即横截面为16×16,贯穿整个高度的长方体(Alpha里的竖直空间只有128格)。Alpha的地图中只有玩家周围的81个组块处于激活状态(有怪物活动,水流动等等),随着玩家在游戏中的探索移动,会不断有新的组块生成和加载,而原来激活的组块如果离得太远则会释放。
译文:
第一节:刷怪全能法则
1)难度级别不影响刷怪率
千真万确,这一点已经在代码里验证过。算法在生成怪物时并不调用难度参数。技术上而言,即使Peaceful难度也有着相同的刷怪率,尽管攻击性怪物在生成后立刻被移除。
2)怪物可以在人造方块上生成
鹅卵石,双层台阶,羊毛这些方块同石头与泥土一样可以生出怪物。然而怪物不会在玻璃或半层台阶上生成。对可以生成怪物的方块来说,刷怪率也没有差别。
3)刷怪现象存在于玩家周围144×144格的范围以内,24米以外
明确地说,刷怪发生于玩家周围的144×144×128(长×宽×高)空间以内。同时怪物只能在以玩家为中心,半径为24m的球面之外生成。(游戏中一个方块棱长1米,Alpha里的竖直空间只有128格)
示意图:
怪物也不能再玩家初始地点24米以内生成。
4)大型史莱姆能够在peaceful难度下存在
史莱姆会在peaceful以外的所有难度生成。不过和其他攻击性怪物不同的是,即使是大型史莱姆也不会在难度切换到peaceful时消失。如果在peaceful难度下杀掉大型史莱姆,它不会分裂成小史莱姆。史莱姆也能够在任何亮度下生成,不过仅限于最下面的15格空间。
5)攻击性怪物在亮度小于等于7级时生成。温顺的怪物只会在亮度大于等于9级的草地上生成。
方块的亮度计算方式比较诡异。每个方块本身的亮度和相邻的4个方块以及它上方的空气方块相比较,其中最亮的作为该方块的亮度级别。这意味着即使是一个7级亮度的方块,如果它相邻方块中有一个亮度为8级的话,攻击性怪物也无法生成(补充:不知道为什么,这种情况只对泥土和半层台阶方块有效)。
6)对指定的某个方块而言,在它上面生成怪物的概率受到该方块亮度(及周围环境)的影响
每轮会随机在0到7中选中一个数赋给变量R。如果方块的亮度小于或等于R,在那一轮怪物就能够在方块上生成。所以亮度为0的漆黑洞穴比起亮度为4级的月光照亮的区域会高出75%的刷怪率。参考数据:火炬亮度14级,火焰和日光为15级,月光是4级,而红石火炬则是7级。离光源每隔一个方块,亮度降低一级。
至于周围环境对刷怪率的影响,详见第三节。
7)在任意时刻,攻击性怪物不超过200只,温顺的怪物不超过15只
一旦上限达到,除非有怪物死亡,消失,或者怪物所在的那块地图被释放,否则不会生成新的怪物。
8)在一个空间里放置火炬不会影响别的空间里的刷怪率
当然,怪物数量达到上限时会出现例外。每个怪物在每一轮只有一次机会生成,如果由于火炬的原因而没能成功生成的话,它也无法重新选择生成地点,因此其他地方不会受到火炬的影响。换言之,用火炬把怪物聚集在一个区域的想法是不可行的。
9)史莱姆不遵循这些规律
史莱姆的生成机制有很多不同的地方。它的刷怪算法使用X,Y坐标代替X,Z来定位当前地图,此外随机生成机制也非常令人费解。不过别害怕,
这个帖子里有个你可能感兴趣的补丁。(打过补丁后史莱姆还是非常难以捉摸,只是分布更为广泛而已)
第二节:刷怪算法
刷怪算法一般每秒调用20次。每一轮执行两次,一次生成攻击性怪物,一次生成温顺的怪物。
刷怪主循环:
1)把当前所有的81个组块放进一张伪随机列表。(并不是真正的随机,而是一串无法确定的特定顺序)
2)如果列表非空,就从中取出一个组块。
3)取一个随机数来决定下面的行为。有十分之一的机会进入第4步,否则忽略该组块回到第2步。
4)随机选择一种怪物(温顺的:猪,牛,鸡,羊。攻击性:蜘蛛,骷髅,僵尸,creeper,史莱姆)
5)在组块里完全随机地选择一个地点L1
6)如果L1在岩石或其他实体内部的话,就完全退出本次刷怪算法,忽略掉列表中剩下的组块。
7)如果L1没问题的话,它将作为一批怪物的生成地点。在L1周围较分散地选取6个地点,记为L(i)。
刷怪子循环
8)检查当前地点L(i)是否没被占用,而且下面是能够生成怪物的方块,上方有空余空间。
9)如果检查没通过,则读取下一个L(i)并回到第8步
10)检查L(i)是不是在(所有)玩家24米以外。还要检查是不是在初始地点24米以外。如果不是,则读取下一个L(i)并回到第8步
11)准备好要生成的怪物(位置,朝向等)
12)LGT(i)表示L(i)处的亮度
13)(如果是生成攻击性怪物)从0到7中随机选一个数赋给变量R,如果LGT(i)≤R,就在L(i)处生成怪物。
13)(如果是生成温顺的怪物)如果LGT(i)>8,则在L(i)处生成怪物。
14)如果生成的怪物时蜘蛛的话,还会取一个随机数决定是否再生成一只骷髅骑在蜘蛛背上,概率为百分之一。
15)读取下一个L(i)并回到第8步。
16)处理完所有的L(i)以后,回到第2步。
17)返回。
(注:史莱姆有特别的生成规则,要考虑到海拔和亮度级别,这在第一节里提到过。)
第三节:探讨
假如你想造怪物收割机或是别的什么而需要使刷怪量最大化的话,就需要遵循一些规则。理想的刷怪场所例如净化间,内部空空如也,只有一层让怪物出现的地板。在净化间里刷怪速度很快,在几秒内就能达到200只的上限。
之所以这么高效,是因为几乎完全避免了算法中第6步退出的情况,原因是在这些组块中仅有0.8%的地方被实体方块所占据。因此,大部分时间里所有的81个组块都有刷怪的机会。
你也许会认为多层地板能进一步增加刷怪率,因为有更大的刷怪面积。虽然严格说来没错,但这么做也增加了触发第6步退出的可能,从长远看来弊远大于利。
可能大部分人都没法挖出144×144的深坑,所以最佳方案是找到一个低海拔洞穴尽可能多的区域。开放空间越大,刷怪率越高。即便没有绘制出洞穴分布图也有办法找到合适的地方:可以四处探索,直到发现某处的怪物数量明显偏高,那里就有可能一直出现很多怪物。
第四节:神奇的刷怪塔
对于玩家所在的每个组块而言,组块的读取顺序都是独一无二的,不过有一个例外。如果组块(0,0)(即方块0,0到15,15)在玩家周围的81个组块之中的话,该组块总会第一个读取。我们可以利用这个规律。不管地形如何,在读取组块(0,0)之前算法绝不会退出。这意味着组块(0,0)比起其他的80个组块而言有着最高的刷怪率,和净化室一样高。
为了说明这一点,我在组块(0,0)里建造了一个19×19×64的刷怪塔,共有16层地板。几分钟以后塔里就聚集了约150只怪物,如果不是达到上限的话,可能会有更多。
(图中的玻璃方块其实是岩石,为了方便观察用NBTForge修改成了玻璃的外观)
想学会如何像高手那样使用这个秘诀的话,请看看
Bucruss的同专题帖子。