Wie erstellt man konzeptionell eine Regel- / Beschränkungs-Engine (keine Grafik- / Physik-Engine) für ein Spiel?

16

Ich möchte ein einfaches Spiel erstellen, das den Büchern zur Auswahl Ihrer eigenen Abenteuer ähnelt. Der Spieler erhält einen narrativen Text und kann seine Aktion aus einer Liste von Möglichkeiten auswählen. Dies führt wiederum zu einem neuen narrativen Text, ad infinitum. Der einzige Haken ist, dass die Liste der Möglichkeiten je nach vorherigen Entscheidungen unterschiedlich sein kann.

Auf den ersten Blick klingt dies wie eine Fülle von if-else-Anweisungen, was bedeutet, dass eine Regel-Engine vorhanden ist. Aber es klingt für mich auch wie eine endliche Zustandsmaschine.

Ich bin dabei, dies in Java oder vielleicht Groovy zu schreiben. Ich interessiere mich derzeit mehr für konzeptionelle Fragen, dh wie sollte dies auf einer breiten Ebene geschehen (wie implementieren die Leute überhaupt Schach oder Kartenspiele?), Aber einige Ratschläge zu einer bestimmten Bibliothek sind auch willkommen.

Offensichtlich bezieht sich die "Spiel-Engine" aus dem Titel nicht auf die Kollisionserkennung oder andere physikalische / grafische Mechanismen, sondern auf die Logik, die darüber entscheidet, welche Optionen ein Spieler der Situation und seinem aktuellen Zustand gegeben hat.

kaqqao
quelle
1
Ist diese Frage besser für Spielev geeignet ?
Uwe Plonus
2
@Uwe Plonus Betrachtet das, aber ich glaube nicht. Meine Frage ist rein konzeptionell und hat nichts mit Grafikbibliotheken, 3D und anderen Themen zu tun, die gamedev beherrschen. Wenn Sie sich das überlegen, hat diese Frage wenig mit Spielen an sich zu tun ... aber Sie wissen nicht, wie Sie sie besser benennen sollen.
Kaqqao
Schach und Kartenspiele sind sehr verschieden von Abenteuer.
Deer Hunter
1
Ihre Frage scheint sich auch mit der Entwicklung von Expertensystemen zu befassen. Wo das Spektrum an Folgefragen und möglichen Diagnosen mit jeder ausgewählten Antwort begrenzt wird. Vielleicht ist es das, wonach man suchen muss, um mehr "Input" zu finden?
Marjan Venema

Antworten:

7

Basierend auf dem, was Sie in den Kommentaren gesagt haben, würde ich so damit umgehen:

Implementieren Sie die Geschichte als Finite-State-Maschine mit einem Twist. Jeder Zustand ist eine Seite der Geschichte, und jeder Übergang ist eine Verknüpfung von einer Seite zur anderen. Aber jeder Übergang hat auch Bedingungen . Die Bedingungen können null sein. In diesem Fall wird der Übergang immer als verfügbare Option angezeigt. Wenn dies jedoch nicht der Fall ist, müssen sie ausgewertet werden, wenn die Seite angezeigt wird. Wenn die Auswertung zurückgegeben wird False, wird der Übergang nicht angezeigt .

Es gibt zwei grundlegende Möglichkeiten, wie Sie die Bedingungen implementieren können. Die erste besteht darin, eine vollständige Skript-Engine im Spiel einzurichten, und dann sieht die Bedingung so aus return player.inventory.contains(GUN). Dies ist anfangs komplizierter einzurichten, ermöglicht jedoch eine erweiterte Skripterstellung.

Die zweite besteht darin, die möglichen Bedingungen in eine Art Objekt fest zu codieren. Es könnte ein RequiredItemFeld haben, und wenn dieses Feld einen Wert hat, prüfen Sie, ob die Bedingung erfüllt ist. Dieses System ist einfacher einzurichten. Es schränkt die Möglichkeiten, die Sie haben, erheblich ein, als dies bei Skripten der Fall wäre. Wenn Sie jedoch nicht die Flexibilität benötigen, die eine Skript-Engine bieten würde, ist die Verwendung wahrscheinlich wesentlich einfacher.

Mason Wheeler
quelle
1
So etwas verwenden wir eigentlich in unserer völlig spielfreien Web-App. Der Benutzer verfügt über eine Reihe von Status, und eine beliebige Anzahl von Ereignissen kann im Code ausgelöst werden. Viele davon sind voreingestellt, um Benutzer von einem Status in einen anderen zu überführen. Ich denke, für die beschriebenen Fälle der Frage wäre es auch hilfreich, eine Art rudimentäre Skriptsprache (oder eine Vollsprache wie Python / Lua) zu haben, um Bedingungen / Trigger zu definieren.
Katana314
Ich mag diesen Ansatz ziemlich. Vielen Dank! Ich werde es weiter untersuchen. Gibt es eine Chance, dass Sie eine nützliche Bibliothek kennen?
Kaqqao
@veggen: Nein, sorry. Kein Java-Entwickler.
Mason Wheeler
@MasonWheeler: Was denkst du über Lazarus ?
Robert Harvey
1
Da diese Frage heute in die Liste der am häufigsten gestellten Fragen aufgenommen wurde, werde ich berichten, dass ich sie genau so implementiert habe, wie ich es im vorherigen Kommentar angekündigt hatte. Ich habe eine schöne DSL erstellt und die FSM-Logik selbst implementiert, da sie wirklich sehr einfach ist. Konnte mit der Lösung nicht zufriedener sein. @MasonWheeler Nochmals vielen Dank für einen tollen Rat!
Kaqqao
5

Ich denke, die Antwort ist im Titel: Sie brauchen eine Regel-Engine. Wenn Sie vorhaben, Ihre Anwendung mit Java zu schreiben, können Sie natürlich Ihre eigene schreiben, wie von Gilbert Le Blanc vorgeschlagen, ODER Sie möchten sich Drools , eine Regel-Engine, ansehen .

Welche Möglichkeiten hat ein Spieler, um die Situation und seinen aktuellen Zustand zu bestimmen?

Mit Drools oder einer anderen Regelengine können Sie eine parametrisierte Situation definieren, die eine Liste möglicher Aktionen ausgibt. Sie können einfache Regeln codieren, die suc hat:

  • Spieler ist bei pageX:

    • Auswahl 1: Titel: "Nach links gehen", Aktion: "Seite 45"
    • Auswahl 2: Titel: "Nach rechts gehen", Aktion: "Seite 56"
    • WENN der Spieler den Stab der Feuerbälle hat, DANN Wahl 3: Titel "Feuerball starten", Aktion: "Seite 32"
    • WENN der Spieler eine Wahrnehmungsfähigkeit von 10 hat, DANN Auswahl 4: Titel "Check Writings on the Wall", Aktion: "Seite 67"

Das Interessante an Drools ist, dass Sie alle Ihre Regeln in eine Excel-Datei kodieren können und dann Drools zu Beginn des Spiels veranlassen, diese Datei zu lesen. Danach ist alles im Speicher, Sie müssen sich nur noch um Ihre Benutzeroberfläche kümmern.

Hier sind einige Ressourcen, die Ihnen den Einstieg in Drools erleichtern sollen:

Jalayn
quelle
Im Allgemeinen - suchen Sie nach dem Rete-Algorithmus, der in einer Regel-Engine Ihrer Wahl implementiert ist .
Deer Hunter
Ja, Drools war eines der Dinge, mit denen ich angefangen habe. Ich muss ein bisschen mehr nachforschen, um zu sehen, ob ich jeweils nur ein Regelpaket bewerten kann, da dies in meinem Fall ziemlich wichtig ist. Vielen Dank!
Kaqqao
@veggen hilft gerne weiter!
Jalayn
2

Konzeptionell ist Ihr Spiel unkompliziert. In psudeocode würde es ungefähr so ​​aussehen:

while not at end of adventure story
    display text
    get response

Nun ist es schwierig, den gesamten Text so zu verketten, dass er von einer Aktion zur nächsten fließt. Sie könnten eine relationale Datenbank verwenden. Du könntest einen Baum gebrauchen.

Es ist etwas schwierig, genauer zu sein, ohne zu wissen, welche Computersprache Sie verwenden möchten. Da Sie Java erwähnt haben, würde ich mich eher zu einer Baumstruktur neigen.

Erstellen Sie eine Antwortklasse, die eine Antwort und einen Link zu einer Textklasse enthält.

Erstellen Sie eine Textklasse, die den Abenteuertext und eine Liste der Antworten als Instanzen der Antwortklasse enthält.

Bearbeitet, um den Kommentar zu beantworten:

Sie berechnen nichts basierend auf diesem Modell. In Ihrem Beispiel würde der Baum ungefähr so ​​aussehen, wobei T der Text und A eine Aktionsauswahl ist:

T You stumble on a dead police officer
    A Take the gun
    T You hear footsteps
      A Run away
      A Hide and see who comes
    A Don't touch anything
    T You hear footsteps
      A Run away

Ja, es gibt einige Textduplikationen, aber wenn Sie der Kette folgen, können zukünftige Aktionen frühere Entscheidungen berücksichtigen. Es ist ein riesiger Entscheidungsbaum.

Gilbert Le Blanc
quelle
Mein Problem ist die Berechnung der möglichen Antworten. Vergangene Entscheidungen beeinflussen aktuelle Optionen. Wenn also ein Spieler mit der Aufschrift "Sie stolpern über einen toten Polizisten" wählt "seine Pistole stehlen" anstatt "nichts anfassen", erhält er später die Option "den Verfolger zu erschießen" und "davonzulaufen" verrückt ", was die einzige Option gewesen wäre, wenn sie zuvor keine Waffe gekauft hätten.
Kaqqao
@veggen: Siehe die aktualisierte Antwort.
Gilbert Le Blanc