2

我正在创建一个基于文本的游戏,并尝试实现程序世界生成。

我最初的计划有点随意:每个宇宙都有一个星系、太阳系的 3D 阵列,然后依次通过随机天体传播。我计划单独生成实际的本地区域,但我不确定目前是否有可能完成我拥有的任务。

Each universe is a Galaxy[10][10][10] (arbitrary number at the moment),
each galaxy is a randomly sized SolarSystem[50-150][50-150][50-150],
each SolarSystem is a randomly sized CelestialBody[5-20][5-20][5-20].

然后,所有这些都将被写入数据文件以供稍后读取。

现在看,如果我没记错的话,这需要 (((ClassSize^3)^3)^3) 个字节,即使 ClassSize 只有 4 个字节,也无法存储。

我最初使用数组数组的目的是能够有效地将集群组合在一起,并更好地帮助识别玩家在宇宙中的位置。

我的问题是:我怎样才能更有效地创造一个如此规模的世界?

4

2 回答 2

9

与其尝试存储生成的宇宙,不如简单地为每个玩家创建一个独特的随机种子值,并在玩家玩游戏时使用它在程序上动态生成世界。

当您每次使用相同的值播种生成器时,随机数每次都将相同。因此,如果我唯一的随机玩家 ID 是654156475,则在我加载游戏时将该 ID 放入 Universe 生成器,生成器每次都会生成相同的 Universe。不同的玩家将获得不同的宇宙,因为他们的种子与我的不同。

有关如何在游戏中使用此技术的简要概述,请参阅本文的“视频游戏”部分。

或者,不要把它写成宇宙发生器,而是把它写成太阳系发生器(或者任何玩家将占据的最小空间单位)。然后,为每个太阳系存储一个随机种子,并使用这些种子(这将是相对少量的数据)在玩家玩游戏时动态生成(并在以后重新生成相同的东西)游戏场。

这种方法的主要优点是您只需将种子值存储在磁盘上,这是非常少量的数据,您根本不需要存储 Universe 数据。不仅如此,动态地再生宇宙的一小部分通常比从磁盘加载它要快得多。

于 2011-12-16T18:45:56.083 回答
5

在很多很多年前做过你描述的事情,(当 PC 有两个 5.25 英寸软盘驱动器时)我不会在内存中预先分配整个游戏。你应该把它分解,以便游戏加载玩家的宇宙部分是在,比如说在 10x10x10 的 3D 块中。当游戏漫游移动到加载空间的边界时,将该空间写入磁盘并读取它们移动到的空间。

于 2011-12-16T18:46:46.190 回答