A-Stern Anwendungsbeispiel

Neue Frage »

Auf diesen Beitrag antworten »
Tommy1234 A-Stern Anwendungsbeispiel

Hallo,

leider muss ich nochmal was zu A-Stern nachfragen.

Ich habe es geschafft, dass sich ein Spieler entlang des Pfades bewegen kann, was er auch korrekt tut.

Allerdings habe ich einen Haufen Code gebraucht und Hilfsvariablen.

Ich frage mich ob das nicht auch anders geht.

Die Funktion des A-Stern liegt ja als Liste vor und normalerweise muss man ja einfach nur die einzelnen Knoten der x bzw. y Position des Spielers zuweisen und anschließend den Spieler an das Ziel bewegen, aber ich bekomme das leider nicht einfacher hin als so:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
public void move(){
		
		pumpTimer();
		
		if(Mouse.right){
			zielx = (((Mouse.hitmousex/32)%32)*32);
			ziely = (((Mouse.hitmousey/32)%32)*32);
		}
		else{
			zielx = (((playerx/32)%32)*32);
			ziely = (((playery/32)%32)*32);
		}
		
		List<Field> path = AStar.AStaralgorithm        (startx,starty,zielx,ziely,grid,width,height);
			
		if(path!=null){
			
			for(int i = 0; i<path.size();i++){
					
				fx[i] = path.get(i).x;
				fy[i] = path.get(i).y;
				
			}
			if(playerx!=zielx||playery!=ziely){
				
				if(fx[k] > playerx && fy[k] == playery){
					angle = 0;
					playerx+=speed;
					stand=false;
					figureFrame = getFrame(figureFrame,10,14,3);
					if(playerx == fx[k] && playery == fy[k]){
						k++;
					}
					if(playerx == zielx && playery == ziely){
						k=1;
						fx[k] = 0;
						fy[k] = 0;
						stand= true;
					}
				}
				else if(fx[k] < playerx && fy[k] == playery){
					angle = 180;
					playerx-=speed;
					stand = false;
					figureFrame = getFrame(figureFrame,15,19,3);
					if(playerx == fx[k] && playery == fy[k]){
						k++;
					}
					if(playerx == zielx && playery == ziely){
						k=1;
						fx[k] = 0;
						fy[k] = 0;
						stand = true;
					}
				}
				else if(fx[k] == playerx && fy[k] > playery){
					angle = 90;
					playery+=speed;
					stand = false;
					figureFrame = getFrame(figureFrame,5,9,3);
					if(playerx == fx[k] && playery == fy[k]){
						k++;
					}
					if(playerx == zielx && playery == ziely){
						k=1;
						fx[k] = 0;
						fy[k] = 0;
						stand = true;
					}
				}
				else if(fx[k] == playerx && fy[k] < playery){
					angle = 270;
					playery-=speed;
					stand = false;
					figureFrame = getFrame(figureFrame,1,4,3);
					if(playerx == fx[k] && playery == fy[k]){
						k++;
					}
					if(playerx == zielx && playery == ziely){
						k=1;
						fx[k] = 0;
						fy[k] = 0;
						stand = true;
					}
				}
				else if(fx[k] > playerx && fy[k] > playery){
					angle = 45;
					playerx+=speed;
					playery+=speed;
					stand = false;
					figureFrame = getFrame(figureFrame,30,34,3);
					if(playerx == fx[k] && playery == fy[k]){
						k++;
					}
					if(playerx == zielx && playery == ziely){
						k=1;
						fx[k] = 0;
						fy[k] = 0;
						stand = true;
					}
				}
				else if(fx[k] < playerx && fy[k] < playery){
					angle = 225;
					playerx-=speed;
					playery-=speed;
					stand = false;
					figureFrame = getFrame(figureFrame,25,29,3);
					if(playerx == fx[k] && playery == fy[k]){
						k++;
					}
					if(playerx == zielx && playery == ziely){
						k=1;
						fx[k] = 0;
						fy[k] = 0;
						stand = true;
					}
				}
				else if(fx[k] > playerx && fy[k] < playery){
					angle = 315;
					playerx+=speed;
					playery-=speed;
					stand = false;
					figureFrame = getFrame(figureFrame,20,24,3);
					if(playerx == fx[k] && playery == fy[k]){
						k++;
					}
					if(playerx == zielx && playery == ziely){
						k=1;
						fx[k] = 0;
						fy[k] = 0;
						stand = true;
					}
				}
				else if(fx[k] < playerx && fy[k] > playery){
					angle = 135;
					playerx-=speed;
					playery+=speed;
					stand = false;
					figureFrame = getFrame(figureFrame,35,39,3);
					if(playerx == fx[k] && playery == fy[k]){
						k++;
					}
					if(playerx == zielx && playery == ziely){
						k=1;
						fx[k] = 0;
						fy[k] = 0;
						stand = true;
					}
				}
			}
			else{
				startx = zielx;
				starty = ziely;
			}
		}
	}



Ich bräuchte hier Hilfe, wie man den Spieler entlang des gefundenen Weges bewegt mit der Liste.(Diese Möglichkeit des Codes funktioniert zwar, aber wie gesagt sie ist sehr umständlich)


Außerdem habe ich noch eine Frage:

Kann man den A-Stern auch als rekursive Funktion implementieren, die sich solange selber aufruft, bis der Pfad gefunden wurde?

Bei Bedarf poste ich das ganze kompilierbare Programm.
 
Auf diesen Beitrag antworten »
Karlito

Ich verstehe nicht ganz, was Du da tust. Um A* anwenden zu können, muss ja die Map als Graph abstrahiert werden. A* liefert dir als Ergebnis eine Menge von Transitionen oder Kanten im Graph, welche den gesuchten Pfad repräsentieren. Jede Kante im Graph repräsentiert einen Schritt, den Du auf der Map durchführen kannst. Du musst also einfach nur diese Schritte, die Du mit A* ermittelt hast nacheinander ausführen und gut ist.

Klar soweit? Kannst Du formulieren an welcher Stelle dein Fehler liegen könnte?

Gruß,

Karlito
Auf diesen Beitrag antworten »
Tommy1234

Ich mache folgendes:

Zunächst schaue ich mir jeden Nachbarknoten an, also wo der vom Spieler aus liegt, und je nachdem wo dieser liegt bewege ich den Spieler hin und das mache ich für jeden Knoten aus der Liste.

Was ein Graph ist weiß ich, aber wie ein Graph in Verbindung mit der Map steht nicht. Meinst du, dass die jeweiligen Knoten x- bzw. y-Positionen aus der Liste die Punkte eines Graphen sind?

Ich verstehe das nicht.

Was erschwerend hinzukommt ist, dass Google mir einen Haufen Theorie ausspuckt zum AStern aber nix dazu wie man ihn konkret anwendet.
Auf diesen Beitrag antworten »
Karlito

OK, Poste mal bitte das gesamte Programm.

Gruß,

Karlito
 
Auf diesen Beitrag antworten »
Tommy1234

Hallo hier mal das ganze Programm. Die A-Stern ist von einem anderen Forenmitglied implementiert worden.

Java-Code als Dateianhang.
Auf diesen Beitrag antworten »
Tommy1234

Hallo,

vergesst den Code der letzten Antwort.

Ich habe jetzt einen eigenen A* - Algorithmus geschrieben, aus den Anregungen voriger Posts.
Dieser ist überraschenderweise sehr schnell, fast schon zu schnell um richtig zu sein, denke ich.

Kurz zum Aufbau:

Ich habe ein aus Kacheln (32x32) bestehendes Spielfeld (Labyrinth) erzeugt auf Basis einer .txt Datei erzeugt. Die Kacheln sind kleine Bilder und das Spielfeld wird auch richtig angezeigt. Soweit so gut... .

Jetzt möchte ich wie in dem ersten Forumeintrag begehbare und unbegehbare Kacheln in meinen A* einbauen.

Dazu habe ich wie ebenfalls ein zweidimensionales boolean-Array erzeugt, und dort mithilfe des Kachelindex Blockaden eingebaut ( Blockade ist ein true Eintrag), das funktioniert auch. Allerdings, wenn ich die Blockade im A* einbauen möchte steht beim Klicken mit der Maus der Flag immer auf true und wird nie false und das ist genau mein Problem, denn immer wenn der Nachfolgeknoten false ist sollte er in die openList verschoben werden und damit ein Pfad Knoten werden.

Aber das funktioniert nicht.

Wie muss ich denn das boolean Array mit meinem A* verknüpfen, dass die Blockaden erkannt werden????


Wäre für Hilfe dankbar

Gruß Tommy
Auf diesen Beitrag antworten »
Lerma Just wanted to say Hi.

Greetings from California! I'm bored to death at
work so I decided to browse your site on my
iphone during lunch break. I love the knowledge you present here and can't wait to take a look when I get home.
I'm surprised at how quick your blog loaded on my mobile
.. I'm not even using WIFI, just 3G .. Anyways, awesome blog!
Auf diesen Beitrag antworten »
Tinker Im happy I now registered

Heya i am for the first time here. I found this board
and I to find It really helpful & it helped me out
much. I'm hoping to provide something back and aid others such as
you helped me.
 
Neue Frage »
Antworten »


Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »