【发布时间】:2012-11-21 00:21:53
【问题描述】:
我正在为大学计算机游戏项目编写明星算法。老实说,我担心一旦我提到大学,我就会有任何响应者向西走,我也承认我用来处理的二维节点数组的大小非常大,宽度 = 800 &高度 = 800 我已经设法得到它的最佳部分工作。但是我遇到了一个有趣的错误
if (!diagonalMovementAllowed) {
if ((x != 0) && (y != 0)) {
continue;
}
}
没有下面的代码,我可以从任何坐标找到目标,只要它在二维数组的范围内,但是如果我使用上面的代码,算法似乎无法达到目标,例如,如果起点或目标距离相当大,则
如果目标 x = 700 & y = 700 如果 start x = 0 & y = 700,没问题
但是,如果目标 x = 700 & 目标 y = 700 如果开始 x = 690 & y = 720 好像找不到路径
我的问题是 数组列表(打开或关闭列表)能否达到一个点,它根本找不到目标,并且已经达到了一个非常高的大小以至于它只是退出并且有没有办法识别导致这种情况的原因,而无需遍历每个 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 和 y 的邻居 x = 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)
【问题讨论】: