Federhalter
Mitglied
Hallo,
ich hoffe ich kann mein Problem möglichst exakt schildern. Bitte fragt nach wenn ihr es nicht verstehen solltet.
Also, ich habe einen A* Algorithmus geschrieben und stelle diesen graphisch in einem Fenster dar.
Als Spielfeld habe ich ein aus 32x32 großen Rechtecken bestehendes Gitter generiert und lasse mir auf diesem mit dem Startpunkt 0,0 hin zu einem beliebigen mit der Maus geklickten Ziel den kürzesten Pfad ausgeben.
Nun ist das etwas langweilig und ich habe aus dem Spielfeld ein Labyrinth gemacht.
Hierbei habe ich dann abhängig von einer txt-Datei bestimmt, wo die nicht- bzw. begehbaren Felder liegen sollen. Das habe ich überprüft und es stimmt.
Das Problem ist nun, dass ich zwar punktuell den richtigen Wert, also begehbar oder nicht-begehbar, bekomme, aber NICHT bei der Überprüfung der Nachbarknoten im A*. Anstatt mir begehbare Felder anzuzeigen, werden mir nur die NICHT-begehbaren Felder(also blocked = true) angezeigt.
Hier mal die Levelklasse mit dem A*:
Wo liegt mein Fehler?
Ich möchte einfach nur, dass er mir den kürzesten Weg durch das Labyrinth anzeigt.
Wäre für schnelle Hilfe dankbar
MfG
ich hoffe ich kann mein Problem möglichst exakt schildern. Bitte fragt nach wenn ihr es nicht verstehen solltet.
Also, ich habe einen A* Algorithmus geschrieben und stelle diesen graphisch in einem Fenster dar.
Als Spielfeld habe ich ein aus 32x32 großen Rechtecken bestehendes Gitter generiert und lasse mir auf diesem mit dem Startpunkt 0,0 hin zu einem beliebigen mit der Maus geklickten Ziel den kürzesten Pfad ausgeben.
Nun ist das etwas langweilig und ich habe aus dem Spielfeld ein Labyrinth gemacht.
Hierbei habe ich dann abhängig von einer txt-Datei bestimmt, wo die nicht- bzw. begehbaren Felder liegen sollen. Das habe ich überprüft und es stimmt.
Das Problem ist nun, dass ich zwar punktuell den richtigen Wert, also begehbar oder nicht-begehbar, bekomme, aber NICHT bei der Überprüfung der Nachbarknoten im A*. Anstatt mir begehbare Felder anzuzeigen, werden mir nur die NICHT-begehbaren Felder(also blocked = true) angezeigt.
Hier mal die Levelklasse mit dem A*:
Java:
public class Level {
private int xo;
private int yo;
private int width;
private int height;
private Tile[][] spielfeld;
private int[][] mapData;
private static Comparator<Node> nodeSorter = new Comparator<Node>(){
public int compare(Node n0, Node n1) {
if(n1.f < n0.f) return +1;
if(n1.f > n0.f) return -1;
return 0;
}
};
public Level(int width,int height) {
this.width = width;
this.height = height;
spielfeld = new Tile[width][height];
mapData = MapLoader.loadMap("map",width,height);
for(int i = 0;i<width;i++){
for(int j = 0;j<height;j++){
int tileID = mapData[i][j];
tileID--;
spielfeld[i][j] = new Tile(i*32,j*32,tileID);
}
}
}
public ArrayList<Node> findPath(int startx,int starty,int goalx,int goaly){
TreeSet<Node> openList = new TreeSet<Node>(nodeSorter);
HashSet<Node> closedList = new HashSet<Node>();
Node start = new Node(startx,starty,false);
openList.add(start);
while(!openList.isEmpty()){
Node current = openList.first();
openList.remove(current);
closedList.add(current);
if(current.getX() == goalx && current.getY() == goaly){
ArrayList<Node> path = new ArrayList<Node>();
while(current.parent != null){
path.add(current);
current = current.parent;
}
openList.clear();
closedList.clear();
return path;
}
Node[] neighbours = getNeighbours(current);
for(Node successor : neighbours){
double g = current.g + getDistance(current.x,current.y,successor.x,successor.y);
double h = getDistance(successor.x,successor.y,goalx,goaly);
double f = g + h;
if(closedList.contains(successor))continue;
successor.setParent(current);
successor.setF(f);
for(int i = 0;i<width;i++){
for(int j = 0;j<height;j++){
int tileID = mapData[i][j];
if(tileID == 58){
successor.setBlocked(true);
}
}
}
if(successor.isBlocked())openList.add(successor);
System.out.println(successor.isBlocked());
}
}
closedList.clear();
return null;
}
private double getDistance(int currentx, int currenty,int successorx,int successory) {
double dx = currentx - successorx;
double dy = currenty - successory;
return Math.sqrt((dx*dx) + (dy*dy));
}
public Node[] getNeighbours(Node current){
Node[] neighbours = new Node[8];
neighbours[0] = new Node(current.getX()+32,current.getY(),current.isBlocked());
neighbours[1] = new Node(current.getX()+32,current.getY()+32,current.isBlocked());
neighbours[2] = new Node(current.getX(),current.getY()+32,current.isBlocked());
neighbours[3] = new Node(current.getX()-32,current.getY()+32,current.isBlocked());
neighbours[4] = new Node(current.getX()-32,current.getY(),current.isBlocked());
neighbours[5] = new Node(current.getX()-32,current.getY()-32,current.isBlocked());
neighbours[6] = new Node(current.getX(),current.getY()-32,current.isBlocked());
neighbours[7] = new Node(current.getX()+32,current.getY()-32,current.isBlocked());
return neighbours;
}
public void render(Graphics g){
for(int i = 0;i<width;i++){
for(int j = 0;j<height;j++){
spielfeld[i][j].render(g,xo,yo);
}
}
int startx = 0;
int starty = 0;
int goalx = Mouse.mousex-(Mouse.mousex%32);
int goaly = Mouse.mousey-(Mouse.mousey%32)-32;
ArrayList<Node> path = findPath(startx,starty,goalx,goaly);
if(Mouse.right){
if(path!=null){
for(Node node : path){
g.setColor(Color.BLUE);
g.fillRect(node.getX(), node.getY(),32,32);
}
}
}
}
}
Wo liegt mein Fehler?
Ich möchte einfach nur, dass er mir den kürzesten Weg durch das Labyrinth anzeigt.
Wäre für schnelle Hilfe dankbar
MfG