如何为hexagon字段实现BFS(在javascript中)
我正在开发一个基于六边形地图的浏览器游戏。我有这样一个问题:现在我有一个问题,我想标记单元可以移动的字段(它的移动有限)。 如果移动值为1,则没有任何问题,但如果移动值较高,则无法正常工作(请尝试) 我用坐标系工作 我的实际js在这里: 在另一个问题中()@unkulunkulu建议我使用BFS算法。但我没有这样的算法的经验,也没有在javascript中实现的经验,也没有在hexagon map上使用的经验。他说BFS算法在这方面更好,因为我以后可以很容易地扩展它(添加一些障碍物等)如何为hexagon字段实现BFS(在javascript中),javascript,jquery,Javascript,Jquery,我正在开发一个基于六边形地图的浏览器游戏。我有这样一个问题:现在我有一个问题,我想标记单元可以移动的字段(它的移动有限)。 如果移动值为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。建议的算法大致如下:
就其价值而言,我认为我最初的递归建议从效率的角度来看是失败的,这取决于您想要走的距离,这可能会导致堆栈溢出问题。:) 你的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的东西,所以我上面写的可能不是对它的完美描述。我认为我重写它的方式更好,但我非常乐意接受关于正确方式的建议,并根据需要进行修改。。。如果你想在另一个答案中加入这些信息,我也非常乐意投赞成票,因为我学到了更多的东西