Javascript 立方体曲面的星型启发式寻路算法

Javascript 立方体曲面的星型启发式寻路算法,javascript,performance,coffeescript,path-finding,a-star,Javascript,Performance,Coffeescript,Path Finding,A Star,我正在建造一个在立方体表面上播放的游戏。目前它使用Dijkstra的算法进行寻路。尽管对set和priority队列数据结构进行了优化,但仍然有点太慢。当蛇吃了一种食物并开始寻找一种新的食物时,你会注意到延迟 我试着让它使用*来代替,但我找不到一个好的启发。在有4个运动方向的平面网格上,我会使用曼哈顿距离。我曾尝试使用3D曼哈顿距离abs(dx)+abs(dy)+abs(dz),但没有成功,原因很好:对蛇来说,游戏世界确实有着不同寻常的环绕属性 在代码中,每个正方形存储在网格[15][15]2D

我正在建造一个在立方体表面上播放的游戏。目前它使用Dijkstra的算法进行寻路。尽管对set和priority队列数据结构进行了优化,但仍然有点太慢。当蛇吃了一种食物并开始寻找一种新的食物时,你会注意到延迟

我试着让它使用*来代替,但我找不到一个好的启发。在有4个运动方向的平面网格上,我会使用曼哈顿距离。我曾尝试使用3D曼哈顿距离
abs(dx)+abs(dy)+abs(dz)
,但没有成功,原因很好:对蛇来说,游戏世界确实有着不同寻常的环绕属性

在代码中,每个正方形存储在
网格[15][15]
2D数组中。有6个这样的数组来存储每个面。因此,每个正方形都有一个
(arrayX,arrayY,d)
三元组来描述二维数组中的偏移量并指定哪个数组。此外,每个正方形都有一个描述空间位置的
(x,y,z)
三元组

以下是进行寻路的游戏代码区域:

这是A*的库代码:


对于这个游戏世界来说,什么是合适的、简洁的启发式方法?

解决这个问题的一种方法是,不要在你抓到一个食物后立即进行所有的寻路,而是让蛇移动到有下一个食物的一侧,然后,当它在那一侧时,使用基本的2D grid a*算法来获取食物。换言之:

每当蛇抓住食物或移动到立方体的新一侧时,请执行以下操作:

  • 如果食物项目位于当前立方体一侧,请使用a*算法和2D曼哈顿距离启发式算法找到它的路径
  • 如果食物位于立方体的相邻一侧,请使用相同的寻路算法查找到与当前一侧和目标一侧相邻的立方体边缘的路径
  • 如果食物项目位于立方体的另一侧,请使用相同的寻路算法从当前一侧找到一条路径

这不能保证总路径最短,但通常应接近最短路径,它应该更快,因为它将寻路分为多个阶段,并对每个阶段使用更有效的算法。

这是一种有效的分层寻路方法。您可以将图形视为一个环绕的2D+形状的网格,因此a*的启发式算法只需取几个值中的最小值(试着想象一下,在一个1D网格上,你是如何做到这一点的。但是,由于只有1000个节点,这真的不必要,即使在Javascript中也是如此。代码的某些部分(或者你使用的数据结构)运行时间太长。您需要进行一些分析,以确定哪些线路导致了速度减慢-您应该能够轻松搜索1000多个节点,而不会出现明显的延迟。