种子(世界生成)

来自Minecraft Wiki
跳转至: 导航搜索

种子(Seed)是一个由一个或多个字符(包括正整数和负整数)组成的一个值,游戏根据这个值创建每一个Minecraft世界。[1]

兼容性[编辑 | 编辑源代码]

种子在不同平台上兼容,而同一平台上的不同版本之间可能兼容。不过在村庄与掠夺更新后,村庄和其他一些结构的生成有所变化。

Java版的种子在Alpha v1.2.0Beta 1.7.3期间基本一致。Beta 1.8版本完全更改了世界生成;1.2因为加入了丛林而更改了陆地上生物群系的分布;1.7.2再次重写了世界生成;1.13更改了洞穴的生成,加入了新的水域生物群系,以及调整了变种生物群系和部分结构的位置;1.14加入了竹林生物群系,同时更改了村庄和其他一些结构的位置。上面未提及每次更新加入的新结构,但它们通常不会伴随整个世界生成的大更改。

基岩版中,Alpha 0.9.0是目前为止唯一一次彻底更改世界生成的更新。水域更新更改了海洋,村庄和掠夺更改了村庄等结构。

原主机版的种子更新大致和Java版的更新周期一致。

某些特定种子在Java版和基岩版中有着相似的生物群系分布,但地形有所不同,结构生成也不一致。

世界生成[编辑 | 编辑源代码]

当游戏准备生成一个世界时,游戏会调用一个算法,生成一个伪随机数,这个数决定了世界的样子。但由于伪随机算法的性质,若算法初始输入的数值(种子)是相同的话,算出的最终结果是相同的。这就是种子的意义:使用相同的种子可以生成出多个相同的世界。

当世界生成算法更新(通常是加入新的生物群系)后,相同的种子就不会生成相同的地形。这也是某些不同的游戏版本中,相同的种子无法产生相同的地形的原因。

一个世界生成后,其种子便已经确定。默认情况下游戏会自动选择种子(使用系统时间)。但玩家也可以手动设置。使用相同的种子可以重复玩相同的世界,种子也可以用于与其他玩家分享世界。种子的设置可以用数字(包括负数)、字符等,非纯数字种子会被自动转换成纯数字。

如果将旧版本的世界导入到新版本中,则新生成的区块会基于新的种子,因此并不一定会与旧区块吻合(这个现象在Java版Beta 1.81.7.2中非常常见)。被删除的区块会重新生成,但只要种子或生成算法其中一个有所不同,区块就会不同。

必须注意的是种子其实只是输入到伪随机算法中的值,而不是世界真正的名字。根据某个种子生成的世界的特征并不注定与种子的字面含义有关。例如,即使是使用一个生物群系的名称作为种子,生成的世界也并不会以此作为主要的生物群系。

查看种子[编辑 | 编辑源代码]

想要确定一个世界的种子,在Java版中,玩家需要执行命令/seed

基岩版中,种子可于世界选项界面中查看。也有一个种子选择器,为玩家提供预设的种子,以在出生点附近生成具有特定特征的地形。此外,beta版中,屏幕顶端会显示这个世界特定的种子。

技术细节[编辑 | 编辑源代码]

Java版[编辑 | 编辑源代码]

如果种子包含非数字字符或长度大于等于20,那么Java中的String.hashCode()函数会用来将其转换为数字。由于输出的数据类型为int,此函数将Minecraft能生成的种子数量限制为232(4,294,967,296)。为了达到完整的可能的世界数量(264,即18,446,744,073,709,551,616),必须输入纯数字种子或使用默认的世界种子。由于Java的Random类只使用种子中的48位,只有248个种子是有意义的;所有模248同余的种子相互等价。

基岩版[编辑 | 编辑源代码]

基岩版中的种子,无论是使用数字还是字符串,都有总共232(4,294,967,296)种可能的世界。这个结论对于64位版本的Windows 10版同样成立。这是由于基岩版使用了32位的梅森旋转算法,只接受32位的种子。

版本间重叠[编辑 | 编辑源代码]

0至231(2,147,483,648)间的种子在Java版和基岩版会产生相同的生物群系分布,但地形、结构和结构位置、洞穴、矿石分布和生物生成等并不相同。

种子0[编辑 | 编辑源代码]

Java版中,游戏不接受0作为种子,因为游戏会将其作为字符解释,然后取其ASCII值48。不过,通过输入使String.hashCode()函数返回0的字符串,仍然可以得到“种子0”。这样的单词字符串有creashaks organzine、 pollinating sandboxes、 little jungle、 small skeleton 和 drumwood boulderhead,等等。[2]实际上,任何散列值为0的字符串都可行,例如ddnqavbj 和 166lr735ka3q6。对于数字种子,任何和0关于模248同余的种子(例如281474976710656)也会生成和种子0相同的地形,不过/seed不会显示为0。

基岩版中,游戏不接受-9至9的种子。[3]不过,上述Java版的字符串方法同样有效。例如,要得到种子2,只需要将small skeleton的最后一个字符取为其ASCII值比n大2的字符,即p,于是可行的字符串是small skeletop。最短的可用字符串是ddnqavb后跟一个从as的字符。

怪异生成[编辑 | 编辑源代码]

使用某些特定的种子可以观察到许多奇特的生成。

更改地形而不更改结构[编辑 | 编辑源代码]

种子只有一部分会用于生成世界内的特定结构。因此,通过将种子转换为二进制序列然后更改特定位,可以做到多个世界有着相同的洞穴系统、下界生物群系和其他一些结构的分布。[4]

影子种子[编辑 | 编辑源代码]

将一个种子加上-7379792620528906219后得到的种子会有着和原种子完全相同的生物群系分布,但地形并不一致。

重复[编辑 | 编辑源代码]

164311266871034旁观模式下的地下,可见洞穴沿Z轴重复生成。

某些种子会在游戏内部中返回0,[5]引起洞穴和其他结构的无限生成。[6]Java版中,107038380838084种子会在第一次被调用时返回0,而164311266871034会在第二次被调用时返回0,导致洞穴、废弃矿井和水下峡谷等结构分别在X和Z轴上重复生成。[7]由于未知原因,水下洞穴和常规峡谷的生成添加了,自Java版1.13后它们不在这个种子中受到影响。不过,如果上述两个种子减去1,那么水下洞穴和常规峡谷将会重复生成,但其他结构则不再重复。已有理论分析这些种子也会影响要塞中不同方块类型的分布和恶地中陶瓦的图案,但尚无切实证据证实。

其他一些地物也会受到影响,例如装饰性结构。它们通常沿对角线生成。[8]

基岩版中,种子2898490251669320484会沿对角线重复生成洞穴、峡谷和一些装饰性地物。[9]

历史[编辑 | 编辑源代码]

Clock JE3.gif
此段落需要更新。

段落中某些信息已经不符合当前版本情况。

Java版Pre-classic
rd-160052添加了一个简单的世界生成器。
Java版Classic
0.0.12a世界生成器更新。
2009年8月25日展示了再次进行更新的世界生成器。
生成更多的悬崖。
Java版Indev
0.3120091223-2公布了等轴距级渲染的屏幕截图。
20100106现在可以在生成世界时选择岛屿、浮岛、平坦或原始作为世界类型。
可以选择正方形、长形或下深作为世界形状。
可以选择小、正常或大作为世界大小。
20100107下深浮岛地图现在有多层岛屿。
现在可以选择世界主题,有正常和地狱。
20100111-1现在岛屿生成更多的沙子。
20100113海洋现在生成无限的水。
20100122水现在可以自然生成于海平面上和浮岛上。
减少洞穴被水淹没的可能性。
Java版Beta
1.3允许玩家自定义地图种子。
1.8.1调试屏幕开始显示当前世界的种子。
Java版
1.2.1服务器将不再向客户端发送种子。
1.3.112w18a由于单人游戏的实现方式与多人游戏合并,世界的种子不再显示在调试屏幕上。
12w21a添加/seed命令,用于显示当前世界的种子。
1.7.2世界生成算法发生改变,这意味着使用一个旧版本存档,原先未加载的区块将生成不同地形。
携带版Alpha
0.1.0加入了种子。
0.9.0更改了地形生成,这使得旧种子变得过时了。

你知道吗[编辑 | 编辑源代码]

  • 自Java版1.7.2至1.12.2的版本间,通过更改源代码并将第6个genlayer的值‌[需要更多信息]从2更改为0,可以在Java版中得到原主机版的生物群系生成,除了蘑菇岛。

重要的种子[编辑 | 编辑源代码]

下面这些种子在某些时候曾被官方地图和资源使用过:

画廊[编辑 | 编辑源代码]

外部链接[编辑 | 编辑源代码]

参考[编辑 | 编辑源代码]