Я пытаюсь создать приложение, реализующее A *, и у меня возникают проблемы с работой над логикой. Метод здесь принимает 4 ints (startX/Y, goalX/Y), а затем использует алгоритм A *, он будет строить ArrayList и возвращать его, поэтому основной метод может проходить через итерацию и отображать пути A *. Но то, что я получаю, - это сложный путь, который в конечном итоге создает очень толстый путь к узлу цели. Кто-нибудь может определить, где моя ошибка.Проблемы с построением алгоритма A *
Примечание: открытые и закрытые очереди приоритета и инструменты для плитки сопоставимы.
public ArrayList<Tile> findPath(int sX, int sY, int gX, int gY)
{
ArrayList<Tile> path = new ArrayList<Tile>();
open.offer(gameMap[sX][sY]);
Tile currentNode = gameMap[sX][sY];
Tile goalNode = gameMap[gX][gY];
int cX;
int cY;
while(open.size() > 0){
currentNode = open.poll();
closed.offer(currentNode);
path.add(currentNode);
cX = currentNode.getX();
cY = currentNode.getY();
if(currentNode == goalNode){
break;
}
if((cX > 0 && cX < gameMap.length - 1) && (cY > 0 && cY < gameMap.length -1)){
for(int i = -1; i < 2; i++){
for(int j = 1; j > -2; j--){
if(i == 0 && j == 0){}
else{
if((gameMap[cX + i][cX + j].type != 1) && !closed.contains(gameMap[cX + i][cX + j])){
if(!open.contains(gameMap[cX + i][cX + j])){
open.offer(gameMap[cX + i][cX + j]);
gameMap[cX + i][cX + j].parent = currentNode;
}
}
}
}
}
}
}
// while(currentNode != gameMap[sX][sY]){
// path.push(currentNode);
// currentNode = currentNode.parent;
// }
return path;
}
взгляните на это http://stackoverflow.com/a/23779490/2521214, чтобы у вас было что-то, что можно было сравнить. – Spektre