我正在寻找一个函数来生成随机的,基于图块的地图,因为地图的视觉边界发生了变化(通过地图)。我希望地图无限大,并具有迷宫般的结构。
但是,如果世界是无限的,那么回到玩家之前所处的位置会带来问题。游戏必须记住那里所有东西的实际外观。
所以,我在想-“我的世界如何解决这个问题?” 我以为自己必须使用某种带有种子的随机数函数,该函数既可以向前又可以向后移动,这样就可以像以前一样完全重新生成旧的图块,但是在新的实例中。
您对此有何想法?
我正在寻找一个函数来生成随机的,基于图块的地图,因为地图的视觉边界发生了变化(通过地图)。我希望地图无限大,并具有迷宫般的结构。
但是,如果世界是无限的,那么回到玩家之前所处的位置会带来问题。游戏必须记住那里所有东西的实际外观。
所以,我在想-“我的世界如何解决这个问题?” 我以为自己必须使用某种带有种子的随机数函数,该函数既可以向前又可以向后移动,这样就可以像以前一样完全重新生成旧的图块,但是在新的实例中。
您对此有何想法?
Answers:
您注意到的是随机数生成器和噪声函数之间的区别。每次您呼叫随机数发生器时,它都会吐出一个不同的数字。噪声函数接受一些自变量(例如,映射x和y),并吐出具有类似随机统计特性的数字,但是每次对相同自变量使用相同的值,即它是适当的数学函数。
两者是密切相关的。噪声函数可以通过每次传入一个不同的值(例如noise(1)
,noise(2)
等等)来模拟随机数生成器。转储到巨型表中的随机数生成器可以充当噪声函数。但是,在两种情况下,您都使用了错误的工具来完成工作。
Minecraft特别使用Perlin噪声,Perlin噪声是一种计算成本低的噪声,并具有在所需的任意多个维度上连续的理想特性-如果绘制f(x)
为f(x + 1)
,则不会有突然的跳跃。这对于纹理调制,体积云和气体以及地形生成等许多事情非常有用。
如果您正在寻找开始使用的实现,则Ken Perlin改进的Perlin噪声发生器是最简单的实现之一。
正如Joe指出的那样,您正在寻找哈希函数。通常,随机函数只是散布有最后返回数字的散列函数。因此,如果Random()
返回Hash(seed)=1234
,则第二个调用Random()
将返回Hash(1234)
,依此类推。
如果您正在寻找用于伪随机数的简单哈希函数,请查看MurMurHash。我已经在C#中实现了它,如果您有兴趣,可以将其发布到某个地方。柏林噪声的更详细的信息,使用这种散列函数,可以在这里找到这里,并在C#中的实现是在这里。
所有这些信息都来自一个问题,我问一年前在这里对堆栈溢出。您正在寻找的是过程内容生成,因此,如果您需要更多信息,请进行搜索。产生快乐的地形!