我为文明 1 的自动屏幕保护风格克隆写了一些类似于你所追求的东西。为了记录,我在 VB.net 中写了这个但是因为你在你的问题中没有提到任何关于语言或平台的东西我会保留它抽象。
“地图”指定了大陆的数量、大陆的大小差异(例如,1.0 将使所有大陆保持相同的近似陆地面积,降至 0.1 将允许大陆以最大大陆质量的 1/10 存在)、最大陆地面积(以百分比形式)生成,以及中央土地偏差。每个大陆的“种子”随机分布在地图周围,根据中心偏差向地图中心加权(例如,低偏差产生更类似于地球的分布式大陆,而高中心偏差将更像一个盘古)。然后对于每次迭代的增长,“种子”根据分布算法(稍后会详细介绍)分配土地块,直到达到最大土地面积。
土地分配算法可以随心所欲地精确,但我发现应用各种遗传算法和掷骰子的结果更有趣。康威的“生命游戏”非常容易上手。您需要添加一些全局感知逻辑,以避免诸如大陆相互生长之类的事情,但在大多数情况下,事情会自行解决。我发现更多基于分形的方法(这是我的第一个倾向)的问题是结果要么看起来过于模式化,要么导致太多场景需要 hacky-feeling 变通规则来获得仍然感觉不够动态的结果。根据您使用的算法,您可能希望在结果上应用“模糊”传递,以消除诸如丰富的单方形海洋瓷砖和方格海岸线之类的东西。如果某个大陆被其他几个人包围并且无处可生长,请将种子重新定位到地图上的新点并继续生长过程。是的,这可能意味着您有时最终会获得比计划更多的大陆,但如果这确实是您坚决不想要的东西,那么另一种帮助避免它的方法是偏向增长算法,因此它们有利于在与其他大陆最不接近的方向上增长种子。在最坏的情况下(无论如何我认为),当种子无处可生长并生成新地图时,您可以将系列标记为无效。只要确保您设置了最大尝试次数,因此如果指定了任何不切实际的内容(例如在 10x10 板上安装 50 个均匀加权的大陆),它就不会永远花时间去寻找有效的解决方案。
我不能保证 Civ 等是如何做到的,当然也不包括气候、土地年龄等,但通过使用种子生长算法,你可以获得类似于大陆、群岛等的非常有趣的结果。你可以也使用相同的方法来制作看起来“有机”的河流、山脉等。