分享一套随机地图的生成方案



  • 这套方案的雏形来自于Eed Blob Games(Red Blob Games),基础的完成图大概是这样子: 628c006a-2fa9-47ee-ae29-e7ed0f540d33-image.png 然后,本文介绍的这套方案将会在它的基础上做一些拓展,目的是生成一块块带有不同地形的地图,而且每一次生成地图是有足够的随机,同时还会加上一些半岛等丰富的变数。

    一、方块生成 首先我们创建一个矩形,这是最基础的地图。

    然后随机在矩形内布下若干个点。

    从这些点的坐标出发,每个点生成一个多边形,边数在3~6之间。

    这三步之后,地图大概是这个样子: 1f7673d0-e5b9-4117-9cdf-fb39681347ec-image.png 这一步实际上是随机把一个大的矩形切割成若干个方块,接下来的操作则把这些方块当做是最基础的元素来进行地图生成。

    二、方块编号 依照下面的规则来给方块编号:

    最靠近大矩形边缘的方块命名为1;

    剩下的方块里,与1相邻的方块命名为2;

    剩下的方块里,与2相邻的方块命名为3;

    …… f0a4b481-0ad4-4d9e-be64-0694184201b2-image.png 渐渐把矩形内所有方块都命名了一个数字,这个数字可以简单地代表一个方块距离矩形边沿有多远。接下来,会以数字较大的一些方块作为中心,进行地图下一步的生成。

    三、水域切割 找到数字较大的方块,假设在第二步里生成了若干个5和6的方块,那就把所有这些方块命名为中心方块。

    选择1个中心方块,以它作为起点,依次随机找与它相邻的、数字编号减一的方块,如下图: 081e58f2-dcb7-4b19-89e1-c73c2dc1d25b-image.png 如上图,灰色的就是中心方块,蓝色的就是执行上述步骤后选择的方块。

    然后随机取中心方块作为起点,继续执行若干次上述的操作: e9603aca-d78f-49bb-a963-cb2a5dad3c91-image.png 接着,把所有编号为1的方块全部命名为水域方块: b73fde17-d85f-4c7a-8ae0-6df52e7801d0-image.png 至此,我们就把整个地图从中心出发,切割出大小不一、方向随机的水域,同时整个地图也会被水域包围,充当地图边缘的作用。

    四、随机切割 这一步,我们给地形加一些随机性。

    做法很简单,随机在剩余的非水域方块里,把1~3个方块切割出来当做是内陆水域。如果你想整个地图没有岛屿,则只需要保证在切割后不会出现一个四周都是水域的方块即可。切割后如下: d3fd61a4-5a02-4e0c-9172-00d393b2fe00-image.png 五、地形分布 这时候,我们把整个地图切割成两个部分:

    一部分是被切割出去当做是水域;

    一部分是大陆,而且会被水域分割成多个部分,会有一块相对中心的区域将它们连接起来。

    地形分布一般有两种做法:

    一种是直接按方块的数字编号来画等高线,依次分布平原、山丘、高原等地形,这就是文章开头提到的那两张示意图的做法;

    另一种则是按照区域来划分地形,比如把大陆分割成草地、沙漠、森林、雪山等地形。

    这里讨论第二种做法。

    我们从边缘出发,在一个随机区间内取小方块的数量,这里假设是[10,12],把每次取得的方块当成一个集合,称为一个地形。

    依次执行上述的步骤,就可以把整个地图分割成多个大块的地形,如图: 42337fd8-42d3-4e19-8bf3-100b41842286-image.png 每个颜色就代表一个大的地形块,这时候就按照地图的需要来分配具体地形即可。

    实际上,如果运算量足够大,可以把方块数量显著提高,可以得到更加平滑的边缘和多变的大小地形块。 来源知乎,原地址:https://zhuanlan.zhihu.com/p/26965602

    随机地图有很多种做法,比如有房间形式的、不想要水域的,这只是提供一个方案供参考。



  • nice,正好需要,谢谢大佬Thanks♪(・ω・)ノ



  • 问题来了,唤镜怎么做,唤镜无法创建多边形,甚至是一条直线


登录后回复