立方体表面的星寻路算法启发式算法

时间:2012-12-07 07:25:51

标签: javascript performance coffeescript path-finding a-star

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

我试图让它使用A *而不是我找不到一个好的启发式。在有4个运动方向的平面网格上,我会使用曼哈顿距离。我已经尝试过使用3D曼哈顿距离abs(dx) + abs(dy) + abs(dz)但这并不是很有效:对于蛇来说,游戏世界真的6 grids (corresponding to the faces of the cube)具有不同寻常的环绕特性。

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

以下是寻路发生的游戏代码区域:

https://github.com/mhluska/Snakeception/blob/master/src/js/game.coffee#L105

这是A *的库代码:

https://github.com/mhluska/Stimpack/blob/master/src/js/graph.coffee#L60

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

1 个答案:

答案 0 :(得分:3)

解决这个问题的一种方法是,一旦你抓住一个食物项目,而不是做所有的寻路,让蛇朝着有下一个食物的一侧移动然后,当它在那一侧时,使用基本的2D网格A *算法来获取食物项目。换句话说:

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

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

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