增加相似图块彼此相邻生成的可能性


9

我正在开发一个瓷砖地图系统,它看起来像这样(绿色是草,空气是白色,石头是灰色,蓝色是水):

瓷砖

它使用了一个简单的随机数生成器,因此瓷砖有45%的机会是草,有30%的机会是水,有25%的机会是石头。

无论如何,我是否可以增加草块/石头块结成块形成土地块,并使水块形成海洋的趋势(有点像在《我的世界》这样的游戏中看到的那样)?

Answers:


17

您可以使用一种算法来检查附近的区块,并根据那里的情况来改变概率-但我认为这在很大程度上是错误的方法。

您要查看的是分形噪声类型-在这种情况下,是Perlin或单纯形噪声。如果产生噪声,您将获得-1到1之间的值。

http://en.wikipedia.org/wiki/Perlin_noise

然后,您可以通过设置水的阈值来调整水位。对于其他块,您可以运行第二组噪声以在岩石和草丛之间切换。(这样一来,您可以拥有大块的水,但块状的石头较小)。

getTerrain(x,y) {
if(perlin_noise(x,y) > 0) {
    if(perlin_noise(x * scale,y * scale) > 0) {
        return rock
    } else {
        return dirt
    }
} else {
    return water
}

我认为扫描和抛掷方法过于复杂,而且伸缩性也不太好,因此,我建议您使用另一种方法:

在您的地图上放置一个网格,将地图分成大正方形。

在每个交叉点生成一个随机数(0和1之间的数字将适合您的百分比)

通过将每个正方形切成4个偶数正方形来进行细分-遵循旧线,然后在其中找到细分线,在2个相邻点之间生成一个随机数,类似地,对于十字架的中心,生成一个位于最高点之间的点和最低值。

冲洗,然后重复。您将从第一遍获得初始随机性,但是后遍将为伪随机数提供一些均匀性抱歉:

0-------5  0---3---5 0-1-3-4-5 011233455
|       |  |   |   | | | | | | 012344555
|       |  |   |   | 0-2-4-6-5 002445665
|       |  |   |   | | | | | | 123445666
|       |  2---5---7 2-4-5-7-7 234455777
|       |  |   |   | | | | | | 233455688
|       |  |   |   | 2-3-5-5-9 223455589
|       |  |   |   | | | | | | 233455589
2-------9  2---4---9 2-4-4-5-9 234445579

这对于三角形来说效果更好,因为细分时没有丢失的交叉横条。

当然,绝对最好的结果将来自这些方法的结合-逐层地进行,某些技术将为您提供大量的土地,其他技术将为您提供令人敬畏的洞穴,其他技术可为丘陵工作,而其他一些则可为水系统工作。


+1,因为我认为通常会导致噪音上升。.我想知道这是否可能有点太大,所以最初的“扫描并更改百分比”使我参与了投票:)
詹姆斯

3

如前所述,噪声是一种很好的解决方案。另一个选择是对数据进行第二遍处理,以将其微调到所需的布局。高斯模糊是可以实现此目的的众多方法之一。通过该操作会为您带来每种类型的不错的“圆形”斑点。

无论采用哪种方法,都需要牢记的重要一件事是将过程结果存储在新位置。如果在适当位置修改地图,则已经处理的部分将开始影响算法,并且最终会出现一些奇怪的模式。


2

一种相对简单的方法是在随机位置创建多个原子核。绘制这些点的Voronoi图。为结果的每个区域分配一个元素。

这导致外观有些难看和机械。将边界弄得有点泥泞,您将处于体面的状态。

如果要生成大型地图,则可以在两个级别上进行。使用20个原子核创建您的初始Voronoi图,并将每个产生的区域称为一个国家。使用400个核创建另一个图,并将每个结果区域称为牧区。

完全包含在一个国家内的所有牧师都有国家的元素。部分包含在两个或多个国家中的牧师将随机采用其所在国家的元素之一。

这篇文章值得一看,但我懒得提供。


2

多边形地图生成器将有助于您更好地创建具有不同“区域”的地图,这也可以使您形成更好的地图。它基于voronoi图,但我想这将是一个不错的开始。


0

您可以使用以下方法进行操作:

  • 将所有瓷砖放在未指定的列表中
  • 虽然未指定列表中有一个图块
  • 开始
  • 从该列表中选择一个图块
  • 检查该图块的邻居,并根据其邻居选择一种类型
  • 从未指定的列表中删除该图块
  • 结束
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.