如何在随机生成的六边形地图中找到岛屿?

时间:2009-08-17 00:03:17

标签: algorithm map hex

我正在使用Codigniter和JQuery编写类似风险的游戏。我想出了一种方法来创建随机生成的地图,通过制作完整的瓷砖布局然后删除随机的。然而,这有时会产生我称之为岛屿的东西。

在风险中,你只能攻击一个空格。因此,如果一个玩家碰巧拥有一个自己的岛屿,他们就永远无法放松。

我正试图找到一种方法,我可以在游戏开始前查看地图是否有岛屿。

我已经提出了一个函数来找出每个空间有多少个相邻空格,但我不知道如何实现它以便找到岛屿。

每个丢失的地点也被识别为“水”。

我不允许使用图片代码: http://imgur.com/xwWzC.gif

5 个答案:

答案 0 :(得分:8)

这个问题有一个标准名称,但我的头脑中可能会有以下情况:

  • 随机选择任何图块
  • 着色
  • 为邻居着色
  • 为邻居的邻居着色
  • 给邻居的邻居染上邻居等等。

当你完成时(即当所有邻居都被着色时),循环遍历所有图块的列表以查看是否有任何静止/未着色(如果是,它们是岛屿)。

答案 1 :(得分:3)

你如何进行随机生成?可能最好的方法是在此时解决它。当您生成地图时,如果您注意到刚刚创建的地图是不可能的,您可以通过添加适当的元素来解决它。

虽然我们需要知道你是如何做这一代的。

答案 2 :(得分:1)

这是你从随机磁贴开始的基本深度优先遍历,用python式语言伪编码:

visited = set()
queue = Queue()
r = random tile
queue.add(r)
while not queue.empty():
    current = queue.pop()
    visited.add(current)
    for neighbor in current.neighbors():
        if neighbor not in visited:
            queue.add(neighbor)
if visited == set(all tiles):
    print "No islands"
else:
    print "Island starting at ", r

答案 3 :(得分:1)

这有望提供另一种解决方案。而不是“孤岛”我使用的术语是“断开连接的组件”,因为它只关系所有其他所有区块是否都可以到达(如果有断开的组件,那么如果他自己的区域都在一个组件中,则玩家无法通过征服获胜)

  • 遍历所有“陆地”牌(很容易做到),并且每个牌都会在图表中生成一个节点。
  • 对于每个顶点,将其与无向边连接到表示其相邻图块的顶点(最多6个)。
  • 选择任何顶点并从中运行深度优先搜索(或面包优先)。
  • 如果DFS找到的顶点集合等于所有顶点的集合,则没有断开连接的组件,否则存在断开连接的组件(孤岛)。

这应该(我认为)及时运行O(n),其中n是地砖的数量。

答案 4 :(得分:0)

在数据集上运行模糊内核。

将十六进制网格视为图像(它是一种)

value(x,y)=此(x,y)周围所有图块的平均值

这会轻微侵蚀海滩,消灭岛屿。

学生可以在结果数据集上运行边缘检测内核,以填充海滩图块。