我写了一些类似的内容,作为您自动仿制《文明1》的屏幕保护程序样式的内容。为了记录,我在VB.net中写了此内容,但由于您在问题中没有提及任何语言或平台,因此我会继续它抽象。
“地图”指定了大洲的数量,大洲的大小方差(例如,1.0将使所有大洲具有相同的近似陆地面积,减小到0.1将允许大洲以最大大陆质量的1/10的形式存在),最大陆地面积(以百分比表示)产生,以及中央土地偏向。对于每个大陆,“种子”在地图上随机分布,并根据中心偏差在地图中心加权(例如,较低的偏差会产生与地球更相似的分布大陆,而较高的中心偏差会更像地球Pangaea)。然后,对于每次增长迭代,“种子”都会根据分配算法分配地砖(稍后会详细介绍),直到达到最大土地面积为止。
土地分配算法可以达到您想要的精确度,但我发现使用各种遗传算法并掷骰子可获得更有趣的结果。康威的《人生游戏》是一个非常容易上手的游戏。您需要添加一些具有全局意识的逻辑,以避免像大洲这样的事情相互扩散,但是在大多数情况下,事情要自理。我发现,使用更多基于分形的方法(这是我的第一个倾向)的问题是结果要么看起来过于图案化,要么导致了太多需要骇人听闻的变通办法的场景,以至于仍然无法获得足够动态的结果。根据您使用的算法,您可能需要对结果应用“模糊”传递,以消除诸如丰富的单方海洋瓦片和方格的海岸线之类的东西。如果发生了像被其他几只动物包围而又无处生长的大洲之类的事情,请将种子移到地图上的新点,然后继续进行生长。是的,这可能意味着您有时会获得比计划中更多的大洲,但是,如果您确实确实不希望这样做,那么另一种避免出现这种情况的方法是使增长算法产生偏差,从而使他们倾向于朝着与其他区域的距离最小的方向进行增长种子。最坏的情况下(无论如何,我认为)可以在种子无处可生长并生成新地图时将系列标记为无效。只需确保设置了最大尝试次数即可,因此,如果指定了任何不切实际的内容(例如在10x10的木板上拟合50个加权均匀的大洲),它都不会永远花费在寻找有效的解决方案上。
我不能保证Civ等是如何做到的,当然也不能涵盖气候,土地使用年限等问题,但是通过使用种子生长算法,您可以获得非常有趣的类似于大洲,群岛等的结果。您可以也使用相同的方法生产看起来像“有机”的河流,山脉等。