如何为hexagon字段实现BFS(在javascript中)

如何为hexagon字段实现BFS(在javascript中),javascript,jquery,Javascript,Jquery,我正在开发一个基于六边形地图的浏览器游戏。我有这样一个问题:现在我有一个问题,我想标记单元可以移动的字段(它的移动有限)。 如果移动值为1,则没有任何问题,但如果移动值较高,则无法正常工作(请尝试) 我用坐标系工作 我的实际js在这里: 在另一个问题中()@unkulunkulu建议我使用BFS算法。但我没有这样的算法的经验,也没有在javascript中实现的经验,也没有在hexagon map上使用的经验。他说BFS算法在这方面更好,因为我以后可以很容易地扩展它(添加一些障碍物等) 如果你有

我正在开发一个基于六边形地图的浏览器游戏。我有这样一个问题:现在我有一个问题,我想标记单元可以移动的字段(它的移动有限)。 如果移动值为1,则没有任何问题,但如果移动值较高,则无法正常工作(请尝试)

我用坐标系工作

我的实际js在这里:

在另一个问题中()@unkulunkulu建议我使用BFS算法。但我没有这样的算法的经验,也没有在javascript中实现的经验,也没有在hexagon map上使用的经验。他说BFS算法在这方面更好,因为我以后可以很容易地扩展它(添加一些障碍物等)


如果你有一些关于这个或类似的javascript教程的链接,那将是令人惊奇的。

首先,你只需要找到一种方法,从图片中当前的六边形(i,j)-即(4,3)中获取相邻的六边形

一旦你意识到你只需要根据当前专栏是偶数还是奇数涵盖两种情况,这也不难做到:

如果j为奇数(
j%2==1
),则从顶部顺时针方向看,相邻点为:

(i-1, j), (i-1, j+1), (i, j+), (i+1, j), (i, j-1), (i-1, j-1)
(i-1, j), (i, j+1), (i+1, j+), (i+1, j), (i+1, j-1), (i, j-1)
如果j为偶数(
j%2==0
),则从顶部顺时针方向看,相邻点为:

(i-1, j), (i-1, j+1), (i, j+), (i+1, j), (i, j-1), (i-1, j-1)
(i-1, j), (i, j+1), (i+1, j+), (i+1, j), (i+1, j-1), (i, j-1)
(请注意,您不能使用
(,)
表示法在javascript中创建对。可能更适合使用带有i和j属性的对象,如
{i:3,j:4}


这将允许您在给定当前坐标的情况下,找到相邻的正方形,并对它们进行着色或查找单个移动是否有效

如果您需要在两个步骤中找到所有可访问的十六进制数,或者找到最少的步骤数以达到某个十六进制数,则只需要使用更高级的算法



顺便说一句,不要试图在Javascript中找到所需算法的现有实现。Javascript具有足够的表达能力,因此很容易将其他语言(或伪代码)转换为Javascript。

建议的算法大致如下:

  • 取起点正方形,并将其标记为距离0。将其添加到已处理的十六进制列表中

  • 查找所有有效的相邻六边形(即您可以移动到的六边形)

  • 将所有这些方块标记为距离1。将它们添加到已处理的十六进制列表中

  • 查找与距离1六角相邻的所有有效六角,这些六角不在已处理的六角列表中

  • 将所有这些方块标记为距离2。将它们添加到已处理的十六进制列表中

  • X.查找距离N hexes附近的所有有效hexes,这些hexes不在已处理hexes列表中

    X+1。将所有这些方块标记为距离N+1。将它们添加到已处理的十六进制列表中

    宽度优先搜索的思想是从内部迭代所有可能性,以便始终找到到每个十六进制的最短距离

    在收到Unkulunkulu的评论后,我重新思考了这方面的最佳实现(在进一步输入后可能会再次更改)。您应该有一个如上所述的已处理的hexe列表,以及一个等待处理的hexe队列。未处理的十六进制列表仅从距离为0的起始十六进制开始,您将遍历此列表,直到其耗尽。当处理一个十六进制时,所有新发现的未处理的十六进制都被添加到此列表中,其距离为。因此,一旦处理完距离0十六进制,就应该添加所有距离1十六进制。他们得到处理,当他们完成时,你将有你所有的距离2六角在那里


    就其价值而言,我认为我最初的递归建议从效率的角度来看是失败的,这取决于您想要走的距离,这可能会导致堆栈溢出问题。:)

    你的j是奇数/j是偶数吗?对于4,3,按顺序排列的邻居是3,3 | 3,4 | 4,4 | 5,3 | 4,2 | 3,2,与您的j匹配的是偶数码…非常感谢。这是非常有用的,如果我想着色相邻的领域,但我想着色的所有六角可在2(或3,4,5)个步骤,我想更复杂的东西。你知道怎么做吗?我想知道从数学的角度看,这是否是最好的坐标系。i的之字形在某种程度上混淆了事情,而在一条直对角线上增加i(即向下和向右总是+1到i)则不会。然而,当你用这个坐标系看地图的时候,它可能不够直观……最后一段有严重的缺陷,你应该删除它或者完全重写。我从未见过一个递归实现的BFS。@unkulunkulu:我以前从未真正玩过BFS的东西,所以我上面写的可能不是对它的完美描述。我认为我重写它的方式更好,但我非常乐意接受关于正确方式的建议,并根据需要进行修改。。。如果你想在另一个答案中加入这些信息,我也非常乐意投赞成票,因为我学到了更多的东西