Direkte Wegsuche

Spiele, Demos, Grafikzeug und anderes unterhaltendes.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6999
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Direkte Wegsuche

Beitrag von STARGÅTE »

Vorwort
Nach vielen schlaflosen Nächten habe ich es nun geschafft
eine funktionsfähige direkte Wegsuche zu programmieren.
Derzeit biete ich euch nur eine Demo-Anwendung,
bei der ihr selber Start und Ziel verschieben könnt
und Mauern setzen könnt.
Dies dient dazu mehr Ergebnisse zu sammeln,
sodass ihr mit BUGs oder nicht ganz richtig berechnete Wege
zeigen könnte (ScreenShot mit F12)
Später werde ich dann den Quellcode freigeben,
sodass ihr es in Spielen verwenden könnt.


Infos
- Wegsuche ist Thread-basierend (behintert während der Suche nicht das Hauptprogramm)

Vorteile
- Felderlose Wegsuche
- freies Setzen von Mauern und Start/Ziel-Punkt im Zahlenbereich FLOATs
- Enorm schnelle Wegfindung bei riesigen Karten
- genaue "umfahrung" von unregelmäßigen Mauern

Nachteile
- schneller Anstieg der Berechungszeit bei ungünstiger Mauerlage


ScreenShot
Bild

PathFind.zip - Quellcode von Demo, PathFind und Includes

PathFind - Demo Nur als Anwendung

Inhalt:
PathFind-Demo.pb ; Beispiel für die Anwendung
PathFind.pbi ; Haupt-Include für das Wegfinden
Math.pbi, Vector2D.pbi und Line2D.pbi ; Diese sind für die PathFind.pbi notwenig, weil ich das nicht alles mit in die PathFind quetschen wollte. Logischerweise sind dabei auch unbenutze Proceduren dabei, diese gelten hiermit als mit "veröffendlicht"
Mouse.pbi ; ist noch für die Demo notwenig.

Meine Code sind immer etwas "knapp" Kommentiert, bitte nicht übel nehmen :roll:

Zur Frage:"Wie sieht denn deine Thread-Arbeitsverteilung aus ?"

Mit einer Procedure wird halt ein Thread gestartet:
CreateThread(@FindPathThread(), *PathTree)
dieser Thread arbeitet nun (völlig unabhängig von außen)
Wenn der Weg gefunden ist, endet der Thread und ExaminePath wird 1 und man kann die Wegpunkt auslesen.
Wenn man nun während der Wegsuche n neue Linie setzt wird die aktuelle wegfindung gekillt, dass das so hart sein muss, kann dabei jeder selber entscheiden ich habe halt FreePath eingebaut.

Schauts euch einfach an.
PS: sobalt auch nur ein Byte geändert wird, verfällt die Rückgabegarantie :wink:
... kleiner witz ^^

Noch n kleiner AnwendungsHinweis:
Falls jemand diese Wegfindung bei "normalen" Quadratischen oder Rechteckigen Gebäuden anwenden will, dann braucht man dort nicht 4 Seitenwände, sondern ein Kreuz aus den Diagonalen erfüllt auch den Zweg und man braucht nur 50% der Wände.
Natürlich muss man dann noch verhindern das jemand das Ziel IN DAS Gebäude setzt.
Zuletzt geändert von STARGÅTE am 10.07.2010 23:21, insgesamt 5-mal geändert.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Cool, funktioniert in einem ersten Schnelltest tadellos. Habe auf Anhieb nichts erwähnenswertes gefunden.
Sogar unmögliche Positionierungen werden erkannt und mit "Das Ziel ist unerreichbar" entsprechend kommentiert. Toll! :allright:

Vielleicht kannst du noch die Funktion "Alternativweg" einbauen. Denn wenn dieser Algorithmus in einem Strategiespiel eingesetzt und die markierten Einheiten immer denselben Weg nehmen würden, wäre das schon ein bisschen langweilig. Eventuell kannst du ja einen Parameter einbauen, der eine Varianz erlaubt (nicht den kürzesten Weg, sondern den kürzesten Weg mit ein paar weitläufigeren Umrundungen der Mauern, damit eine Kolonne Einheiten nicht stumpf hintereinander herläuft, sondern in lockerer Formation). Oder, was auch super wäre, wie bei einem Navigationsgerät, die Möglichkeit, komplett andere Routen, also Alternativpfade zu finden.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
dige
Beiträge: 1183
Registriert: 08.09.2004 08:53

Beitrag von dige »

Nach ca. 20 Linien ist es plötzlich gecrasht ... ohne weitere Infos. Kannst Du mal bitte eine Version mit der OnError Lib hochladen?
"Papa, mein Wecker funktioniert nicht! Der weckert immer zu früh."
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Beitrag von RSBasic »

@SG
Hi,

echt sehr gut gemacht, das ist einfach klasse :allright:

Aber wenn zum Schluss das Ziel nicht mehr erreichbar ist, dann bekomme ich leider eine Fehlermeldung:
Bild

\\Edit:
Ich habe mal was ausprobiert, aber ich verstehe nicht, wieso das Zeil unerreichbar ist? :?
Da ist doch viel Platz <)
Bild
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6999
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

dige hat geschrieben:Nach ca. 20 Linien ist es plötzlich gecrasht ... ohne weitere Infos. Kannst Du mal bitte eine Version mit der OnError Lib hochladen?
Jo kann ich machen, aber was soll ich dennn alles ausgeben lassen ?
Reicht das hier:

Code: Alles auswählen

Procedure ErrorHandler() 
 MessageRequester("Fehler", GetErrorDescription()) 
 End  
EndProcedure 

OnErrorGosub(@ErrorHandler())
@RSBasic
Das das Ziel dort unerreichbar war, könnte damit zusammen hängen das du an manchen stellen "ausgebessert" hast.
Es könnte sein (habs noch nicht probiert) das er bei den Wegsuche in eine "mini"-Sackgasse gekommen ist, aus der er jedoch nicht mehr raus kommt.
Wei das möglich ist weiß ich jedoch nicht.

Ich werde als Update eine hinreichende Fehlerauflistung geben lassen....
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
hörmi
Beiträge: 106
Registriert: 10.07.2007 15:20
Kontaktdaten:

Beitrag von hörmi »

hab auch was gefunden...vll kannst ja was damit anfangen

Bild
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

@STARGÅTE: Immer wieder klasse, was Du da bastelst :allright:
Das sieht für mich als Laie ziemlich beeindruckend aus.

Wollt ich nur mal so gesacht ham ... Kiffi
Hygge
Benutzeravatar
X0r
Beiträge: 2770
Registriert: 15.03.2007 21:47
Kontaktdaten:

Beitrag von X0r »

Respekt! :allright:
Muss mich damit auch mal irgendwann beschäftigen. :mrgreen:
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6999
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

Hinweis

Das kling jetzt vielleicht etwas blöd, aber ich habe die Berechungen noch mal komplett auf den Kopf gestellt und versuche nun das ganze zu minimieren (sowohl Zeit, als auch Speicher)

Deswegen kann es noch n bisschen dauern ...
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Beitrag von Thorium »

Cool, kann es sein das der auf dem gleichen Prinzip basiert, was ich mir auch mal ausgedacht hatte? Siehe hier.
Sieht mir so aus. Wenn ja, sehr schön das mal in aktion sehen zu können. :allright: Ich hatte es damals nie programmiert, nur konzeptioniert und wegen Schwächen bei Tilewertigkeit nicht umgesetzt.
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
Antworten