我正在为大学的计算机游戏项目编写明星算法。老实说,我担心一旦我提到大学,我就会有任何响应者向西走,我也承认我用来处理的二维节点数组的大小非常大,宽度 = 800 &高度 = 800 我已经设法让它得到最好的工作。但是我遇到了一个有趣的错误
if (!diagonalMovementAllowed) {
if ((x != 0) && (y != 0)) {
continue;
}
}
如果没有下面的代码,我可以从任何坐标找到目标,只要它在二维数组的范围内,但是如果我使用上面的代码,算法似乎无法达到目标,如果开始或目标距离相当大,例如
如果目标 x = 700 & y = 700 并且如果开始 x = 0 & y = 700,没问题
但是,如果目标 x = 700 & 目标 y = 700 并且如果 start x = 690 & y = 720 似乎找不到路径
我的问题是 arrayList (open 或 closedList) 是否可以达到一个点,它根本找不到目标并且已经达到了一个非常高的大小以至于它只是退出并且有没有办法识别导致这种情况的原因,而无需遍历每个 x和 y 使用调试器进行协调?
我确实觉得这是一个相当模糊的问题,但我希望我能得到一个一般性的答案,因为我觉得很多人不会太倾向于引导我完成整个解释,特别是因为我确实提到了它的一个项目我的讲师似乎什么都知道。我希望我能得到一些建议和答案,并提前致谢。
编辑:回答以下2个问题(感谢您的快速回复)
for(int x = -1; x < 2; x++){
for(int y = -1; y < 2; y++){
if (!diagonalMovementAllowed) {
if ((x != 0) && (y != 0)) {
continue;
}
}
int neighborX = x + current.x;
int neighborY = y + current.y;
}
}
上面的代码是其中的一部分,我显然不想全部发布,因为我的讲师可能会因为获得太多帮助而对我开枪(或失败),但要解释上面的内容
当 openList 不为空时,循环遍历 x 和 yx = x -1 或 x = x +1 y = y -1 或 y = y +1 的邻居
0,0 0,1 0,2 1,0 1,1 1,2 2,0 2,1 2,2 如果你在 1,1(开始)并且你不想要对角线运动,那么以下应该被允许 (0,0) (2,0) (2,2) 或 (0,2) 这是通过阻止 x 和 y 不等于 0 来实现的
neighborX = x + current.x
1 = 0 + 1
neighborY = y + current.y
2 1 + 1
(1,2)
neighborX = x + current.x
1 = 0 + 1
neighborY = y + current.y
0 -1 + 1
(1,0)
neighborX = x + current.x
2 = 1 + 1
neighborY = y + current.y
0 -1 + 1
(2,0)
neighborX = x + current.x
0 = -1 + 1
neighborY = y + current.y
0 -1 + 1
(0,0)