我正在尝试为一个游戏编写一个基本的AI,游戏中角色需要在一个网格上收集点。这些点在网格上随机生成,我的AI只需要移动到网格上的那个坐标即可。
然而,AI无法看到整个网格,它只能看到一个5×5的网格,并且它在每次“回合”移动时位于中心位置。(所以它在每次回合都位于坐标(2, 2)。)
我的算法很基础,但它基本上是扫描5×5的网格并尝试找到最近的点,然后它会将角色朝那个方向移动。接下来的一回合,那个点会更近(因为我们刚刚移动得更靠近它),所以它会选择继续靠近它,直到到达所需的坐标。
这是用Java编写的代码:
Field[][] fields = gameboard.getFields(); int centerX = 2; int centerY = 2; // 大数,点总是比这些数更近 int nearestPointX = 1000; int nearestPointY = 1000; for (int i = 0; i < 5; i++) { for (int j = 0; j < 5; j++) { Field field = fields[i][j]; if (field.getType() == 0 && field.hasPoint()) { int distanceX = Math.abs(i - centerX); int distanceY = Math.abs(j - centerY); int totalDistance = distanceX + distanceY; int totalBestDistance = nearestPointX + nearestPointY; if (totalDistance < totalBestDistance) { nearestPointX = i; nearestPointY = j; } } } } Field northField = fields[centerX][centerY-1]; Field southField = fields[centerX][centerY+1]; Field eastField = fields[centerX+1][centerY]; Field westField = fields[centerX-1][centerY]; String move = previousMove; // 如果附近有点 if (nearestPointX != 1000) { if (nearestPointX > centerX) { move = "E"; } else if (nearestPointX < centerX) { move = "W"; } else if (nearestPointY > centerY) { move = "S"; } else if (nearestPointY < centerY) { move = "N"; } }
但在某些情况下,它会接近有多个点的区域,似乎感到困惑,只是在两个方块之间来回脉动。它在选择最佳方块时有时也显得零星不定,我认为这与此有关。
我已经读了无数遍并尝试调试它,但我就是找不出是什么导致了这个错误。谁能指出我在寻找最近点时做错了什么?
回答:
看看你做的比较。totalDistance
等于从你当前位置到所考虑点的步数,但totalBestDistance
是之前“最佳点”的框架内x,y坐标。所以(例如)如果你有点在(2, 4)和(3, 0),你的代码会这样做:
评估(2, 4) – distanceX
是0,distanceY
是2,totalDistance
是2。这会更新nearestPointX
为2和nearestPointY
为4。
评估(3, 0) – distanceX
是1,distanceY
是2。totalDistance
是3。然后totalBestDistance
变成nearestPointX
加上nearestPointY
,也就是6。所以(3, 0)变成了你的新“最佳点”,尽管你之前的那个更近(实际距离是2)。