我的世界 地图生成

几乎所有玩过Minecraft的玩家都折服于Minecraft几乎无限大的地图。

但Minecraft是如何做到的呢?

先上一个不可能的想法给大家娱乐一下:

两张图均来自于u管

好吧……这个想法确实有些过分了。那如果用计算机一次生成这么多方块呢?抱歉,计算机有一句***要说。如果按照1秒生成1x108个方块来计算,这么做需要花费1.14年,而事实上你的Minecraft地图这需要几秒钟就生成好供你玩耍了。这还不考虑计算机储存能力的问题——这么多方块,按照一个方块需要4个字节来储存,也需要约13000TB(12.7PB)的储存空间,况且Minecraft中还有各种各样的实体,它们也会占据不小的储存空间,这显然不是一台普通的家用电脑能消受的起的。

那么只有一条路可以走了:根据玩家所在的位置动态地加载地图。用通俗一点地话来讲就是“走到哪里,生成哪里”。可是动态加载地图相较于静态加载地图有一个劣势:静态情况下,游戏知道地图上所有物体的状态,因此可以根据这些信息执行生成逻辑;而动态生成时知道的信息很有限,往往只有和自己相邻的区域的信息,生成起来就会比较困难。这时候就需要一些奇特的算法了——不过它们并没有你们想象中的那么复杂,但他们确实能完成Minecraft庞大的过程化生成工作。

Minecraft的地图生成器可以抽象为一个函数:

中间那个巨大的问号就是地图生成函数

这个函数以种子和(x, y, z)坐标作为输入,以一个方块作为输出。

“种子”这个词,Minecraft玩家应该非常熟悉。没错,就是你们新建世界时输入的那个种子。“种子”有一个非常重要的特性:只要你输入的种子不变,那么生成的世界就永远是一样的(前提是你不对Minecraft程序进行改动,包括更新版本或者加入模组,并且你使用同样的生成配置)。这也就意味着,种子一旦确定,整个世界就是确定的了。这是因为,Minecraft采用了一种叫伪随机序列的东西(大多数编程语言标准的随机数发生器都基于该算法)。他可以根据不同的输入,产生看上去非常凌乱(随机)的输出。比如我输入1,它返回2;我输入2,他返回17;输入3,他返回109,几乎没有任何规律可寻。不过该算法也有和种子一样的特性:同样的输入,永远产生同样的输出(这就是为什么叫做伪随机)。就拿刚才那个例子来说,我输入1,他一定返回2;输入2,他一定返回17。这就奠定了Minecraft一个种子确定一个世界的基础。Minecraft的地图生成器分成很多模块,而每个模块要干的第一件事就是根据输入的种子和坐标,算出一个自己局部使用的种子,然后根据把这个种子丢进伪随机序列进行迭代,产生自己需要的值。

LCG就是一种伪随机序列生成器。它的实现很简单(而且效果好,这就是为什么他能得到大家的青睐),贴一段自己的实现(c++):

class Rng final { private: static const unsigned long long modulus = 2147483647, a = 48271, c = 1; unsigned int seed_; public: explicit Rng(const int seed) : seed_(seed) { } int Next() { return seed_ = (a * seed_ + c) % modulus; } int Next(const int min, const int max) { auto x = Next(); x %= (max - min); return x + min; } double NextDouble() { const auto x = Next(); return x / 2147483647.0; } };

这里补充一下为什么要自己实现随机数发生器(不是标准库自带随机数发生器吗)。主要有以下两点原因:

  1. 不同的语言,不同的平台,不同的编译器都会有自己的随机数生成器实现。Minecraft是一个跨平台的游戏,要是每个平台的随机数生成器直接有区别(我不知道Java标准是否规定了某个特定实现,不过我在Stack Overflow上看到过c++出现这样的情况),那就出问题了。你肯定不会希望一个种子在不同平台上产生不同的世界。
  2. 很多托管语言(比如Java)的随机数生成器都是一个对象。有了对象就要垃圾回收,因此自己实现一个不新建堆上对象的算法可以减少系统的垃圾回收压力。

今天就到此为止吧……以后几部分会涉及高度图的生成和生物群系的生成,最后一部分会用Unity3d做一个综合应用。

地图查看工具[]

地图查看工具会根据世界的地形来创建一个虚拟地图。这些工具多半具有从不同高度与角度来查看地图的功能。在这些工具中,有些有地图大小的限制,有些则会将一张地图分割成许多的小贴图。

名称 描述 日期 版本 平台 链接 最新的兼容版本是否提供源代码 程序设计语言 作者

c10t

命令行程序。是 Cartograph 的重写。官方提供对Linux版本的支持,可以在Windows和Mac上工作,但需要进行编译。 2012-09-12 git 35922ce757

论坛

网站 

1.3.2 如果编译了Github的源码的话 是,BSD C++ udoprog (John-John Tedro)

AMIDST

地牢和村庄寻找器依靠种子工作。 2016-11-24 v4.2

论坛

网站 

1.11 是,GPL Java Skidoodle

Cartograph G

Cartograph的分支。支持最新版本以及修复了Cartograph的一些漏洞。添加了新功能,包括增强GUI以及对Mod的支持。当前编译版本依赖于用户生成的Auto.cfg文件。要注意该软件有被遗弃的风险。 2012-10-25 2012-10-25

论坛

1.4.2 否,但已破解 C++(查看工具)
VB(界面)
Gameslinder

Chunky

Minecraft 3D地图查看工具。图像质量非常高,但是需要很长的时间来启动它(最好在夜晚启动它)。 2016-10-22 1.4.1

网站 

1.10 是,GPL Java nrub

CraftMaster

CraftMaster是为Minecraft Java版开发的一个程序,它允许你下载和导入Schematics和3D模型到你的Minecraft世界里,b并在Sketchfab、Facebook和Twitter上导出和分享你在Minecraft里的作品,以及更高效地管理和操纵你的世界。 2017-02-08 Beta 2

论坛

网站 

1.11.2 C++ CraftMaster Software, Inc.

JourneyMap

支持实时查看单人游戏和多人游戏的Forge客户端Mod。支持Minecraft Realms。可以以迷你地图/全屏或使用一个迷你浏览器显示地图。支持白天/夜晚/表面/洞穴/下界/末地地图的查看。Fairplay版关闭了在多人游戏中的雷达和洞穴查看。Unlimited版解锁所有功能。JourneyMap API可让其他Mod编写向地图添加覆盖物的方法。 2017-10-19 5.4.0

论坛

网站 

1.12.2 Java、DHTML TechBrew

Mapcrafter

高画质的Minecraft地图查看工具 - 在任何浏览器上以3D等距高细节度地图远点视角查看Minecraft世界。有4种旋转方式、白天/夜晚/洞穴查看模式和世界剪裁功能。 2017-06-21 2.4

论坛

网站 

1.12 是,GPL C++ m0r13

MapRend

MapRend 自地图的顶部向下查看世界,并保存以Minecraft Anvil格式保存。它可以使用资源包的颜色集生成地图,可以查看白天和夜晚时的地图,展示方块的高度和亮度,并且很容易自定义以及更新(只要世界是被MCAnvil保存的)。也可以为区块群生成小尺寸图像(例如制作动态载入地图)。 2015-01-01 1.0

网站 

1.8.1 以及使用 MCAnvil 的每个新手 是,GPL Java YSelf Tool

MCAMap

MCAMap是一个简单易用的独一无二的地图查看工具,可以查看超过32000×32000范围/像素外的方块,并且支持Minecraft 1.8.3。如果网站链接失效,可以点击提供的社区页面链接。 2013-09-22 1.0.16

论坛

网站 

1.8.3 是,有限制 Visual Basic 6.0/.NET/Pascal Sean Forrest

mcmap

命令行程序+Windows GUI。Mcmap Live同时也有Mac GUI. 2016-05-24 2.4.4

论坛

网站 

1.10 C++ Zahl / WRIM

MCMaps

MCMaps.cc是一个分享Minecraft世界给你的朋友和社区的一个web解决方案。只需要上传你的世界,然后就会为你自动查看地图! 2012-01-24 Beta

论坛

网站 

1.7.9 python imer

MCMap Live

交互式的GUI、Xray地图,以及支持生物群系,同时也支持“MystCraft”Mod。 2012-03-28 1.5.5

论坛

1.6.2 Objective-C Donkey Kong/Voikya

mcmapDZ

查看等距网络巨型Minecraft地图的快速工具,由Zahl和hdmake共同开发。(示例查看工具:示例)。GUI和CLI版本可用。 2012-4-11 0.48

论坛

1.3.2 Python/C# NotTarts/Zahl

MCPEedit

从地图上面查看携带版的地图,包括查看层数和保存查看层数到png文件。 2012-06-25 0.3e

论坛

携带版Alpha 0.3.2 Java jocopa3

Minecraft Overviewer

一个用谷歌地图以30°的倾斜和高细节度查看您的地图的工具。一个ExMaple可在[1]中找到。 2016-03-01 0.12

网站 

1.11.2 是,GPL Python/C Overviewer 团队

Minecraft World Map

MinecraftWorldMap.com是一个将Minecraft地图分享给您的朋友和社区的一个网络解决方案。只需要上传您的世界,网站就会为您自动查看地图! 2011-03-29 1.00

论坛

网站 

1.11.2 perl/python skeight

Pigmap

用于快速查看大型世界的软件。支持Linux和Cygwin平台。没有二进制文件;必须从源码中构建。 2014-08-27 1.8

网站 

1.8 是,GPL C++ equalpants + github community contributors

Tectonicus

以高细节度、可缩放形式查看地图,通过谷歌地图提供浏览。只能从命令行启动。

查看示例地图 Wiki 说明

2017-01-11 2.24

论坛

网站 

1.11.2 是,BSD Java OrangyTang

TOGoS's Minecraft Map Renderer

简单而快速地从地图上方查看地图指定范围的成像工具,用于使用非常多的贴图有效地更新很大的地图,每个区域,都可以被TMCMR或其他外部工具结合起来。支持自定义地图颜色和所有方块的半透明。 2015-02-16 2015-02-16ca

网站 

1.8.1 Java TOGoS

uNmINeD

以2D视角查看从1.2到最新版本的地图。地下、x-ray、下界、洞穴、夜晚视角、保存到png、谷歌地图生成器、自定义颜色、外部Mod支持。交互式的GUI,易于使用。 2015-02-06 0.10.331

论坛

网站 

1.11.2 不完全是 C# megasys

Ink & Parchment Map

一个基于web的可分享地图,可以被玩家手动添加标记,因此玩家不需要访问服务器文件就能创建世界地图并分享它。其被设计成不完全移除被探索的世界的元素。下界也能在其上工作。 2014-03-03 1.73

论坛

网站 

任何 Minecraft 是,GPL HTML5、javascript DrFrankenstone

MineAtlas

一个类似于 AMIDST 的地图浏览器。可以在发布的1.8生成的区块里设置兴趣点(山脉、神庙等),并且可以从种子推断地图。(史莱姆区块、存在)。将会在鼠标上面显示生物群系的名字,虽然地形是近似的。需要Level.dat文件,手动输入种子或者它也能够随机生成一个种子来进行检查。服务器拥有者的好工具,以及巨大的查看器、可缩放、可拖动地图、甚至是快速显示未探索的区域。地图都要是低资源文件格式的,并且最大缩放等级并不是很大,因为最远的缩放等级可以显示地图的50km×50km的区域。 2015-02-14 未知

论坛

网站 

1.8及以上
未来可能支持更旧的版本。
u/jazzyjaffa (Reddit)

地图阅览工具[]

地图阅览工具在打开地图时有一个交互界面,但地图是只读的,无法进行编辑。

名称 描述 日期 版本 平台 链接 最新的兼容版本是否提供源代码 程序设计语言 作者

Eihort

经过优化的3D地图阅览工具,拥有一个很长的视觉距离。适合于为庞大的建筑进行截图,或只是探索世界。包括平滑光照、生物群系颜色和自定义方块种类功能。 2014-09-06 (Linux & Mac)
2014-09-15 (Windows)
0.3.15

论坛

网站 

1.11
支持多数 1.11 的方块
是,BSD C++ Lloigor

Dynmap

在Minecraft上的一个像谷歌地图的界面,通过一个Web浏览器进行访问。用Forge和Bukkit编译,并且拥有像Homes或SpoutCraft方块的自定义方块元素渲染API。 ? 1.8

论坛

1.7.9 使用预览版本 是,BSD Java/HTML/CSS mikeprimm

Minecraft AutoMap

显示您周围的高自定义的实时更新的地图,包括附近的玩家和生物。可在单人游戏和多人游戏里工作。地图预览窗口是独立于Minecraft的,因此它的大小和位置都可以被调整,调成全屏或放置在Minecraft上方,就像迷你地图一样。需要Risugami's ModLoader、.NET 4.0和XNA 4.0。 2014-8-30 0.7.9.0

论坛

网站 

1.7.1 是,MS-PL C# bp2008, Ceii

Minecraft X-Ray

会突出显示矿石的3D地图阅览器。与Minecraft在Alpha之前加载的地图方式一样,而现在使用的是Anvil格式。支持用户提供的自定义Mod方块。 2012-03-11 3.6.2

论坛

网站 

1.5.1 是,BSD Java plusminus, xolotl

minecraft-dungeons.com

基于Web的,以CoffeeScript编写,使用Three.js。默认显示地牢和钻石的位置。可以直接从开启了CORS的Web服务器直接读取.mca文件。 2012-09-24 2.0alpha

论坛

网站 

1.3.2 是,MIT CoffeeScript ithkuil

Minutor

交互式的GUI,显示了您所需地图高度的一片区域。支持自官方1.4.2正式版以来的所有方块,包括末地的阅览。 2012-10-25 2.0.1

论坛

网站 

1.10.2 是,BSD C/ObjC/C++ mrkite77

MCPEWorldViewer

没有用户界面,并且目前在大力开发中。允许您打开Minecraft携带版世界,并且在您的计算机上以3D视角呈现。 2013-05-15 0.0.1

论坛

携带版Alpha 0.6.1 不完全是 Java jocopa3

Mine View

运行您打开Minecraft携带版世界,并且在您的Android设备上以3D视角呈现。付费的工具,在Amazon marketplace上发售。免费的演示版现在可用。 2014-12-07 1.5

论坛

网站 

携带版Alpha 0.10.4 Java、Unity3D Smart BI Serv

Blocktopograph

适用于Minecraft Bedrock Edition(基岩版)的免费的自顶向下的世界查看器,也包含NBT编辑器功能。虽然该应用程序仍然在“Beta”状态,但程序稳定。功能:观察主世界、洞穴、生物群系、草的颜色、透视和获得方块亮度信息,制作高度图,查看坐标信息。可以传送本地玩家、自定义超平坦世界,区块操作:编辑区块的实体、方块实体NBT,框选;为火把装灯罩、查找替换、删除区块、更改生物群系、生成图片。 2020-7-22 1.9.4

网站 

1.16.0+ 开源 Java 原创:ProtoLambda

MCPE Viz

MCPE Viz是解析Minecraft Pocket Edition(MCPE)世界文件的工具。它从世界文件创建概览图像,并报告您的世界的许多详细信息。 2016-11-14 0.0.24

网站 

携带版Alpha 0.16.2 是,GPL C Plethora777

地图编辑工具[]

地图编辑工具改变指定的地形或其他属性,例如玩家位置以及游戏内时间。一些工具也可以修改您的物品栏,以及生成地形。

名称 描述 日期 版本 平台 链接 最新的兼容版本是否提供源代码 程序设计语言 作者

buildawall

Buildawall在指定的世界上放置一堵墙,创建一个心理和游戏内的新和旧的分界线。这使得区块与区块之间的区别更明显了。 2012-08-01 ?

网站 

JE 1.2.5 Python Mike Verdone

CraftMaster

CraftMaster是为Minecraft电脑版开发的一个配套程序,它允许你下载和导入Schematics和3D模型到你的Minecraft世界里,在Sketchfab、Facebook和Twitter上导出以及分析你在Minecraft里的作品,以及更高效地管理/操纵你的世界。 2017-02-08 Beta 2

论坛

网站 

JE 1.11.2 C++ CraftMaster Software, Inc.

Creative Mode Plus

在Minecraft地图快速而容易地自上而下构造建筑和地牢。 2012-10-16 1.1.3.1

论坛

网站 

JE 1.4.7 C# MyPace(Caleb Waggoner)

Creeperchest

多用途的Minecraft编辑工具。0.0.8版支持大量世界的非交互式修改,修改单人游戏玩家配置文件,以及渲染2D/3D的世界区域。插件包含了所有的业务逻辑,可直接修改。 2014-04-30 0.0.8

论坛

网站 

JE 1.7.9 部分(所有插件代码) C++、自制语言(插件) Shrinker

MCA selector

快速加载世界。可以选择(过滤)、编辑、删除、导出或导入区块。也能“导入所选区块”并指向同世界的更新/旧版本。 2020-03-21 1.9.4

网站 

JE Beta 1.3 至 1.16, 20w12a java Querz

MCEdit

第一个3D编辑工具。将旧的地图导入到新的 Alpha 的水平。可以以3D视角自由飞行并选择方块,然后复制或导出它们。可从schematics或实体Classic地图导入方块。通过创建或删除区块来快速调整水平。 2018-08-14 2.0.0-beta14

论坛

网站 

JE 1.11(稳定版)
Java版1.8(不稳定版)
是,ISC 许可协议 Python 当前和以前为 Codewarrior(David Vierra),在 Codewarrior 休假时被 TKtect 短暂代替。

MCEdit-Unified

这是一个codewarrior的原始MCEdit的非官方分支,该软件专注于1.8+的优化与兼容。 2017-01-24 1.5.6.0

网站 

JE 1.12 (稳定) 携带版Alpha 0.12.2 (不稳定) 是,ISC 许可协议 Python Khroki、Ezefe、Trazlander、Podshot、Rubisk、Naor、和许多其他的 MCEdit 社区成员

Minecraft Land Generator

扩展默认地图(或服务器Mod的Mod地图)到任何指定的大小。对地图制作者预先生成地形很有用,或者这可以减少服务器的加载。 2013-10-10 1.7.6

论坛

网站 

兼容每个服务器版本 是,公共领域 Java Morlok8k, Corrodias

Amulet Editor

目前大力开发中。 2018 N/A

论坛

网站 

JE 1.12+ Bedrock 1.7+ 是, MIT 许可 Python Podshot, naor2013, gentlegiantJGC, BluCode

Euclid Editor

目前大力开发中。 2020 BETA

网站 

JE 1.8+ Java SWinxy, MCContent

地图生成工具[]

这些工具可以使用自定义地形创建一个新地图,或将新方块“导入”到指定的地图。

名称 描述 日期 版本 平台 链接 最新的兼容版本是否提供源代码 程序设计语言 作者

Chunkmapper

将真实世界以30:1的比例生成在Minecraft里。 2014-02-28 0.1

网站 

1.7.5 Java whamtet

Mace

在生成点使用完全随机生成城市生成原始Minecraft地图。 2012-09-05 1.11.2

论坛

网站 

1.3.2 是,GPL C# Robson

MCDungeon

在指定地图中生成随机地牢和寻宝游戏。可以在Minecraft 1.7中工作,然而一些针对1.8的特殊功能需要关闭。 2014-11-24 0.14.1

论坛

网站 

1.8 是,MIT Python Orphu

MCTerra

可以生成平面地图、球体地图、沙漠地图、金隧道地图和小行星地图。 2012-6-10 Beta 0.9.3.0

论坛

1.2.5 Delphi Mozzg

Terrain Control

一些地形控制功能:

- 调整大陆和海洋的大小比例

- 控制全局和地图预生成参数

- 调整Minecraft已经生成的生物群系设置,并且您可以自定义自己的生物群系

- 调整资源,直到符合您的品味

- 向您的世界添加自定义物体和树

- 开启/关闭Minecraft村庄、要塞、金字塔和废弃矿洞

- 拥有一个用户界面(作者Genae),以便方便地修改配置文件

- 将地图转换到Minecraft 1.7地形生成器,以便继续拓展您的遗留世界

- 从一张图片中生成一张地图

- 可在多人游戏与Craftbukkit上运行。

2013-04-08 2.4.10 1.7.9 Java Khoorn

TOGoS's Minecraft Map Generator

基于用户定义的功能来生成新区块。拥有完全控制方块的放置以及使用3D Perlin和Simplex噪声生成任何海洋、大陆、洞穴、熔岩凸面、羊毛山脉、巨大的黑曜石海绵等等功能。 2013-03-20 2013-03-20a

论坛

网站 

1.5 Java TOGoS

TopoMC

TopoMC项目可帮助利用 USGS 的数据建设更真实的Minecraft世界,特别是NED和NLCD的数据集。 2012-10-20 1.0.3

论坛

网站 

1.4.2 是,MIT 许可协议 Python Mathuin

WorldPainter

WorldPainter是一个交互式的、生动的地图生成工具,允许您对一个风景使用油漆工具来进行建模,它可以改变地形的形状和类型、设置生物群系、添加森林、雪、冰、资源和洞穴以及更多。它只支持对现有的地图进行编辑,然而它是一个地图生成工具。 2015-04-25 1.11.0

论坛

网站 

1.11.2 是,GPL Java Captain_Chaos

MCPEGenerator

软件尚在开发中。它使用单纯形噪音算法生成世界,允许进行4种不同的生成。生成工具的所有方面都可以自定义。 2013-05-15 1.0.1

论坛

携带版Alpha 0.6.1 Java jocopa3

Seibai's Primordial Desert Map Generator

生成带有沙丘、锋利的石头山和地下地牢的沙漠世界。地图将会被基岩环绕。基岩外面就是正常世界。在沙漠中生成是非常困难的,因为食物和木头在那里都很稀有。它在1.5.2中仍然工作,即使它不生成任何的新矿石! 2012-05-06 v2

论坛

网站 

1.2.5 N/A Seibai

Seibai's Forest Map Generator

生成一片被基岩围绕的森林。地图非常平坦(地图高30方块)。即使生成工具专门为Alpha 1.2.1_01而制作,它仍然在1.5.2中工作,但是要将世界转换2次之后才可以工作(第一次是一个Beta 1.7.3 jar文件,第二层是一个1.0 jar文件,最后为1.5.2)。 2010-11-07 2010-11-07

论坛

网站 

Alpha v1.2.1_01 N/A Seibai

Seibai's Dungeon Adventure Generator

使用4种选择的其中之一生成一个巨大的世界。玩家可以进入地牢来进入最终世界。地牢是从击中不同的区域类型变种中随机选取的。将会通过下界传送门进行工作;玩家进入一个下界传送门,沿着一条小走廊就会进入另一个传送门,并到达另一个区域。 2012-04-08 2012-04-08

论坛

网站 

1.2.5 N/A Seibai

Seibai's Planetoids Map Generator

生成不同材料的小行星。实体地图被基岩环绕。石头小行星将会包含许多矿石。叶子小行星拥有一个巨大的木质核心。注意: The Better Worlds Generation Mod增加了这个被遗弃的Mod作为它的世界类型。 2012-04-17 v2

论坛

网站 

1.2.5 N/A Seibai

Seibai's Golden Tunnels Map Generator

生成带有地下巨大隧道的几乎平坦的世界,拥有树、荧石和矿石。即使生成工具专门为Alpha 1.2.1_01而制作,它仍然在1.5.2中工作,但是要将世界转换2次之后才可以工作(第一次是一个Beta 1.7.3 jar文件,第二层是一个1.0 jar文件,最后为1.5.2)。 2011-06-13 2011-06-13

论坛

网站 

Alpha v1.2.6 N/A Seibai

Seibai's Mystical Islands Map Generator

使用许多自定义参数(例如浮空岛大小等)生成一个浮空型地图。生成工具专门为Beta 1.3而制作,但是将它转换为1.0 jar文件的世界,然后再次转换为1.5.2 jar文件的世界,它就可以在1.5.2中运行了。 2011-03-12 v2

论坛

网站 

Beta 1.3 N/A Seibai

Toplist

最新的帖子

標籤