我正在构建一个在多维数据集表面上播放的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
对于这个游戏世界来说,什么是合适的,简洁的启发式?
答案 0 :(得分:3)
解决这个问题的一种方法是,一旦你抓住一个食物项目,而不是做所有的寻路,让蛇朝着有下一个食物的一侧移动然后,当它在那一侧时,使用基本的2D网格A *算法来获取食物项目。换句话说:
每当蛇抓住食物或移动到立方体的新一侧时,请执行以下操作:
这不能保证最短的整体路径,但通常应该接近最短路径,并且它应该更快,因为它将路径寻找分成多个阶段,并为每个阶段使用更有效的算法。