java - 明星算法,异常行为

标签 java algorithm a-star

我正在为大学计算机游戏项目编写 A 星算法。老实说,我担心一旦我提到大学,我就会有任何响应者向西走,我也承认我正在使用的二维节点数组的大小非常大,宽度 = 800 &高度 = 800 我已经设法让它发挥最好的作用。但是我遇到了一个有趣的错误

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

没有下面的代码,我可以从任何坐标找到目标,只要它在二维数组的范围内,但是如果我使用上面的代码,算法似乎无法达到目标,如果起点或目标距离相当远,例如

如果目标 x = 700 & y = 700 如果开始 x = 0 & y = 700,没问题

但是如果目标 x = 700 & 目标 y = 700 如果开始 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 和 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)

最佳答案

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

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

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

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

关于java - 明星算法,异常行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13484473/

相关文章:

c# int[] array to byte[] array 只有 LSB

java - 如何随机显示给定单词中的单个字符

java - 检查两个时间点是否在不同的相邻日期

java - 一个字符串中有多个方法?

algorithm - 我认为 "NlogN"是 "N"乘以 "logN",但为什么它被描述为 "double PLUS an amount proportional to N"

algorithm - 如何在有向图中找到路径的概率?

c# - A* 算法缺少计算

iPhone寻路实现

c++ - 在 A* 遍历后从 map 中移除产生最佳路径的障碍

java - 正则表达式 - 如何匹配一定数量的任意单词后跟特定单词