【转载】一个游戏地图生成的方案

作者:兔四
链接:https://zhuanlan.zhihu.com/p/26965602
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
 

这套方案的雏形来自于Eed Blob Games(Red Blob Games),基础的完成图大概是这样子:

然后,本文介绍的这套方案将会在它的基础上做一些拓展,目的是生成一块块带有不同地形的地图,而且每一次生成地图是有足够的随机,同时还会加上一些半岛等丰富的变数。

一、方块生成

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

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

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

这三步之后,地图大概是这个样子:

这一步实际上是随机把一个大的矩形切割成若干个方块,接下来的操作则把这些方块当做是最基础的元素来进行地图生成。

二、方块编号

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

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

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

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

……

渐渐把矩形内所有方块都命名了一个数字,这个数字可以简单地代表一个方块距离矩形边沿有多远。接下来,会以数字较大的一些方块作为中心,进行地图下一步的生成。

三、水域切割

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

选择1个中心方块,以它作为起点,依次随机找与它相邻的、数字编号减一的方块,如下图:

如上图,灰色的就是中心方块,蓝色的就是执行上述步骤后选择的方块。

然后随机取中心方块作为起点,继续执行若干次上述的操作:

接着,把所有编号为1的方块全部命名为水域方块:

至此,我们就把整个地图从中心出发,切割出大小不一、方向随机的水域,同时整个地图也会被水域包围,充当地图边缘的作用。

四、随机切割

这一步,我们给地形加一些随机性。

做法很简单,随机在剩余的非水域方块里,把1~3个方块切割出来当做是内陆水域。如果你想整个地图没有岛屿,则只需要保证在切割后不会出现一个四周都是水域的方块即可。切割后如下:

五、地形分布

这时候,我们把整个地图切割成两个部分:

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

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

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

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

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

这里讨论第二种做法。

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

依次执行上述的步骤,就可以把整个地图分割成多个大块的地形,如图:

每个颜色就代表一个大的地形块,这时候就按照地图的需要来分配具体地形即可。

实际上,如果运算量足够大,可以把方块数量显著提高,可以得到更加平滑的边缘和多变的大小地形块。

  • 6
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值