Einzelnen Beitrag anzeigen

Dearmon

Registriert seit: 23. Nov 2008
16 Beiträge
 
#11

Re: Pathfinding (A*) Hexagon (Sechseck)

  Alt 22. Apr 2010, 00:27
Soo als es tut mir echt leid aber ich bin anscheinend intellektuell nicht fähig genug das Listensystem hin zu bekommen.
Ich hab jetzt versucht den A* Algorithmus dem aus dem tut von "Michael Puff" (Siehe Post 2) nach zu empfinden, da er meines Erachtens nach relativ Ressourcen freundlich ist, weil er nicht die ganze Map berechnet, sondern Feld für Feld von Start zu Stop.
Im Moment hab ich meine Felder so eingerichtet, dass jedes seine 6 Nachbarn kennt. Hinzu kommen Informationen wie Typ (Wand, Wald, …), Kosten (Gras = 1, Wald = 2, …), Position (X und Y), Vorgänger, Ausrichtung (in welche Richtung der Spieler guckt wenn er das Feld betreten sollte) und die F,G,H Kosten.

Delphi-Quellcode:
TFeld = Class(TObject)
Private
FNachbar: Array[0..5] of TFeld;
FPos: TPoint;
FTyp: Integer;
FARichtung: Integer;
FKosten: Integer;
FOwner: TFeld;
FF, FH, FG: Integer;
…..
So, den Anfang der Berechnung bekomm ich evtl. noch hin, die Nummerierung der Ausrichtung und die der Position der Nachbarn ist dieselbe: Oben 0 und dann im Uhrzeiger sinn an jede Kante die nächste Zahl sodass oben links neben der 0 die 5 ist. Zu Anfang rechne ich jetzt quasi das:

Delphi-Quellcode:
For i:= 0 to 5 do
  Begin
     If Not CurrFeld.Nachbar[i].Typ = -1 then // Feld ist begehbar
       With CurrFeld.Nachbar[i] do
         Begin
           Owner := CurrFeld; // Vorgänger übergeben
           Ori := I; // Ausrichtung des Spielers übergeben
           G := CurrFeld.G + GetTurns(CurrFeld.Ori, i) + Kosten; // Derzeitige G Kosten + Kosten für die Drehung
                                                                  // +Begehkostendes Feldes
 
           H := GetH(Pos, Target.Pos); // Voraussichtliche Kosten
           F := H + G;
         End;
  End;
Wie immer leider nur Theorie, weiß diesmal nicht mal obs wirklich Sinn macht so, aber ich hab vor allem jetzt überhaupt garkeinen Plan wie ich das mit den Listen anfangen soll, also das System im Allgemeinen ist klar: eine offene Liste wo die einzelnen Sechsecke berechnet werden und eine geschlossene, wo der endgültige Weg eingetragen wird. Nur bekomm ich das nun mal nicht hin, also ich rede nicht von Effizienz oder Schnelligkeit, sondern lediglich von der Umsetzung in irgendeinem Weg.

Wenn mir vllt jemand eine Listenstruktur darstellen oder anders helfen könnte, wäre ich sehr dankbar. Aus dem "puren" source code der Stardemo werde ich leider nicht schlau :/

Danke
  Mit Zitat antworten Zitat