Was ist die eleganteste Art, ein Befehlsbestellsystem für AI zu implementieren? Wenn Sie beispielsweise in einer Zwergenfestung ein Waldstück zum Holzhacken markieren, gehen die Zwerge folgendermaßen vor:
- Gehe zum Baum
- Den Baum fällen
- Liefere Holz auf die Halde
- Geh zu einem anderen Baum
- und so weiter..
Ich habe bereits einen Stapelbefehl mit der Nummer. 1, die vom Ruhezustand zum Erreichen des Zielfelds des Baums übergeht.
Was ich befürchte, ist, wie dies chaotisch wird, wenn ich mehr Aufträge wie diesen erstelle:
Ein Haus bauen
- Gehe zum Vorrat
- Holz zum Bau bringen
- Geh zurück zu Vorratslager
- Bringen Sie Stein zum Baugebiet
- Animieren Sie das Gebäude-Sprite
Pflanzen
- Gehe zum Vorrat
- Saatgut auf den Hof bringen
Brauen
- Gehe zum Vorrat
- Anlage zum Stillstand bringen
- animiere das Brau-Sprite
Meine Frage ist also, wie ich ein Befehlsbestellsystem wie die Zwergenfestung implementiere und gleichzeitig Spaghetti-Code vermeide. Gibt es Datenstrukturen, die ich studieren muss? Muss ich die Befehlssequenz in einer separaten XML-Datei ablegen?
Antworten:
Zuerst sehen Sie, dass Ihre Befehle in Form einer Liste vorliegen. Daher besteht Ihr erster Instinkt möglicherweise darin, diese Struktur neu zu erstellen, und jeder Zwerg durchläuft diese Liste nacheinander. Ich schlage jedoch vor, die Liste in Schritte aufzuteilen , wobei jeder Schritt eine oder mehrere Voraussetzungen hat. Anschließend führen Sie den gesamten Befehl in umgekehrter Reihenfolge aus . Lassen Sie mich mit einem Beispiel demonstrieren:
Holz schneiden
Die Vorteile davon sind:
Nachteile:
Logischerweise können Sie diese Befehle als Flussdiagramm darstellen, das jedes Mal von oben ausgeführt wird. Was Sie tun, hängt davon ab, ob Sie bei jedem Schritt mit Ja / Nein antworten. Ob Sie dies in Code oder in einer externen Datei wie XML implementieren, liegt bei Ihnen.
quelle
fun
? ;)Wenn Sie Sequenzen ziemlich allgemein machen können, gibt es nicht viel von einem Spaghetti-Code.
Bei Lieferungen zB: WorkTask arbeitet mit einem WorkPlan. Workplan legt fest, welche Art von Ressourceneinheit aus welcher Art von Haus ausgewählt werden muss, welche Laufanimation verwendet wird, welche Arbeitsanimation verwendet wird, wie viel Zeit für die Arbeit benötigt wird und all diese Details. Am Ende könnte WorkTask also so aussehen:
Wir setzen den beschriebenen Ansatz erfolgreich ein. Wir haben ~ 15 Aufgaben in unserem Spiel. Einige Höhepunkte:
quelle
Das ist also im Grunde ein topographisches Sortierproblem.
Sie haben eine Grafik, jeder Knoten ist eine Aufgabe, die erledigt werden muss, und einige Knoten hängen von anderen Knoten ab (dies wird durch eine Kante in der Grafik vom abhängigen Knoten zum abhängigen Knoten dargestellt). Wenn Sie alle Aufgaben ausführen möchten, müssen Sie eine EINZIGE topografische Reihenfolge der Knoten erstellen (die abhängigen Knoten befinden sich hinter den Knoten, von denen sie abhängen).
In der Regel gibt es viele solcher Anordnungen (da einige Knoten keine Abhängigkeiten aufweisen und an eine beliebige Stelle verschoben werden können, und einige Knoten dieselben Abhängigkeiten aufweisen und nicht voneinander abhängig sind, können sie also in beliebiger Reihenfolge untereinander und mit jedem Knoten in beliebiger Reihenfolge vorliegen) an einem beliebigen Ort abgelegt werden, nachdem die Abhängigkeiten ausgeführt wurden und bevor Knoten, die davon abhängen, ausgeführt werden.
Es ist auch möglich, dass es keine Möglichkeit gibt, eine grafische Topografie zu sortieren - dies geschieht, wenn das Diagramm Zyklen enthält (Sie haben kein Holz, um Holz zu erhalten, müssen Sie einen Baum fällen, um einen Baum zu fällen, müssen Sie eine Axt herstellen) brauche Holz). In diesem Fall sollte der Algorithmus dem Spieler wahrscheinlich anzeigen, dass diese Aufgaben nicht ausgeführt werden können.
Sie können Knoten auch Prioritäten hinzufügen, und die Aufgabe kann darin bestehen, unter allen Ordnungen, die die Abhängigkeiten erfüllen, eine solche Reihenfolge zu finden, bei der die Knoten mit der größeren Priorität zuerst ausgeführt werden.
Sie können auch wiederkehrende Aufgaben hinzufügen. Am einfachsten ist es wahrscheinlich, die Aufgabe mit Zeitüberschreitung bei jeder Ausführung erneut zum Diagramm hinzuzufügen.
Jetzt, wie man es löst - http://en.wikipedia.org/wiki/Topological_sorting
quelle