Informatiker Board (http://www.informatikerboard.de/board/index.php)
- Themengebiete (http://www.informatikerboard.de/board/board.php?boardid=1)
--- Praktische Informatik (http://www.informatikerboard.de/board/board.php?boardid=6)
---- Algorithmen (http://www.informatikerboard.de/board/board.php?boardid=17)
----- A-Stern Anwendungsbeispiel (http://www.informatikerboard.de/board/thread.php?threadid=3233)


Geschrieben von Tommy1234 am 16.10.2016 um 16:17:

  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.



Geschrieben von Karlito am 16.10.2016 um 21:57:

 

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



Geschrieben von Tommy1234 am 17.10.2016 um 07:36:

 

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.



Geschrieben von Karlito am 18.10.2016 um 10:00:

 

OK, Poste mal bitte das gesamte Programm.

Gruß,

Karlito



Geschrieben von Tommy1234 am 09.11.2016 um 22:26:

 

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

Java-Code als Dateianhang.



Geschrieben von Tommy1234 am 18.12.2016 um 17:41:

 

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



Geschrieben von Lerma am 25.01.2017 um 18:53:

  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!



Geschrieben von Tinker am 06.02.2017 um 23:08:

  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.


Forensoftware: Burning Board, entwickelt von WoltLab GmbH