0

我正在为大学的计算机游戏项目编写明星算法。老实说,我担心一旦我提到大学,我就会有任何响应者向西走,我也承认我用来处理的二维节点数组的大小非常大,宽度 = 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)
4

3 回答 3

1

我假设您的代码片段是后继生成逻辑的一部分。不幸的是,我认为逻辑不正确:

if (!diagonalMovementAllowed) {
    if ((x != 0) && (y != 0)) {
        continue;
    }
}

当不允许对角线移动时,这将防止从内部位置(不在 x==0 列或 y==0 行中的位置)生成任何后继。

如果我对您的代码的假设是正确的,这就是为什么当起始位置类似于 x = 690 & y = 720 时找不到解决方案 - 起始位置没有后继!

于 2012-11-21T00:54:00.190 回答
0

我相信达到大小限制会导致错误并停止程序,所以我认为这不是问题。我不太了解您的代码段:您能否包含更多上下文(x,y 与是否允许对角线移动有什么关系?)

于 2012-11-21T00:28:48.547 回答
0

800 的大小本身并不“大”,它对你来说只是大。800万时回来:P。

只要您有足够的内存来处理它, ArrayList 的大小应该不是问题。我建议你的算法有问题。如果您可以发布更多代码,我相信有人会有想法。

于 2012-11-21T00:29:18.610 回答