Ich habe den ganzen Tag damit verbracht, diesen Algorithmus zum Laufen zu bringen, aber ich kann es einfach nicht. Ich habe viele Tutorials im Netz gelesen und Quellcode in AS3, Javascript und C ++ angesehen, aber ich kann nicht anpassen, was ich sehe, um es in meinen eigenen Code einzufügen.
Ich habe eine AStar-Klasse erstellt, die eine verschachtelte Klasse namens Node hat. Die Karte ist ein 2D-Array namens MAP.
Das größte Problem, das ich habe, ist das Herausholen des F-Werts in der pathfind-Funktion.
Ich habe F = G + H implementiert, aber mein Problem ist der eigentliche AStar-Algorithmus. Kann mir bitte jemand helfen, das ist bisher mein Stand:
import java.util.ArrayList;
public class AStar
{
int MAP[][];
Node startNode, endNode;
public AStar(int MAP[][], int startXNode, int startYNode,
int endXNode, int endYNode)
{
this.MAP = MAP;
startNode = new Node(startXNode, startYNode);
endNode = new Node(endXNode, endYNode);
}
public void pathfinder()
{
ArrayList openList = new ArrayList();
ArrayList closedList = new ArrayList();
}
public int F(Node startNode, Node endNode)
{
return (H(startNode, endNode) + G(startNode));
}
//H oder Heuristik-Teil des A*-Algorithmus
public int H(Node startNode, Node endNode)
{
int WEIGHT = 10;
int distance = (Math.abs(startNode.getX() - endNode.getX()) + Math.abs(startNode.getY() - endNode.getY()));
return (distance * WEIGHT);
}
public int G(Node startNode)
{
if(MAP[startNode.getX() - 1][startNode.getY()] != 1)
{
return 10;
}
if(MAP[startNode.getX() + 1][startNode.getY()] != 1)
{
return 10;
}
if(MAP[startNode.getX()][startNode.getY() -1] != 1)
{
return 10;
}
if(MAP[startNode.getX()][startNode.getY() + 1] != 1)
{
return 0;
}
return 0;
}
public class Node
{
private int NodeX;
private int NodeY;
private int gScore;
private int hScore;
private int fScore;
public Node(int NodeX, int NodeY)
{
this.NodeX = NodeX;
this.NodeY = NodeY;
}
public int getX()
{
return NodeX;
}
public int getY()
{
return NodeY;
}
public int getG()
{
return gScore;
}
public void setG(int gScore)
{
this.gScore = gScore;
}
public int getH()
{
return hScore;
}
public void setH(int hScore)
{
this.hScore = hScore;
}
public int getF()
{
return fScore;
}
public void setF(int fScore)
{
this.fScore = fScore;
}
}
}
Dies ist der letzte Stand, den ich je mit der pathfinder-Funktion erreichen kann:
public void pathfinder()
{
LinkedList openList = new LinkedList();
LinkedList closedList = new LinkedList();
Node currentNode;
openList.add(startNode);
while(openList.size() > 0)
{
currentNode = (Node) openList.get(0);
closedList.add(currentNode);
for(int i = 0; i < openList.size(); i++)
{
int cost = F(currentNode, endNode);
}
}
}
0 Stimmen
Ich habe bereits Google und Yahoo durchsucht, um meine Antwort zu finden. Tatsächlich habe ich diese schon einige Male durchgegangen: theory.stanford.edu/~amitp/GameProgramming policyalmanac.org/games/aStarTutorial.htm vision.ee.ethz.ch/~cvcourse/astar/AStar.html en.wikipedia.org/wiki/A-star_search_algorithm wiki.gamedev.net/index.php/A%2A generation5.org/content/2002/ase.asp
0 Stimmen
Hast du das auch versucht? code.google.com/p/a-star/source/browse/trunk/java/AStar.java und code.google.com/p/a-star/source/browse/trunk/java/… ?
0 Stimmen
Ja, ich habe versucht, eine zu finden, die Amits nahe kommt, um sie besser zu verstehen, weil ich diesen Algorithmus verwirrend finde.
1 Stimmen
Vielleicht erhältst du von Google bei dieser Suche andere Ergebnisse als ich, weil ich drei Java-Implementierungen sehe - volle Implementierungen, das heißt - und allein auf der ersten Seite ein paar Tutorials mit Quellcode. Der zweite Treffer in meiner Suche ist der, den Kevin Hikaru Evans mit dir verlinkt hat.