我正在创造一款基于文本的游戏,并尝试着执行程序生成世界。
我最初的计划有点随意:每个宇宙都有一个三维的星系阵列,太阳系,然后依次与随机的天体传播。我计划单独生成实际的局部区域,但我不确定目前是否有可能完成我所拥有的任务。
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个字节。
我最初使用数组的目的是能够有效地将集群组合在一起,并更好地帮助识别玩家在宇宙中的位置。
我的问题是:我怎样才能更有效地创造一个如此规模的世界?
与其尝试着去存储结果世界,不如简单地为每个玩家创造一个独特的,随机的种子值,并在玩家玩游戏时使用它去动态地生成世界。
当您每次使用相同的值为生成器提供种子时,每次随机数将是相同的。所以,如果我的唯一随机玩家ID是654156475
,那么当我加载游戏时,将该ID放入宇宙生成器中,生成器将每次生成相同的宇宙。不同的玩家将获得不同的宇宙,因为他们的种子与我的不同。
关于如何在游戏中使用这种技术,请参阅本文的"电子游戏"部分。
或者,与其将其写为宇宙生成器,不如将其写为太阳系生成器(或任何玩家将占据的最小空间单位)。然后,为每个太阳系存储一个随机种子,并使用这些种子(这将是相对较少的数据量)在玩家玩游戏时生成(并在之后重新生成相同的内容)游戏场地。
这种方法的主要优点是您只需要将种子值存储在磁盘上,这是非常少量的数据,并且您根本不需要存储宇宙数据。不仅如此,动态地再生宇宙的一小部分通常比从磁盘加载要快得多。
我在很多年前就做过你所描述的事情(当pc有两个5.25英寸软盘驱动器时),我不会在内存中预先分配整个游戏。你应该将其分解,让游戏加载玩家所处的部分空间,比如10x10x10的3D块。当播放漫游越过加载空间的边界时,将该空间写入磁盘,并在它们已移动到的空间中读取。