Entwickler-Ecke
Algorithmen, Optimierung und Assembler - Direkt von A nach B
Flolo - Mo 18.07.05 21:37
Titel: Direkt von A nach B
Hat jemand ne Idee, wie ich meiner Spielefigur "erkläre" das sie den kürtzesten Weg von A nach B nehmen soll und nicht erst X dann Y?
Moderiert von
Gausi: Topic aus Tutorials verschoben am Mo 18.07.2005 um 21:38
Tobias1 - Mo 18.07.05 21:38
Welche Spielfigur denn?
Wieso in Sparte Tutorials?
Flolo - Mo 18.07.05 21:48
Die spielefigur von meinem Spiel 8) . Also ein 2D Spiel, in DelphiX, Eine Figur die man mit der Maus von A nach B klickt die jedoch immer Umwege nimmt!
Mir viel gerade keine andere sparte ein als Tutorials ein, kann von mir aus auch verschoben weden!
Tobias1 - Mo 18.07.05 22:00
Flolo hat folgendes geschrieben: |
| Die spielefigur von meinem Spiel 8) . Also ein 2D Spiel, in DelphiX, Eine Figur die man mit der Maus von A nach B klickt die jedoch immer Umwege nimmt! |
Zu diesem Thema, oder?
http://www.delphi-forum.de/viewtopic.php?t=39326&highlight=
Flolo hat folgendes geschrieben: |
| Mir viel gerade keine andere sparte ein als Tutorials ein, kann von mir aus auch verschoben weden! |
In Tutorials kommt eigentlich rein, wenn du anderen was erklärst,also keine Topics für Fragen.
Flolo - Mo 18.07.05 22:09
Ist doch egal was für eine Spieleart. Ich hab ein Objekt bei A (x,y) und hätte gern den schnellsten Weg nach B!!!
maxk - Mo 18.07.05 22:11
Der schnellste Weg ist der Abstand zwischen beiden Punkten! Aber das ganze ist natürlich anders, wenn sich z.B. zwischen beiden eine "Wand" befindet und das ist vom Spiel abhänig.
Gruß,
maxk
JRegier - Mo 18.07.05 22:39
maxk hat folgendes geschrieben: |
Der schnellste Weg ist der Abstand zwischen beiden Punkten! Aber das ganze ist natürlich anders, wenn sich z.B. zwischen beiden eine "Wand" befindet und das ist vom Spiel abhänig.
Gruß,
maxk |
Na ja er will vieleicht einfach diagonal gehen!
Machst du so:
Delphi-Quelltext
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:
| var AX, BX, AY, BY, StreckeX, StreckeY, SteigungX, SteigungY : Integer; AX := SpielFigur.Left; AY := SpielFigur.Top; BX := SpielFigurMusZuX; BY := SpielFigurMusZuY; if(AX > BX)then StreckeX := AX - BX else StreckeX := BX - AX; if(AY > BY)then StreckeY := AY - BY else StreckeY := BY - AY; if(StreckeX < StreckeY)then begin SteigungY := StreckeY div StreckeX; SteigungX := 1; end else begin SteigungX := StreckeX div StreckeY; SteigungY := 1; end;
if(AX > BX)then SteigungX := SteigungX * -1;
if(AY > BY)then SteigungY := SteigungY * -1; while (AX < BX) and (AY < BY) do begin AX := AX + SteigungX; AY := AY + SteigungY; SpielFigur.Left := AX; SpielFigur.Top := AY; end; |
DaRkFiRe - Mo 18.07.05 22:39
maxk hat folgendes geschrieben: |
Der schnellste Weg ist der Abstand zwischen beiden Punkten! Aber das ganze ist natürlich anders, wenn sich z.B. zwischen beiden eine "Wand" befindet und das ist vom Spiel abhänig.
Gruß,
maxk |
Eben - der KÜRZESTE Weg zwischen zwei Punkten ist die Strecke auf einer Geraden, die durch A und B läuft. Der schnellste Weg muss es deswegen noch lange nicht sein (denke man hierbei an Landkarten und Luftlinien). Das nur als Anmerkung!
Spaceguide - Mo 18.07.05 22:50
Wenn dein Spielfeld eine Matrix ist, kannst du den A*-Algorithmus verwenden.
Flolo - Mi 20.07.05 10:59
Danke für die Antworten, das langt mir bereits!
JRegier - Mi 20.07.05 14:45
Flolo hat folgendes geschrieben: |
| Danke für die Antworten, das langt mir bereits! |
Hast du mein Code getestet? Also ich nicht! Habe nur so Ansatzweise überlegt wie es gehen könnte!
Flolo - So 24.07.05 20:47
Aso irgentwie funktioniert das Beispiel nicht (kann auch an mir liegen) die Figur will sich nicht Bewegen.
BenBE - So 24.07.05 23:08
Wenn Du mir eine neue SuperVision-SourceView 6002 Enterprise-Kugel schenkst, kann ich Dir vielleicht auch ohne Source helfen ...
hans mans - So 24.07.05 23:30
Also wenn ich das richtig sehe geht deine Figur einfach immer an einer Wand entlang. Das Programm überprüft, ob das Feld in Laufrichtung links auf dem Feld eine Wand ist. Die Figur geht daran entlang und sucht sich, währen sie läut ihren Weg.
Meiner Ansicht nach wird sie so nur durch Zufall das Ziel auf dem kürzesten Weg erreichen. Ich denke, es währe effektiver, wenn auch rechenaufwändiger, wenn du das Programm jeden möglichen Weg probieren lässest, so, dass es den kürzesten weg finden muss.
Dazu könntest du die Figur von jedem Feld aus in jede Richtung gehen lassen, wo Boden ist. Wenn ein Weg gefunden ist, wird die länge in Feldern gespeichert und die nächste Möglichkeit ausprobiert, bis die Figur am Ziel ist, oder die Länge des vorherigen Wegs erreicht wird. Wenn der Weg kürzer ist, wird die Länge des neuen Weges gespeichert. Dadurch sparst du dann ein bischen Zeit.
Aber wie BenBE es schon sagt, mit Source wäre hlfen leichter, so stütze ich mich nur auf Vermutungen.
Ich hoffe, das hilft dir trotzdem.
PS: vom schon gegangenen Weg könntest du sämtliches vorwärts gehen und drehen in einem Array Speichern.
blocade - Mo 25.07.05 02:21
sind bei deinem spiel die spielfelder quadratisch?
und ist der diagonale weg dann um wurzel(2) kürzer?
angenommen dies ist nicht der fall, kansnt du dann nicht einfach einmal testen wie schneller er ist, wenn er links dran vorbei geht und wie schnell er ist, wenn er rechts dran vorbei geht?
und so probierst du dann einfach die beiden möglichkeiten aus.
wenn es nun >1 hinderniss ist, musst du einfach alle möglichkeiten ausprobieren, also:
links, links; links, rechts; rechts, links; rechts, rechts.
d.h es gibt dann, wenn n die anzahl der hindernisse ist, 2^n möglichkeiten die du durchprobieren musst ...
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!