如何从种子产生随机水平?[关闭]


46

我将如何使用随机种子生成游戏关卡?相同的种子应始终生成完全相同的水平。

对于此示例,它将是蠕虫样式级别。因此,每个级别都会有一个主题(草地,雪地等),基本地形,不同的对象(例如树木)。

那么我将从哪里开始创建这种级别生成器呢?会涉及什么?它使用什么概念?

积分为任何任何好的链接(奖励积分为任何有关它是如何在蠕虫或类似的完成)。

谢谢。


随机级别生成也称为过程内容生成(PCG)。这是一个维基处理的内容。pcg.wikidot.com应该给你一些想法!:o)
Kaj 2010年

1
克里斯·克劳福德(Chris Crawford)的文章可能会很有趣。它写于90年代初期,但仍然很有意义。如何建立世界
安东尼

如果您使用任何使用相同随机数生成器的形式或算法(除了以某种方式潜入系统时间等不变形式的生成器),则相同的种子生成相同的级别,实际上没有办法解决。
卡伊,2010年

1
是的,但我认为诀窍实际上是首先使用种子来生成关卡。我之前已经构建了随机级别生成器,但是它们没有使用单个种子。通常,我会选择随机点,然后为每个点选择一个随机资产放置在此处。这样,就不会有一个真正的种子会始终生成相同的级别,因为有一堆东西会生成自己的随机数。
亚当·哈特

10
您确定知道“种子”是什么意思吗?这是通过传递的“初始向量” srand(int)。随后的调用rand()将返回顺序值,该顺序值始终基于此种子以相同顺序计算。您在程序中设置了一次种子。之后,如果算法仅取决于的结果rand,则每次都会获得相同的结果。
Heath Hunnicutt

Answers:


7

这样做的关键是使用您自己的自定义伪随机数生成器,并使用已知的种子值对其进行初始化。“ Mersenne Twister”是一种流行的算法,这是Wikipedia条目和一些示例源。该PRNG算法以及其他PRNG算法实际上会生成一个(很长)固定的数字序列,其种子值用作起点。

只要您每次都遵循完全相同的过程生成世界,则每个值都将代表一个唯一的可复制世界。


4

这是在ActionScript(在AS2或AS3中可用)中实现的PRNG(伪随机数生成器)。它轻巧,快速,非常适合游戏:http : //lab.polygonal.de/2007/04/21/a-good-pseudo-random-number-generator-prng/

上面的实现基于Park-Miller-Carta PRNG。该站点将使您对所有这些背后的数学有更多的了解。

为了构建蠕虫状的关卡,我可能会使用Perlin-Noise函数。如果您生成高度为1px且游戏世界的宽度为Perlin的噪点图像,则基本上可以得到一个高度图,随时可以使用。Perlin噪声函数还始终使用相同的种子生成相同的贴图。

然后,您可以使用上面提到的PRNG来确定将随机对象放置在地图上的位置,或在地面上创建孔的位置。对于孔,您还可以再次利用佩林噪声。只需创建具有地图大小(x,y)的Perlin噪声图像,然后在地图中创建一个像素值低于给定阈值(例如0.2)的孔。


我会使用perlin杂讯,但有一点不同,用它来创建3D高度图,将其放在坡度上,并删除所有低于阈值的像素。(如果pixel.height-(pixel.distanceToBottom * slopeFactor)<阈值)pixel =透明)
Niels,

2

从理论上讲,如果您可以使用伪随机数生成器(例如Perlin-Noise或Marsenne Twister)通过以下方式共享地图

种子编号,然后您还可以创建自定义地图并将其简化为种子,从而解决了无法创建种子的问题

使用PRNG时的自定义地图。但是,这是基于一些假设的。即伪随机数生成器是

一个可逆的过程,将任何反馈到PRNG的数据都将产生有效的种子,更不用说种子了!

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.