Wie finde ich ein Hindernis?

10

Wie man die folgende Situation am besten darstellt - agent ( @) muss zum Ziel gelangen ( $). Der Weg ist durch einen Wassergraben blockiert ( ~~~). Ein Rechen (oder ein anderes Gerät wie Wasserlaufstiefel) ist verfügbar, mit dem das Hindernis überquert werden kann.

.....~~~...   . ground
...=.~~~...   = rake
.....~~~.$.   ~ water
.@...~~~...   @ agent
.....~~~...   $ goal

Wie kann man den Pfad richtig finden @, $vorausgesetzt, es gibt keinen sofort verfügbaren Pfad? Sollte mein Weg nicht nur Kosten, sondern auch Voraussetzungen haben?

UPD : Das Problem ist, dass das Ziel nicht zugänglich ist und Rake nur eines von vielen möglichen Objekten auf der Karte ist. Die Frage ist dann: "Wie kann der Agent verstehen, dass er den Rechen benötigt?"

zzandy
quelle
Ich denke, Sie sollten Ihren Anwendungsfall klären, da dies den Ansatz zur Lösung dieses Problems beeinflussen würde. Wenn der Anwendungsfall beispielsweise darin besteht, Pfade für Feinde zu berechnen, sollten Sie wahrscheinlich zuerst prüfen, ob das Ziel derzeit erreicht werden kann, wenn die Feinde nicht den Rechen erhalten (dh der Rechen ist das Ziel), und dann den Pfad zum ersten finden wieder Ziel.
Schock

Antworten:

6

Ich denke über einen Stapel von Zielen nach, die Wegfindung muss kommentiert werden :

  • Beginnen Sie mit einem Ziel get $
  • Versuchen Sie, Pfad zu $Pfad zu finden, der mit der erforderlichen Wasserlauffähigkeit vorhanden ist.
  • Tor schieben get waterwalking.
  • Zielstapel ist jetzt get waterwalking, get $
  • Finden Sie irgendwie heraus, dass Rechen Wasserlaufen gibt, lassen Sie uns es in Boot umbenennen.
  • Weg zum Harken. Top Ziel erreicht, Pop es vom Stapel, Ziel ist get $.
  • Weg zu $- jetzt haben wir die Fähigkeit und können das Ziel erreichen.
zzandy
quelle
1
+1 Ich habe etwas Ähnliches mit meinem Spiel gemacht und vor einiger Zeit einen kleinen Beitrag darüber unter Einheitenaufgaben und Pfadfindung geschrieben .
MichaelHouse
@ Byte66 behandelt keinen Sonderfall, wenn es einen Pfad ohne Rake gibt, aber die Verwendung des Rakes führt zu einem kürzeren Pfad
Ali1S232
@ Gajet du hast recht. Vermutung braucht dafür einen anderen Ansatz.
Zzandy
1
Es ist nur eine Frage der zusätzlichen Kosten. Wenn Sie auf Wasser stoßen, addieren Sie die Kosten, um das wasserlaufende Objekt auf den Pfad zu bringen. Ein * überspringt das Wasserlaufen, bis es der billigste Weg ist.
MichaelHouse
3

Das gesamte Pfadfindungsmaterial ist nur eine Suche nach dem kürzesten Pfad über einem Diagramm. Um Ihr Problem zu lösen, müssen Sie nur einige zusätzliche Kanten hinzufügen (die den Pfad darstellen, den das Boot nehmen kann) und einen einfachen Pfadfindungsalgorithmus ausführen. Es spielt keine Rolle, ob Sie BFS, Dijkstra oder A * verwenden. Implementieren Sie einfach einen normalen Pfadfindungsalgorithmus mit einigen zusätzlichen Kanten. Weitere Informationen zum Finden von Pfaden in einer Grafik finden Sie auf der Wiki-Seite

Ali1S232
quelle
+1 Machen Sie Ihren Rechen zu einer Einbahnstraße zum Wasser, wobei Wasser zu Boden auch Einbahnstraßen sind.
Laurent Couvidou
Ich habe kein klares Verständnis dafür, wie man geometrische Suche und Feature-Suche miteinander verbindet. Wie gehen aus no path from @ to $zu goto rake, bring it to water, place it, goto $.
Zzandy
@zzandy Während Sie den Pfad finden, gehen Sie für jede Kachel, wenn möglich, zur nächsten Kachel. Sie müssen nur eine Bedingung hinzufügen, dass Sie, wenn der aktuelle Knoten ein Rechen ist, direkt einen Knoten von der anderen Seite des Flusses zur offenen Liste hinzufügen können.
Ali1S232
Aber was ist, wenn Sie das Gerät tragen können? Ich dachte, das meinte er (und damit meine Antwort)
kaoD
Ja, ich meine, das Gerät kann (und muss) gepflegt werden. @kaoD, Ihre Antwort enthält nicht den Schritt, wenn ein Agent auf die Idee kommt, dass er den Rechen benötigt.
Zzandy
2

Ich würde dies mit einer Art Verhaltensbaumlösung tun - Sie gehen zum Ziel und nehmen alle Hindernisse zur Kenntnis, die Ihr A * blockiert haben. Wenn Sie versagen, überprüfen Sie, ob es Objekte gibt, die helfen können, diese Hindernisse zu überwinden. In diesem Fall den Pfad zu diesem Objekt. Wiederholen. Dies bedeutet, dass der Agent versuchen muss, zum Ziel zu gelangen, und scheitern muss, bevor er auf die Idee kommt, Tools zu verwenden. Dies kann einige Zeit dauern, insbesondere wenn es eine riesige Welt von Kacheln gibt, die alle überprüft werden müssen. Könnte nicht zu fehl am Platz aussehen, dass der Agent einige Zeit braucht, um darüber nachzudenken, wie das Problem gelöst werden kann.

Ich kann mir jedoch eine echte Hardcore-Lösung vorstellen. Fügen Sie Ihrem Pfadfindungsraster eine weitere Dimension hinzu. Im Fall einer 2D-Karte erstellen Sie das Pfadfindungsgitter in 3D. In diesem einfachen Beispiel hätte diese neue Dimension nur eine Tiefe von zwei, aber in einem echten Spiel würde sie schnell groß werden.

Bei z = 0 kartieren Sie das Gelände unter normalen Umständen, was bedeutet, dass Wasserfliesen als unpassierbar gelten.

Bei z = 1 kartieren Sie das Gelände so, wie es ist, während Sie den Rechen haben, was bedeutet, dass Wasserfliesen als begehbar gelten (aber wenn Sie beispielsweise Wandfliesen haben, können diese fest bleiben).

Die Pfadfindung ist ein gewöhnliches A * in den x- und y-Dimensionen, was bedeutet, dass jede Gitterzelle Zugriff auf ihre Nachbarn hat. In der z-Dimension darf sich das A * jedoch NICHT ausbreiten.

Außer wo der Rechen ist. Das Rechenobjekt wirkt als Öffnung zwischen z = 0 und z = 1 im Pfadfindungsgitter.

Dies bedeutet, dass das A * in z = 0 nach außen flutet, auf das Wasser trifft und keine Optionen mehr hat - dann breitet es sich durch das Rechenplättchen auf z = 1 aus und bei z = 1 (wo Wasser begehbar ist) finde den Weg zum Ziel. Der Effekt ist, dass sich der NPC ohne zu zögern zum Rechen bewegt und dann den kürzesten Weg zum Ziel bewegt.

Joar Jakobsson
quelle
Ich habe den Rechen in meinem Beispiel eher wie "Wasserwanderschuhe" behandelt, was bedeutet, dass Sie, wenn Sie ihn haben, über Wasserfliesen fahren können. Wenn der Rechen tatsächlich als Geländestück "gebaut" werden muss und eine begrenzte Anzahl von Kacheln bedeckt, die möglicherweise nicht ausreichen, um über das Wasser zu gelangen, ist das Problem schwieriger. Meine Lösung erlaubt jedoch einmalige Elemente, wenn Sie eine Bewegung in z = 1 ausführen und automatisch wieder auf z = 0 fallen.
Joar Jakobsson