Answers:
您是否尝试过劳埃德算法?该过程非常简单,并且会生成相当规则的外观区域(取决于您运行的迭代次数)。
您不必运行很长时间即可生成美观的地图。 这个例子只需要三个迭代。
您可以尝试的一种简单方法。
n
十六进制。每个人都会开始一个小组。我没有进行测试,但这会产生孤岛,并在某种程度上避免了长而细的牙套。另外,极有可能会有邻居边界,但不一定每个人都会互相联系,密度取决于的值n
。
有些组还可能被另一些组困住了,并达到了20个以下的大小,您可以通过以彼此之间的最小距离生成启动器六边形来确保增加的空间。
根据需要进行测试和调整。
另外,与该问题无关,但对于使用十六进制非常非常有用,请访问以下页面:http
: //www.redblobgames.com/grids/hexagons/#basics
它在一个位置将一堆完整的十六进制信息汇总在一起很好的视觉效果。
我绝对认为某种类型的图结构将使这成为可能。如果两个Hex节点彼此相邻,则基本上可以在它们之间创建一条边来模拟整个地图。但是,我不确定在该地图内生成“国家”的确切算法。问题是,取决于您希望该国家“看起来”如何,您将需要不同的算法。
我建议,从我的头顶上移开一个点,然后从那里向外移动,在您的“成长国家”中随机选择一个图块,该图块具有一个不属于该国家的相邻图块。
根据您想要的国家类型,可以使用一种策略模式来切换算法。http://en.wikipedia.org/wiki/Strategy_pattern,例如 ,您想要一个像智利这样的纤细海岸线国家吗?还是您想要更全面,更全面的东西?
图形属性还可以让您调整所需的“国家”的外观:http : //en.wikipedia.org/wiki/Eccentricity_(graph_theory)
想要一个大国?调整图形属性,并强制生成的国家/地区(仅是图形)具有使您想要的“外观”的属性。
最后但并非最不重要的一点是,图形对于定义国家之间的边界也非常有用。如果国家/地区彼此毗邻,则可以构建一个在两个节点之间具有连接的图形。这可能对游戏中的某些分区类型很有用,并且可以让您在开发过程中进一步优化某些功能。
一个小注意事项:您说“看起来像一张真实的生活地图,形状不同但大小相同的国家/地区),但是即使在某些地区内,“真实”国家/地区的规模也大不相同-甚至欧洲的“大型”国家/地区也可能相差很大,例如法国是意大利的两倍多。话虽如此,显然有一些游戏区域可以尝试保持大小大致相同-请注意,这里的一些变化可能是一件好事!
我最初解决此问题的方法是“演变”(而不是“增长”)您的地区:
现在,只要需要,就运行以下伪代码:
Pick a random hex A from the boundary list;
Pick a random neighbor B of this hex from a different country;
if (A's country has more hexes than B's country has) {
change hex A to belong to B's country;
} else if (B's country has more hexes than A's country has) {
change hex B to belong to A's country;
} else {
flip a coin to decide which to change;
}
if ( the changed hex's old country has become disconnected ) {
undo and reject this move;
} else {
update the boundary list around the changed hex and its neighbors;
}
这将在任何两个邻国的规模之间保持一个粗略的平衡,并且“断开连接”检查(可以通过简单的洪水填充算法来完成)确保没有任何国家会分裂。更新边界列表是一项固定时间的操作-更改后的十六进制将始终始终位于边界上,并且您可以仅检查其六个邻居以查看它们中的任何一个是否已成为边界单元(因为其邻居现在位于或不再是边界单元(因为它的邻居现在在同一国家/地区),因此可以根据需要修改边界集。
为了改进此方法,您甚至可以使要更改的十六进制的条件稍微随机化-而不是始终“平衡”这两个国家,您可以始终以一定的概率进行掉期,甚至逐渐降低该概率。时间(类似于“ 模拟退火”算法中的冷却过程)开始迫使它们大小大致相同。
请注意,这不能保证所有区域的大小都完全相同(除非N总是将网格大小完美地划分,否则这是不可能的),甚至不能保证所有国家/地区的面积都在一个十六进制之内。但是,它应该保证(进行足够的迭代)每个国家与其邻国的距离不大于或小于十六进制。