在六角形网格上显示范围


10

这是情况。

我有一个六角板,上面有一个单位,具有速度或移动值。4。地形不同,成本也不同。当我单击该单位时,游戏应向我显示移动范围。

我的解决方案是使用A *寻路来检查4个范围内的每个十六进制,如果路径成本小于4,则此范围内的十六进制。最后,游戏很好地向我显示了该单元的范围。

我的问题是:是否有其他解决方案可以在十六进制网格或正方形网格上搜索范围,因为即使我为自己在解决方案中所做的事情感到非常自豪,我认为这还是有点夸张了吗?

是什么让我问这个问题?我注意到,当单位速度为4或6甚至8时,我的计算机达到计算范围的时间确实不错,但是当速度为10或更高时,我注意到我需要等待几秒钟来进行计算在真实游戏中,我宁愿看不到这样的东西,而且我的A *寻路功能已经过优化,因此我认为我的解决方案是错误的。

感谢您的任何答复。


1
我同意Byte56的观点,广度优先搜索算法是一个很好的解决方案。这并不是说您不应该尝试发挥创造力,但是就众所周知的算法而言,这是一种适用性很好的好方法。
theJollySin 2012年

Answers:


11

没错,A *有点矫kill过正,但幅度不大。您不应该看到像您一样的延迟。A *实际上只是修改过的Dijikstra算法。由于您没有使用终点位置(因为终点位置仅是“可以走的尽可能远”),因此不需要使用A *及其启发式方法。只需使用Dijikstra或简单的广度优先搜索就足够了。

例如,Dikikstra将在所有方向均匀分布:

在此处输入图片说明

(简单的广度优先搜索与此类似)

跟踪前往每个节点的成本。一旦某个节点的旅行成本达到最高,就不要再处理其连接的节点了。(类似于节点进入下方墙的位置)。

如果您仅在10个节点上遇到性能问题,则需要查看如何访问这些节点。广度优先搜索应该能够在没有明显延迟(一定不是几秒钟)的情况下导航数百个节点。考虑以图形格式存储世界的简单版本,以便快速遍历。


您能否使用BFS并考虑障碍物/不同权重来找到两个节点之间的距离?
路加B.

节点之间移动的成本大部分应该预先计算。成本不是使用BFS计算的,BFS是用于遍历节点的算法。如何确定从一个节点到另一个节点的旅行成本与遍历节点的方式无关。
MichaelHouse

谢谢,现在我明白了我的想法为什么错了,关键是这样的陈述:“因为您没有使用终点位置(因为终点位置只是“您能走得尽可能远”))。在我的解决方案中我只是从错误的方向上解决了这个问题。首先我确定了边界,然后从那里回到我的单位,这样我可能多次经过相同的节点。当我的速度提高时,计算量也大量增加。按照您的显示方式,我将总是访问一次节点。我只是观点错误,非常感谢,这简化了很多。
user23673

4

阿米特·帕特尔(Amit Patel)提供了一个极好的资源,可在他的网站上获取范围。在本文中,他使用以下算法收集一定范围内的十六进制图块:

for each -N  Δx  N:
    for each max(-N, x-N)  Δy  min(N, x+N):
        Δz = xy
        results.append(H.add(Cubex, Δy, Δz)))

这将创建与十六进制网格对齐的边界:

在此处输入图片说明

这将在中心六边形的一定距离内找到所有六边形,如果您想考虑障碍物,请从我的其他答案中使用广度优先搜索。


1

如果有人需要它,这是Patel算法的C#实现:

IEnumerable<Hex> GetRange(Hex center, int range)
    {
        var inRange = new List<Hex>();
        for (int q = -range; q <= range; q++)
        {
            int r1 = Math.Max(-range, -q - range);
            int r2 = Math.Min(range, -q + range);
            for (int r = r1; r <= r2; r++)
            {
                inRange.Add(center.Add(new Hex(q, r, -q - r)));
            }
        }

        return inRange;
    }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.