Answers:
您可以使用一种算法来检查附近的区块,并根据那里的情况来改变概率-但我认为这在很大程度上是错误的方法。
您要查看的是分形噪声类型-在这种情况下,是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
这对于三角形来说效果更好,因为细分时没有丢失的交叉横条。
当然,绝对最好的结果将来自这些方法的结合-逐层地进行,某些技术将为您提供大量的土地,其他技术将为您提供令人敬畏的洞穴,其他技术可为丘陵工作,而其他一些则可为水系统工作。
如前所述,噪声是一种很好的解决方案。另一个选择是对数据进行第二遍处理,以将其微调到所需的布局。高斯模糊是可以实现此目的的众多方法之一。通过该操作会为您带来每种类型的不错的“圆形”斑点。
无论采用哪种方法,都需要牢记的重要一件事是将过程结果存储在新位置。如果在适当位置修改地图,则已经处理的部分将开始影响算法,并且最终会出现一些奇怪的模式。