Pfadfindung mit mehreren zufälligen Pfaden in einem Tower Defense-Spiel


8

Ich dachte über zufällige Wegfindung für mein Tower Defense-Spiel nach. Ein * würde für meine Schüler nicht funktionieren, da ich speziell eine zufällige Pfadfindung benötige .

Stellen Sie sich eine Karte mit Routen, einem Startpunkt und einem Ziel vor. Ich habe mehrere Routen, die alle vom Startpunkt zum Ziel führen, auf die eine oder andere Weise. Es könnte so aussehen:


Zwei Astpfade in Form eines Quadrats

Farbbeschreibung: rot - Ausgangspunkt; schwarz - Bestimmungsort; grau - Route; Leerraum
(Die Zahlen werden im Text als Referenz für einige Kacheln verwendet)


Ich dachte zuerst daran, den nächsten Wegpunkt zufällig zu berechnen, wenn eine Entität eine Kachel passiert. Das würde aber nicht funktionieren. Wenn eine Entität Kachel 1 passiert, kann sie entweder nach oben oder nach unten gehen. Wenn es um 2 geht, kann es entweder nach unten / oben (relativ zu seiner Position) oder nach rechts gehen.
Wenn es runter / rauf geht, geht es zu Kachel 1, was bedeutet, dass es rückwärts geht. Schlecht...

Ich würde es wirklich gerne dynamisch machen , aber ich kann nicht herausfinden, was ich jetzt tun kann. Jemand mit Ideen oder Erfahrungen darin?


Die meisten Tower Defense - Spiele , die ich von Make bewusst bin , die Dinge kriechen den kürzesten Weg zum Ausgang und alle Züge blockieren , die hier am Austreten aus ... Der harte Teil ungültig machen würde machen würde , dass die Pfade neu zu berechnen , wenn der Spieler den Turm Layouts ändert
James

@James: Meinst du, den kürzesten Weg zu finden, nämlich A *, oder meinst du, durch die Wegpunkte zu kriechen, um gültige Anweisungen für jede Kachel zu erhalten? Ich muss den Pfad auch nicht neu berechnen, da meine Wege festgelegt sind und der Spieler dort keine Türme platzieren kann. Aber im Allgemeinen hast du recht.
Marco

Antworten:


4

Anstatt alle benachbarten Quadrate als mögliche nächste Wegpunkte zu haben, schließen Sie nur Quadrate ein, die nicht zum Anfang zurückführen, und wählen Sie diese zufällig aus. Wenn Sie dies tun würden, wäre es unmöglich, rückwärts zu gehen, da ein Zurückgehen keine Option ist.

Dies ist ein gerichtetes Diagrammproblem mit jedem Wegpunkt als Scheitelpunkt und jedem Pfad als Kante. Sie müssen nur die Anzahl der Zyklen begrenzen und sie möglicherweise vollständig entfernen.


Das war mein zweiter Gedanke. Ich muss über die Implementierung der Sache "Der Weg führt zurück" nachdenken. Die Begrenzung der Anzahl der zu übergebenden Kacheln wäre nicht dynamisch und flexibel.
Marco

Sie können dieses Problem lösen, indem Sie ein gerichtetes Diagramm erstellen und die besuchten / nicht besuchten Kacheln verfolgen. Stellen Sie dann sicher, dass Sie nur nicht besuchte Kacheln durchsuchen. Das sollte Ihnen ein Diagramm erstellen, das Ihre Pfade darstellt. Wenn Sie nun auf eine Kachel treffen, auf der eine Note mehrere ausgehende Kanten hat (in der zuvor erstellten Grafik), wählen Sie einfach eine zufällig aus.
Bummzack

Ich wollte in meinem vorherigen Kommentar "Knoten" und nicht "Notiz" schreiben. Es tut uns leid.
Bummzack

@ Bummzack: Nein, das würde nicht funktionieren. Stellen Sie sich eine Karte mit 3 Pfaden vor. Wenn ich nach nicht besuchten Knoten suche, könnte ich auch einfach zum Anfang gehen. Ich denke darüber nach, einen Algorithmus zu implementieren, der durch die Karte kriecht und zufällig zwischen den Richtungen wählt. Wenn es merkt, dass es zum Anfang zurückgeht, ist dieser Teil unbrauchbar. Ich könnte das mit einem Zähler machen. Wenn der Abstand zum Start kleiner wird, geht er zurück. Dies wird bei der Kartenerstellung im Entwicklungsprozess einmal analysiert, sodass keine Leistungsprobleme auftreten.
Marco

@Marco Warum würde das nicht funktionieren? Wenn Sie eine breite erste Suche von Ihrem Startknoten aus implementieren, werden Sie die vorherigen Knoten nicht mehr besuchen. Sie werden nie wieder zum Anfang zurückkehren, weil es einer Flutfüllung sehr ähnlich ist.
Bummzack

7

Du sagst zufällig, aber wie viel Zufälligkeit willst du? Ist es in Ordnung, wenn die Feinde einen Pfad wählen, der zehnmal so lang ist wie der kürzeste? Ist es in Ordnung, wenn die Feinde in eine Sackgasse geraten und zurückgehen müssen? Das heißt, zufällig über welche Pfade und mit welcher Wahrscheinlichkeitsverteilung?

Angenommen, Sie möchten, dass die Feinde kurze Wege bevorzugen, könnten Sie A * verwenden, aber die zugeführten Kantengewichte zufällig variieren. Dann wählen die Feinde immer einen zufälligen Pfad, der jeden Knoten höchstens einmal besucht, mit einer Tendenz zu kürzeren Pfaden. Insbesondere wenn es ohne Randomisierung mehrere Pfade gleicher Länge geben würde, würde jeder dieser Pfade mit gleicher Wahrscheinlichkeit ausgewählt.

Alternativ können Sie in A * Nachbarn in zufälliger Reihenfolge durchlaufen. Wenn in Ihrem Beispiel die Pfadfindung den Knoten 1 erreicht, wird zufällig die Oberseite des unteren Nachbarn zuerst in die Warteschlange gestellt, wodurch der obere oder untere Pfad zuerst berücksichtigt wird. Diese Lösung würde dazu führen, dass Feinde zufällig zwischen allen kürzesten Pfaden wählen. In Ihrem einfachen Beispiel wären beide kürzesten Wege gleich wahrscheinlich, aber in einer Situation wie:

start -+--------+
       |        |
       +--------+
       |        |
       +--------+- end

Der obere Pfad würde mit einer Wahrscheinlichkeit von 1/2 gewählt, während die unteren mit einer Wahrscheinlichkeit von jeweils 1/4 gewählt würden.


Ich bin mir nicht sicher, was genau das OP unter "zufälliger Pfadfindung" versteht, aber Ihre Lösung für die zufällige Auswahl unter allen kürzesten Pfaden ist das, was ich davon ausgehen würde, und Ihr "alternativ usw." ist eine großartige Lösung für dieses Problem.
Jhocking

0

Nur ein Proof of Concept:

  1. Wähle eine zufällige Richtung.
  2. Wenn dies dazu führen würde, dass wir irgendwohin gehen, wo wir bereits waren, wählen Sie eine andere Richtung.
  3. Wenn wir keine Richtung mehr haben, kehren Sie mit einer unerforschten Richtung zum letzten Feld zurück.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.