Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

07.09.2011, 15:42

Probleme bei A* mit Waypoints

Hallo,

ich versuche schon seit längerem A* Algorthmus hinzukriegen doch jedes mal scheitere ich. Ich weiß nicht, ob es an logik bzw. mein vorgehensweise liegt.
Zu hilfe hab ich das hier http://www.policyalmanac.org/games/aStarTutorial_de.html

Also ich habe diese Variable genommen: OpenList ClosedList OpenListPos ClosedListPos OpenListWPNo ClosedListWPNo G H. Das sind alle arrays. Ich benutze keine 2D Arrays, da ich mit minIndex einfach den kleinsten F wert raussuchen kann. Bei 2D geht das schlecht :P.

Ich muss hinzufügen, ich programmiere das in einem 3D Spiel(aber ich benutze den coordinate Z noch nicht), wo man die resultaten sofort betrachten kann. (Z.b. die Wegpunkte setzen,sehen, färben usw.). Die Syntaxe sind wie bei der Basic (wurde mir so gesagt)

Also bis zu der stelle wo man mit ClosedList beginnt ist alles problemlos. Aber wnen ich jetzt z.b. den ersten WP aus der OpenList nehme und sie dann ins closed liste soll ich mit vorgängern und nachgängern irgendwas machen und dann die G's vergleichen. Aber ich weiß nicht wie das jetzt mit Vorngängern gemeint ist da ich ja Wegpunkte habe. Ich setze sie ja manuell irgendwo hin.

Nebenbei. Ich hab einfach ein if abfrage drinne das wenn der Wegpunkt nicht zu weit liegt, das sie dann sozusagen verbunden sind.

Ich hoffe ihr könnt mir helfen

mfg mazy
Nichts ist unmöglich.

TGGC

1x Rätselkönig

Beiträge: 1 799

Beruf: Software Entwickler

  • Private Nachricht senden

2

07.09.2011, 17:02

Wenn man nen Weg abgeht, dann gibt es Orte von denen man kommt ("Vorgaenger") und Punkte zu denen man spaeter geht ("Nachgaenger").

3

13.09.2011, 19:24

Kann so etwas auch eigentlich ohne Graphen funktionieren? Z.b. wenn alle WPs miteinander verbunden sind.
Nichts ist unmöglich.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

13.09.2011, 19:31

Das ist doch dann trotzdem ein Graph.

5

14.09.2011, 08:00

RE: Probleme bei A* mit Waypoints


Also ich habe diese Variable genommen: OpenList ClosedList OpenListPos ClosedListPos OpenListWPNo ClosedListWPNo G H. Das sind alle arrays. Ich benutze keine 2D Arrays, da ich mit minIndex einfach den kleinsten F wert raussuchen kann. Bei 2D geht das schlecht :P.


Ich habe mir den Algorithmus auch von dieser Seite beigebracht. Allerdings habe ich kein Array verwendet sondern eine Liste vielleicht solltest du mal nach Doubly linked list googeln dann wird vielleicht auch klarer was mit "vorgänger" und "nachgänger" gemeint ist.
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Koschi« (14.09.2011, 08:13)


TGGC

1x Rätselkönig

Beiträge: 1 799

Beruf: Software Entwickler

  • Private Nachricht senden

6

14.09.2011, 08:20

Vorgaenger und Nachgaenger haben nichts mit der Anordnung in einer Liste oder Array zu tun, sondern nur mit der (potentiellen) Reihenfolge innerhalb des gesuchten Weges.

7

14.09.2011, 08:56

Hast du recht. Trotzdem finde ich das, dass ganze Konzept besser zu verstehen ist wenn man das mit listen umsetzt. Um ehrlich zu sein kann ich mir das gar net so recht vorstellen mit nem Array. Aufjedenfall stell ich es mir erheblich schwerer vor.
Mein Größtes Problem war damals die "Arbeitsweise" zu verstehen. Ich Denke Mal MaZy geht es da ähnlich (Vermutung). Und man kann einfach schlecht ein Konzept umsetzten wenn man es nicht verstanden hat.
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

8

16.10.2011, 17:23

Ich muss owhl dein Vorschlag nachprogrammieren,da ich nicht in einer Hochprogrammiersprache schreibe, diemeistens Libraries zu Verfügung stellen, aber zum glück sind da ja Pseudecode Beispiele drinne.

Nur ne Frage. Bissel mangelt es noch bei mir an der Logik.
Ich habe gelesen, dass man dort Vorher oder Danach etwas hinzufügen kann. z.B. insertBefore insertAfter

Wen ich jetzt etwas nehme die ich "Reihenfolge" nenne und dann z.B.

Quellcode

1
2
 "Node = 5" und "Nodenew = 7": 
insertBefore(Reihenfolge,Node, Nodenew)  

heißt das eigentlich dann dass der NodeNew der Vorgänger ist von Node da ja er vor him eingetragen wird??? Oder muss ich doch wieder auf 2 splitten: Vorgaenger und Nachfolge.

Edit: Wobei wenn ich überlege, wenn da schon vorher ein Node z.b. 2 vor Node 5 eingetragen wurde wäre ja doof da es dann der Vorgaenger von 7 sein würde wenn 7 vor 5 eingetragen wird.
Nichts ist unmöglich.

TGGC

1x Rätselkönig

Beiträge: 1 799

Beruf: Software Entwickler

  • Private Nachricht senden

9

16.10.2011, 22:44

Wie schon gesagt, hat Vorgaenger/Nachfolger bei A* nichts mit dem Vorgaenger/Nachfolger in einer Liste zu tun. insertBefore oder insertAfter ist daher nutzlos.

10

17.10.2011, 12:21

Ich kann gerade nicht dein Problem richtig nachvollziehen.

Aber vielleicht kann ich ja mit dem folgenden etwas Licht ins Duckel bringen...

Du hast bei einer Liste immer ein oder mehrere Objekte im Speicher liegen. Diese sind unter ein ander in bestimmter weise Verknüft, ch denke mal sehr häufig ist eine Doppelt verlinkte Liste. Es gibt immer eine "Schnittstelle" (Ich weis nicht ob man das auch so nennt ich habe mir den kram selber beigebracht.) zu diesen Speicher bereichen. Von dieser Schnittstelle kannst du dann zum nächsten Objekt (auch Knoten oder Node genannt) springen.
Bei einer Doppelt verlinkten Liste Kennt das Objekt seinen Vorderman und seinen Nachfolger. Das hat aber noch nichts mit A* zu tun sondern nur das die Objekte "wissen" wo im Speicher jeweils 2 andere Objekte zu finden sind.

= Node 1 <===> Node 2 <===> Node 3 =

So kann man sich das vielleicht etwas besser vorstellen. Node 1 weiß nicht das es Note 3 gibt weil die nicht "verlinkt" sind. Aber Node 2 kennt sein Vorderman (Node 1) und sein hinterman (Node 3).
Das Tolle ist ich kann jetzt auch die Reihenfolge ändern also z.B. Node 3 sagen es gibt Node 1, Node 2 sage ich du hast keinvorgänger und dein nachfolger ist Node 2, Node 1 sag ich du hast ein neuen nachfolger Node 3 und bekommst nen Vorderman Node 2.

= Node 2 <===> Node 1 <===> Node 3 =

dann sieht es so aus. So jetzt kann ich aber auch etwas in diese Liste einfügen (Die man sich übrigens vorstellen kann wie eine Kette).
Wenn ich jetzt mit meine Schnittstelle Node 1 ist (Liste so wie als letztes Dargestellt) und ich will ein neues Objekt einfügen kann ich den in die Liste vor die Schnittstelle (also Node 1) oder dahinter einfügen.

Davor:

= Node 2 <===>Node 4<===> Node 1 <===> Node 3 =

Dahinter:

= Node 2 <===>Node 1<===> Node 4 <===> Node 3 =

Soviel zu InsertAfter und InsertBefore. Es gibt auch noch andere möglichkeiten z.B. an den Anfang oder an das Ende der Liste einfügen.

Üblicher weiße haben die Nodes auch noch einen Inhalt z.B. stehen da die Coordinaten drin und/oder alles was so in A* reingehört F H und G ect. und jetzt kann man routinen schreiben die das einfügen und einsortieren nach einem bestimmten Parameter des inhalts z.B. H.

Wie das jetzt alles im einzelnen Aufgebaut ist läst sich auch im Netz rausfinden.

Ich hoffe damit konnte ich deine Verständnisprobleme lösen wenn nicht beschreib dein problem noch mal genauer.
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Koschi« (17.10.2011, 12:31)


Werbeanzeige