RauchenderDachs
Cadet 4th Year
- Registriert
- Dez. 2012
- Beiträge
- 70
Hi Leute,
ich versuche gerade eine Tower defense Clone zu programmieren. Damit die Creeps den Weg durch die Türme zum Ziel finden würde ich gerne den A*-Algorithmus benutzen. Ich hab mir jetzt ein paar Videos und Seiten dazu durchgelesen und ich glaube ich bin durchgestiegen. Nur an der Implementierung scheiterts gerade. (Code siehe unten)
Problem:
Der Algorithmus schreibt den besten Wegpunkt einfach nicht um.
Meine Vermutung:
Ich denke das Problem entsteht bei der Sortierung der Openlist (Zeile 112). Da ich hier aber kein PRoblem gefunden habe denk ich das , dass Problem in der Schätzung liegen muss hab dort aber auch nichts gefunden.
Ich bitte darum das ihr euch den Code mal anschaut. (Falls ich was vergessen hab kann ich den natürlich nachreichen). Bitte korrigiert meine Quelltext nicht sondern weist mich nur auf den Fehler hin.
Grüße RauchenderDachs
Log:
27.11 In Zeile 69 und 80 wurde statt <= ein < eingesetzt ; In Zeile 119 wurde statt >= ein > eingesetzt; aktualisiereListe() wurde ein Parameter (listcnt) hinzugefügt.
ich versuche gerade eine Tower defense Clone zu programmieren. Damit die Creeps den Weg durch die Türme zum Ziel finden würde ich gerne den A*-Algorithmus benutzen. Ich hab mir jetzt ein paar Videos und Seiten dazu durchgelesen und ich glaube ich bin durchgestiegen. Nur an der Implementierung scheiterts gerade. (Code siehe unten)
Problem:
Der Algorithmus schreibt den besten Wegpunkt einfach nicht um.
Meine Vermutung:
Ich denke das Problem entsteht bei der Sortierung der Openlist (Zeile 112). Da ich hier aber kein PRoblem gefunden habe denk ich das , dass Problem in der Schätzung liegen muss hab dort aber auch nichts gefunden.
Ich bitte darum das ihr euch den Code mal anschaut. (Falls ich was vergessen hab kann ich den natürlich nachreichen). Bitte korrigiert meine Quelltext nicht sondern weist mich nur auf den Fehler hin.
Grüße RauchenderDachs
Code:
//Schätzung für den A*
public int doSchaetzung(int x, int y){
int dx = x - map[zielx][ziely].getX()/10;///10 da ich in Teils rechne
if (dx < 0) {
dx = -dx;
}
int dy = y - map[zielx][ziely].getY()/10;
if (dy < 0) {
dy = -dy;
}
return (int)(Math.sqrt(Math.pow(dx,2) + Math.pow(dy,2)));
}
public void aStern(){
//Anfangspunkt zur openlist hinzufügen
openlist[0] = map[anfangx][anfangy];
//listcnt damit ich weis wieviele Objekte ich in der Openlist habe
int listcnt = 1;
// bester Wegpunkt ist immer der Wegpunkt der an erster Stelle in der openlist ist
for(int i = 0; i<map.length*map[0].length;i++){
aktualisiereOpenList(listcnt);
bestWegpunkt = openlist[0];
//System.out.println(openlist[0].getX()+" "+openlist[0].getY());
closedlist[i] = bestWegpunkt;
if(bestWegpunkt.getStatus() == 2){
// vom Ziel aus wird zurück gelaufen bis zum Anfang
for(int n = 0; n<map.length*map[0].length;n++){
if((bestWegpunkt.getX()!=anfangx) && (bestWegpunkt.getY()!=anfangy)){
pfad [n] = bestWegpunkt.getVorgaenger();
bestWegpunkt = bestWegpunkt.getVorgaenger();
System.out.println("1");
}
else{
break;
}
}
break;
}
//Hier finde ich heraus welche Tile nummer der Beste Wegpunkt hat
int bestWPx = 0;
int bestWPy = 0;
for(int a = 0 ; a<map.length;a++){
for(int b = 0; b<map[0].length;b++){
if((bestWegpunkt.getX() == map[a][b].getX())&&(bestWegpunkt.getY() == map[a][b].getY())){
bestWPx = a;
bestWPy = b;
break;
}
}
}
//System.out.println(bestWPx+" "+ bestWPy);
//Überprüfung ob Boden oder Tower oder schon in closed oder open list und ggf zur openlist hinzufügen
if(bestWPx - 1 >= 0){//links
if((!istteilvonListe(map[bestWPx-1][bestWPy]))){
if(map[bestWPx-1][bestWPy].getStatus() == 0){
openlist[listcnt] = map[bestWPx-1][bestWPy];
//Vorgänger wird gesetzt also von welchem Wegpunkt ich auf den anderen trauf trete
openlist[listcnt].setVorgaenger(bestWegpunkt);
openlist[listcnt].setSchaetzung(doSchaetzung(bestWPx-1,bestWPy));
listcnt++;
//System.out.println("1");
}
}
}
if(bestWPy + 1 < map[0].length){//unten
if(!istteilvonListe(map[bestWPx][bestWPy+1])){
if(map[bestWPx][bestWPy+1].getStatus() == 0){
openlist[listcnt] = map[bestWPx][bestWPy+1];
openlist[listcnt].setVorgaenger(bestWegpunkt);
openlist[listcnt].setSchaetzung(doSchaetzung(bestWPx,bestWPy+1));
System.out.println("2");
listcnt++;
}
}
}
if(bestWPx + 1 < map.length){//rechts
if(!istteilvonListe(map[bestWPx+1][bestWPy])){
if(map[bestWPx+1][bestWPy].getStatus() == 0){
openlist[listcnt] = map[bestWPx+1][bestWPy];
openlist[listcnt].setVorgaenger(bestWegpunkt);
openlist[listcnt].setSchaetzung(doSchaetzung(bestWPx+1,bestWPy));
System.out.println("3");
listcnt++;
}
}
}
if(bestWPy-1 >= 0){//drüber
if(!istteilvonListe(map[bestWPx][bestWPy-1])){
if(map[bestWPx][bestWPy+1].getStatus() == 0){
openlist[listcnt] = map[bestWegpunkt.getX()][bestWPy-1];
openlist[listcnt].setVorgaenger(bestWegpunkt);
openlist[listcnt].setSchaetzung(doSchaetzung(bestWPx,bestWPy+1));
//System.out.println("4");
listcnt++;
}
}
}
System.out.println("x:"+bestWegpunkt.getX()+" y:"+bestWegpunkt.getY()+" TileNrx:"+bestWPx+" TileNry:"+bestWPy);
System.out.println("Schaetzung:"+openlist[0].getSchaetzung());
System.out.println("Bubblesort ausgabe"+ " x:"+openlist[0].getX()+ " y:"+openlist[0].getY() + " Gesamtkosten:"+openlist[0].getGesamtkosten() );
}
if(listcnt >= map.length*map[0].length-1000){
listcnt = 0;
}
}
public void aktualisiereOpenList(int anzahlelemente){
//Einfacher Bubblesort der den günstigen nächsten Knoten ausscuht
Tile temp;
for(int i=1; i<anzahlelemente; i++) {
for(int j=0; j<anzahlelemente-i; j++) {
if((openlist[j] != null) && (openlist[j+1] != null)){
if(openlist[j].getGesamtkosten()> openlist[j+1].getGesamtkosten()) {
temp=openlist[j];
openlist[j]=openlist[j+1];
openlist[j+1]=temp;
}
}
}
}
}
Log:
27.11 In Zeile 69 und 80 wurde statt <= ein < eingesetzt ; In Zeile 119 wurde statt >= ein > eingesetzt; aktualisiereListe() wurde ein Parameter (listcnt) hinzugefügt.
Zuletzt bearbeitet: