Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi wegsuche in delphi? (https://www.delphipraxis.net/22500-wegsuche-delphi.html)

sweetmusic 18. Mai 2004 11:59


wegsuche in delphi?
 
Hallo,

ich habe vor einiger Zeit begonnen ein Spiel zu programmieren und möchte es nun erweitern.
Dazu bräuchte ich aber eine Wegsuche, so wie man sie zB mit Prolog programmieren kann.
Habt ihr einen Tipp für mich, wie ich das in Delphi umsetzen kann?

Vielen Dank!

fiasko 18. Mai 2004 12:03

Re: wegsuche in delphi?
 
Was ist denn

Zitat:

Zitat von sweetmusic
so wie man sie zB mit Prolog programmieren kann.

? (Ja ich kenne Prolog) Zur not schreibst du einfach einen Prolog Intepreter in Delphi :mrgreen:

Luckie 18. Mai 2004 12:54

Re: wegsuche in delphi?
 
Warum sollte da snichta uch mit Delphi gehen?

Da aber viele Spiele in C/C++ geschrieben sind, würde ich mich bei der Suche mit Google (Bei Google suchendelphi wegsuche) nach Codeschnippslen nicht unbedingt auf Delphi beschränken.

sweetmusic 19. Mai 2004 09:13

Re: wegsuche in delphi?
 
mh, das heißt also, dass ihr mir auch keinen direkten Vorschlag machen könnt...

Habt ihr schon mal etwas von A*-Pathfinding gehört?
Scheint eine ziemlich verbreitete Methode zu sein...

fiasko 19. Mai 2004 13:09

Re: wegsuche in delphi?
 
Hätten wir schon, aber du sagst ja nicht wie du das in Prolog gemacht hast :-)

Das A*-Pathfinding ermittelt dir aus einer Menge von Knoten und Kantenbewertungen die kürzeste Strecke zu jedem Knoten von einem Startknoten aus. Ob du das verwenden kannst hängt davon ab wie dein Spielfeld aussieht (ich meine im Rechner).

Nicodius 19. Mai 2004 13:58

Re: wegsuche in delphi?
 
do machst ne procedure (die nen Timer zu hilfe nimmt .... --> dann berrechnest du den kürzesten weg ... das umzusetzen ist ja nict so schwer oder? :roll:

Tryer 19. Mai 2004 18:19

Re: wegsuche in delphi?
 
Hier findst Du ein recht gutes Tutorial zum A*-Algorithmus, auf dessen Basis hab ich selber auch erfolgreich eine Wegsuche realisiert. Falls Du danach festgestellt hast das der Algorithmus für Dich brauchbar ist hilft Dir das folgende vielleicht etwas weiter.

Der A* Algorithmus an sich ist eine Kombintion verschiedener anderer Algorithmen, er hat den Vorteil recht schnell zu sein und findet den Weg zum Ziel auf jeden Fall (so es denn einen gibt). Wenn er einen Weg findet dann ist das auf jeden Fall auch der günstigste Weg (entsprechend der Definition der Wegkosten).

Durch die Reihenfolge in der man neue potentielle Wegpunkte während der Suche aufnimmt lässt sich in gewissem Rahmen die Form des Weges (mgl. eckig (handlich für Browsergames), mgl. diagonal, ..) beeinflussen.
Die Übernahme neuer potentieller Wegpunkte ist der Knackpunkt des Algorithmus. Hier lassen sich auch leicht Erweiterungen wie z.B. Wurmlöcher oder Strassen (k.A. was Du für ein Spiel proggst)mit einpflegen die dann in die Berechnung des optimalen Weges mit einfliessen.

Du solltest in jedem Fall dem Hinweis im Tutorial folgen und einen binären Suchbaum (BinHeap) für die offenen Wegpunkte verwenden, das bringt einiges an Performance.
Wenn zu einem Zeitpunkt immer nur ein Weg gesucht werden soll dann bietet es sich an innerhalb der Map auch sofort die Daten für die Wegsuche mit abzulegen, das kostet zwar Speicherplatz aber es beschleunigt die Suche nochmal enorm da nicht immer wieder Referenzen zwischen Kartendaten und Wegdaten hergestellt werden müssen.

Ich habs bei mir so realisiert:
Delphi-Quellcode:
  TCoords = packed record
    case LongInt of
     0: (Y, X: Word);
     1: (XY: DWord);    
  end;

  PPMapItem = ^PMapItem;
  PMapItem = ^TMapItem;
  TMapItem = record
    Parent: PMapItem;    // Feld von dem dieses Feld erreicht wurde (>Weg<)
    Coord: TCoords;      // Map-Koordinaten (entspricht Array-Index)
    GCost: Byte;         // Fixe Einflugkosten für dieses Feld (Terrainkosten)
    GWCost: LongWord;    // Flugkosten vom Start zu diesem Punkt
    HCost: LongWord;     // angenommene Flugkosten bis Ziel (Heuristic)
    Region: Byte;        // Durchflugberechtigung?
    BinHeapPos: LongWord; // Position im BinHeap (für schnelleres ReSort nach Änderung von GWCost)
    IsClosed: Boolean;   // Feld als Wegpunkt übernommen?
  end;

  TMapArray = array of array of TMapItem;
Durch das "IsClosed" spare ich mir zusätzlich auch die Liste der übernommenen Wegpunkte, das bringt nochmal einiges an Performance da ich bei neu übernommenen Wegpunkten nicht suchen muss ob diese bereits einmal erreicht wurden.

MfG,
Tryer

sweetmusic 19. Mai 2004 18:58

Re: wegsuche in delphi?
 
danke für die tipps!

Ich hab nun auch schon ein paar Seiten im Netz gefunden, die mir helfen könnten..
Jetzt muss ich nur noch meine Kenntnisse in der Listenprogrammierung auffrischen :wink:
ich hoffe, dass es jetzt alles klappt.

Liebe Grüße

DaFox 19. Mai 2004 20:20

Re: wegsuche in delphi?
 
Hi,

zum Thema A*: Der Entwickler, Ausgabe 03.2002 bzw. gleich Der Weg ist das Ziel - Pathfinding mit A*

Gruß,
Markus


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:07 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz