假设你有一个hexmap n
细胞总数,和p
球员,其中p <= n
,为了解决这个最好的方法是通过轮询分配通过元胞自动机(CA)。
初始化
随机(和/或使用某种或其他启发式方法,例如距地图中心的距离)为每个玩家选择一个起始单元。由于p <= n
,这应该不是问题。
细胞自动机
您需要六角单元之间的完全连接。我建议每个单元格由6个邻居组成:
class Cell
{
//... other members...
Cell[6] neighbours = new Cell[6];
}
固定大小的数组的使用允许在单元之间存在地形方向的概念,而列表或矢量则不会。我建议您这样做,因为它可能会使某些导航操作变得更容易。
您还可以将hexmap存储在2D数组中,每行具有偏移量。但是,这仅是因为每隔一行上的几何偏移量,所以它比每个单元存储一个邻居数组的直观性要差一些。
确保每个单元都连接到邻近的所有单元。您可以在生成完整的十六进制图时逐行,逐个单元地执行此操作。PS:如果您最终想要一个非矩形边界的六边形图,则可以简单地删除单个单元格和对这些单元格的引用,以形成负数空间,从而可以创建有机的地图轮廓。
轮循分配
伪代码:
count number of neutral cells in entire map, minus those starting cells taken by players
while neutral cells remain (or while true)
for each player
if player has not yet reached expected territory size in cells
for each cell already constituting this player's territory
if territory can grow by one cell into a neutral neighbour
grow into neighbour
reduce neutral cell count for entire map by one
if no more neutral cells remain in map
break out of outermost while loop immediately
else
continue to next player immediately
begin game
该算法将使每个玩家都有机会以循环方式将其领土扩大一个,前提是该玩家的领土仍具有有效的增长空间。如果某些球员进一步成长受阻,该算法将尽管如此不断成长的球员谁的领土也仍然具有有效的成长空间。一旦其中一个玩家达到极限,您可以轻松地将每个玩家限制在相同数量的单元格中,但是如果需要的话,这应该足够容易让您找出来。
这将为每个玩家提供最大尺寸的“家园”。如果您还想拥有“岛屿”领土,为了满足该玩家的游戏室数量配额,那么一旦玩家用尽了本地空间来成长,您就可以从中立的游戏室列表中选择一个新的开始游戏室,从那里继续进行相同的“增长”过程。这样,您最终将获得适合每个玩家的大小合适且连贯的孤岛,而不是随机的杂音。