Registrierung Kalender Mitgliederliste Teammitglieder Suche Häufig gestellte Fragen Zur Startseite

Informatiker Board » Themengebiete » Praktische Informatik » Algorithmen » A-Stern Anwendungsbeispiel » Hallo Gast [Anmelden|Registrieren]
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | An Freund senden | Thema zu Favoriten hinzufügen
Neues Thema erstellen Antwort erstellen
Zum Ende der Seite springen A-Stern Anwendungsbeispiel
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
Tommy1234
Foren As


Dabei seit: 12.07.2015
Beiträge: 93

A-Stern Anwendungsbeispiel Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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.
16.10.2016 16:17 Tommy1234 ist offline Beiträge von Tommy1234 suchen Nehmen Sie Tommy1234 in Ihre Freundesliste auf
Karlito Karlito ist männlich
Kaiser


Dabei seit: 11.04.2011
Beiträge: 1.461

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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
16.10.2016 21:57 Karlito ist offline E-Mail an Karlito senden Beiträge von Karlito suchen Nehmen Sie Karlito in Ihre Freundesliste auf
Tommy1234
Foren As


Dabei seit: 12.07.2015
Beiträge: 93

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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.
17.10.2016 07:36 Tommy1234 ist offline Beiträge von Tommy1234 suchen Nehmen Sie Tommy1234 in Ihre Freundesliste auf
Karlito Karlito ist männlich
Kaiser


Dabei seit: 11.04.2011
Beiträge: 1.461

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

OK, Poste mal bitte das gesamte Programm.

Gruß,

Karlito
18.10.2016 10:00 Karlito ist offline E-Mail an Karlito senden Beiträge von Karlito suchen Nehmen Sie Karlito in Ihre Freundesliste auf
Tommy1234
Foren As


Dabei seit: 12.07.2015
Beiträge: 93

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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

Java-Code als Dateianhang.

Dateianhang:
txt Test.txt (15,12 KB, 348 mal heruntergeladen)
09.11.2016 22:26 Tommy1234 ist offline Beiträge von Tommy1234 suchen Nehmen Sie Tommy1234 in Ihre Freundesliste auf
Tommy1234
Foren As


Dabei seit: 12.07.2015
Beiträge: 93

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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
18.12.2016 17:41 Tommy1234 ist offline Beiträge von Tommy1234 suchen Nehmen Sie Tommy1234 in Ihre Freundesliste auf
Lerma
unregistriert
Just wanted to say Hi. Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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!
25.01.2017 18:53
Tinker
unregistriert
Im happy I now registered Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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.
06.02.2017 23:08
Baumstruktur | Brettstruktur
Gehe zu:
Neues Thema erstellen Antwort erstellen
Informatiker Board » Themengebiete » Praktische Informatik » Algorithmen » A-Stern Anwendungsbeispiel