【问题标题】:A pathfinding problem: how to tell water-road situation?寻路问题:如何判断水路情况?
【发布时间】:2022-01-20 20:27:21
【问题描述】:

如你所见,有一张地图,我想寻路以确定哪些城市彼此喜欢。

地图中的黄色瓷砖是陆地,蓝色瓷砖是海洋。 红色字体表示有水路,绿色字体表示有 是一条路。正确的路径应该是路-路、水-水路、 道路-港口-水路或水路-港口-道路。因此,

2,6City 可以通过 (2,6City)-(1,6)-(0,6)-(1,5)-(2,5)-(3,4Harbor)-( 2,4City),

2,6City 可以通过 (2,6City)-(1,6)-(0,6)-(1,5)-(2,5)-(3,4Harbor)-( 2,4市)– (1,4)-(0,3City)-(0,2)-(0,1)-(0,0City),

2,6City 可以通过 (2,6City)-(1,6)-(0,6)-(1,5)-(2,5)-(3,4Harbor)-( 3,3)– (3,2)-(4,1Harbor)-(3,0City)。

但是,当我使用 GKGridGraph 为 Pathfinding 创建地图时,我不知道如何 告诉水路不通公路的情况。你可以看到,我不想:

2,6City 可以通过 (2,6City)-(2,5)-(2.4City) 或

链接到 2,4City

2,4City 与 2,2City 相关联,因为 (2,4City)-(3,4Harbor)-(3,3)-(3,2)-(2,2City)

那么,有什么建议吗?非常感谢。

【问题讨论】:

  • 我不熟悉GKGridGraph。一般来说,我会尝试使用 DFS(您在其中探索每条路径到其终点)并在 getNeighbors 函数中实现限制。例如,只有道路和港口被视为道路的邻居。
  • 感谢您的建议。这是解决我的问题的一种方法,但它似乎有点复杂,因为我需要维护一个新的网格。无论如何,还是谢谢你。
  • 我需要维护一个新的网格我不确定你的意思。只需要一种网格表示。
  • 好吧。我使用 GKGridGraph 创建我的地图网格,以便我可以使用 GKGridGraph 的 findpath 函数来检查网格中的两个图块是否可以连接。使用DFS时,首先要自己实现DFS功能,然后需要新建一个网格告诉DFS哪些瓦片相互连接。比如:让图=图()让节点A=图.addNode(“a”)让节点B=图.addNode(“b”)图.addEdge(节点A,邻居:节点B)

标签: ios swift algorithm path-finding gameplay-kit


【解决方案1】:

如果您使用GKGridGraph(fromStartingGridAt:width:height:diagonalsAllowed:) 创建图表,那么每个节点都与它的每个邻居都有连接。所以你的地图的更好的图片是这样的:

由于每个节点都已连接,因此它将找到穿过水的最短路径。为防止这种情况发生,您需要删除不可能的连接。您的图表应如下所示:

要实现这一点,您只需使用 GKGraphNode.removeConnections(to:bidirectional:) 从图表中删除不需要的连接

这可以通过这样的函数来实现:

func disconnect(_ a: vector_int2, _ b: vector_int2) {
    guard
        let first = grid.node(atGridPosition: a),
        let second = grid.node(atGridPosition: b)
    else {
        return
    }

    first.removeConnections(to: [second], bidirectional: true)
}

根据您存储和加载地图的方式,更好的解决方案可能是从一个空图表开始,仅在加载地图时添加必要的连接。

【讨论】:

  • 非常感谢。我已经根据您的提示完成了代码,它解决了问题。再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多