「MC筛种杂谈1」解读战利品表,以及战利品决定的原理 您所在的位置:网站首页 看箱子是什么意思 「MC筛种杂谈1」解读战利品表,以及战利品决定的原理

「MC筛种杂谈1」解读战利品表,以及战利品决定的原理

2024-07-17 15:16| 来源: 网络整理| 查看: 265

    理解战利品的生成原理不仅能知道各种结构中箱子能开出物品的概率,期望,极限(例如古城一个箱子理论可以存在20个附魔金苹果!但这可以断言是不可能的),还有助于使用别人的战利品预测器(第三方筛种库),以及自己开发一些前人未覆盖的内容。本篇是介绍篇,之后会继续讲解如何实战。

一、被战利品表控制的内容有哪些

考古(1.20新增)

方块破坏

箱子战利品

实体被杀死

游戏玩法(钓鱼,村庄英雄,猫之晨礼,以物易物,嗅探兽)

二、去哪看战利品表

访问wiki,例如:

箱子战利品(结构索引) - Minecraft Wiki_BWIKI_哔哩哔哩 (biligame.com)

钓鱼 - Minecraft Wiki_BWIKI_哔哩哔哩 (biligame.com)

优点:直观易懂

缺点:仅有最新版本的表格;wiki擅自对表格进行了排序,但我们利用程序模拟时必须使用战利品表的原始顺序。

解压相应版本游戏实例中的.jar文件如1.20.1.jar,访问文件夹

其中的.json文件即为战利品表。

优点:保留了战利品表的原始顺序;各个版本的均可获取。

缺点:太丑太难读了

查看mcfeature第三方筛种库中整理好的战利品表

如何找到:阅读欣雨神的文章配置好IDEA即可

优点:保留了战利品表的原始顺序,且较直观。

缺点:仅有1.16.1版本的战利品表;仍缺少部分结构的战利品表。

三、如何解读战利品表

战利品表最基本的两个要素:奖池(lootPool),奖项(lootEntry)

奖池:一个战利品表拥有一个或多个奖池。每个奖池具有抽奖次数(roll),这个次数可以是常数,也可以由RNG(随机数生成器)决定。每个奖池还具有若干的奖项(entry),也就是具体的物品。例如:废弃传送门仅有1个奖池,这个奖池的抽奖次数在4到8中随机。埋藏的宝藏有6个奖池,其中第一个奖池只抽奖一次,且仅有一个奖项——海洋之心,这保证了每个宝藏必定含有海洋之心。

奖项:每个奖项最基本的三个要素:物品(item),权重(weight),函数(function)。权重决定抽奖时被抽中的概率。权重越大,越容易被抽到。奖项被抽中后,还会进一步作用一些函数,如设置数量,设置耐久,附魔。值得一提的是存在一种空奖项(emptyEntry),抽中它就相当于抽中了空气,它存在的作用仅仅是提供无用的权重,降低奖池中其它奖项被抽中的概率。

实例:这个链接会跳转到铁匠铺的战利品表

其中,仅有一个奖池,它会进行3到8次抽奖。奖池中有若干个奖项,具有不同的权重和函数。如:钻石奖项的权重是3,若抽中会继续决定1到3个堆叠。

四、战利品决定的原理

    每个箱子的内容都由一个战利品表种子(lootTableSeed)和战利品表(lootTableSeed)完全决定。在一个固定的世界种子下,这些信息也是固定的,下期会讲解对任意的世界种子,如何筛选某些坐标范围内是否有箱子,箱子的内容是否符合所需。现在先讲解如何由lootTableSeed出发,得到一整个箱子的内容。例如,我用世界种子5464771542393817进入世界,在观察者模式下,用F3+i查看一个从未打开过的箱子,得到如下信息:

这是一个铁匠铺的箱子,它的lootTableSeed就是4883865642824260284,战利品表如下。

这个表格是我在mcfeature第三方筛种库的源码中摘录的,大概不难看懂。

生成战利品的流程:将一个随机数生成器(记为rand)的种子设置成上述lootTableSeed,

然后考虑第一个奖池。它拥有3-8次抽奖次数,那么我们对这个rand,生成6以内的整数,再加上3,即决定好了抽奖次数(结果是8)。

现在考虑第一次抽奖。我们注意到战利品表中所有奖项的权重加起来是94,那么我们生成94以内的整数,并比对结果在哪个区间,就决定好是哪个奖项了。

注意到结果是82,这对应了黑曜石,为什么呢?

对上面提及的战利品表,黑曜石在较后方,可以从末尾开始考虑。93代表钻石马铠,92代表金马铠,91代表铁马铠,88-90代表鞍,83-87代表橡树树苗,78-82代表黑曜石。

既然确定好是黑曜石,下面要作用函数了。很明显,它只具有一个决定数量的函数,没有其他的函数。因为数量是3-7之间,我们使用语句

得到了7,也就是说这个奖项是7个黑曜石。第一次抽奖结束。

同样地,继续抽剩下的7次奖,最终8次抽奖加起来是54个黑曜石。战利品生成完毕。

至此,想必你已经完全理解了原理。虽然看起来步骤很多,但幸运的是已经有前人帮我们写好了程序,只要输入lootTableSeed和lootTable,就能自动完成上述所有步骤。相关内容我将在下期讲解。此外,我认为还是有必要细讲一下奖项的函数部分。

五、奖项的函数

    上面已经出现过了一个函数——设置数量(setCount)。除此之外,还有以下几种:

设置损坏(applyDamage):例如出现在堡垒遗迹的藏宝室的宝藏箱子中。以下是路径:

耐久不满的钻石装备就由此实现。流程:rand.nextFloat(0.8)+0.1,其中数值视情况而定。

设置随机附魔(EnchantRandomly):大部分附魔装备由此实现。先得到这件装备可用的附魔列表(这是固定的,次序也是固定的),然后得到列表的长度,取此长度之内的随机数,以决定附魔种类。现在决定附魔等级:如果附魔仅有一级,那么跳过;否则取最高等级之内的随机数,以决定附魔等级。例如:金镐的可用附魔列表如下:

先使用rand.nextInt(6),假如得到3,这代表时运。然后决定等级,rand.nextInt(3),假如得到0,这代表时运的等级是1。所以金镐的附魔就是时运1。

可见,这个函数仅会提供一项附魔魔咒,且各魔咒出现的概率均等。确定魔咒后,各等级的概率也均等。

等级附魔(enchantWithLevels):相当于玩家在附魔台操作一次。要塞图书馆,末地城用的都是这个函数。这可以得到多项附魔,还能开出宝藏附魔(经验修补等),但原理较复杂且一般筛种时不涉及这些较为游戏后期的建筑,故不详细讲解。

六、种子知识,以及简单的概率论

    用来生成战利品的随机数生成器,是线性同余生成器(LCG)。它设置种子时,可以输入(二进制)64位整数,也就是2^64的范围。然而,因为LCG的特性,只有后半48位生效,也就是说,只要两个lootTableSeed的后48位相同,它们就会导出完全相同的战利品。可见,一个lootTableSeed拥有2^16=65536个姐妹种,它们有相同的战利品。

    姐妹种这件事拥有好处,如果我们已经得到了一个神种,比如说上面举例使用过的那个铁匠铺54黑曜石的lootTableSeed,那么我们相当于得到了65536个神种。

    但也有坏处,因为这导致MC中只有2^48个不同的lootTableSeed,从追求极限上来说,这是不利的。我们常常听说一个有趣的事情,假定一只永恒的猴子随机地敲打键盘,那么在无尽的岁月中,它总能敲出一部莎士比亚的著作。这就是说,尽管概率很小,但只要尝试次数无限,它总能发生一次。然而,我们的lootTableSeed却从2^64减少到2^48个,因此许多小概率事件变得更加无法发生了。例如,铁匠铺箱子理论最多有56个黑曜石,其概率是

再乘以我们的样本空间大小有

这个数字远小于1,基本上可以认为不可能了;事实上,我们通过某些方法也证明了确实不存在这样的lootTableSeed。

七、有趣的课后习题

    翻阅wiki相关页面,解答如下问题。

一把金镐,在设置随机附魔(EnchantRandomly)时,得到效率5的概率

为什么说20附魔金苹果的古城箱子是不存在的

预测一个废弃传送门的箱子,有6个附魔金苹果的可能性

为什么桥类型的堡垒遗迹必出一个磁石

mojang在1.20更新中,为许多结构增加了锻造模板的战利品,而不影响原有的战利品,这是怎么实现的



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

      专题文章
        CopyRight 2018-2019 实验室设备网 版权所有