我需要编写一个算法,以便为 100 x 100 网格中的每个正方形分配一个瓷砖类型(一个用于水,一个用于陆地),我希望它生成一个“岛”。一些随机的东西,但是所有的陆地都在一起,所有的水都在边界上。有任何想法吗?
我听说过“柏林噪音”,但我不知道如何实现它来给出我想要的结果。我觉得我的情况对于如此复杂的算法来说可能太基础了。
谢谢!
我需要编写一个算法,以便为 100 x 100 网格中的每个正方形分配一个瓷砖类型(一个用于水,一个用于陆地),我希望它生成一个“岛”。一些随机的东西,但是所有的陆地都在一起,所有的水都在边界上。有任何想法吗?
我听说过“柏林噪音”,但我不知道如何实现它来给出我想要的结果。我觉得我的情况对于如此复杂的算法来说可能太基础了。
谢谢!
我玩的 Roguelike 游戏叫做 Brogue,它使用元胞自动机规则来生成湖泊和洞穴,而这样的规则可以用来制作岛屿,因为它们以令人满意的斑点方式生成,看起来很凝结,但不是过于圆形/方形。
在这里阅读:http: //brogue.wikia.com/wiki/Level_Generation#Lakes
样本:
使用与关卡一样大的缓冲区,并以 55% 的活动元素和 45% 的死元素作为种子。规则 B5678/S45678 进行了 5 次迭代:
如果我死了并且有 5-8 个活着的邻居,我就会活过来。
如果我还活着并且有 4 到 8 个活着的邻居,我还活着,否则我就死了。
在此之后,每个水平/垂直连接的活动元素的“blob”都被计算在内,并且小于lakeMaxWidth 和lakeMaxHeight 的最大blob 被保留。如果没有比 4x4 大且小于此的 blob,则重新启动元胞自动机。
我们称之为地图的宽度w
、高度h
和中心点C
。C
是一个二维向量(w / 2, h / 2)
。
随着您离 越来越远C
,水的概率应该会增加,最好有某种截止点。
让我们称当前正在评估的点P
,它也是一个二维向量(x, y)
,其中x
和y
是坐标。
P - C = D
给了我们一个新的向量D
,它的长度是从中心到被评估点的距离。
作为第一个实现,假设当 的长度(或大小)D
大于w - 20
我们放下水瓦时。
现在我们建立我们的网格。遍历每个图块,并计算D
. if D > (w - 20)
,我们将瓷砖标记为水,否则我们将其标记为土地。
这给了我们一个“完美”的圆形岛。
让我们介绍一些随机性。我们将条件修改为if D > ((w - 20) + randint(4))
(其中randint(x)
返回一个随机整数,从 0 到 x)。现在我们得到了一些崎岖的海岸线。
在这种情况下,我们可能会得到小的孤立地块。它可以解决,但不是这么简单的条件,Thomas Matthews 的想法在这种情况下会更好。
该岛仍将是相当圆形的,但它的崎岖程度取决于您randint
在该条件下喂食的食物。如果randint(someval)
产生大于 20 的值,我们可能在边界处根本得不到任何水,所以要注意这种情况。
如果我们想要某种方形岛,我们将需要检查我们与边界的距离。这也很容易,例如查看我们是否在左边框的 4 个图块内:P.x < 5
或在右边框的 10 个图块内P.x > w - 5
。
关于柏林噪音和无耻插件。在业余时间,我正在研究一个生成晶格噪声的库(Perlin 是一种晶格噪声。)您可以随意使用代码,或者如果您也想在这里查看它。它绝不是完整的,我敢肯定那里有错误,但它会产生分形噪音。
Perlin 噪声具有许多理想的特性,但可能需要一些额外的处理(通常是简单的数学运算)来塑造它。
我建议将网格设置为所有水。在地球上,水比陆地多。
接下来,选择一个随机点。将其分配为土地。
对于新岛的每一侧,您可以生成一个随机数来确定相对于第一个方格的下一个方格,即土地所在的方位。您还可以添加一些权重和规则,这样您的岛上就不会出现“湖泊”并且土地会接触土地。
在网上搜索“地形编辑器”。模拟城市游戏有一些地形编辑器,也允许从山脉到湖泊的深度。