Vermeiden Sie unmögliche Zustände in einem Abenteuerspiel

15

Ich versuche, einen ziemlich komplexen Spielstil zu entwickeln, den Sie selbst wählen können, aber ich suche nach einer Technik oder Methode, die bei der Gestaltung des Spiels hilft.

Es wird eine vielschichtige Geschichte, und manchmal klappen die Zweige in sich zusammen, und Ihre Hauptaktionen werden in Erinnerung bleiben und Gegenstände werden gesammelt. Wenn der Spieler zum Beispiel in den Sumpf und in den Wald geht, bevor er zum Schloss geht, hat er einen Dinosaurierknochen aufgehoben, ein Einhorn getötet und einen zusätzlichen Arm bekommen. Wenn ein Spieler über die Höhlen und die Krypta zum Schloss gelangt, hat er ein Fahrrad und einen seltsamen Geruch aufgehoben. Wenn ich jetzt Rätsel für das Schloss entwickle, möchte ich keine Situation schaffen, in der zum Beispiel zwei Unmöglichkeiten erforderlich sind - ein zusätzlicher Arm und der Geruch werden benötigt, um einen Oger zu töten.

Gibt es einen Prozess, eine Technik, die ich in einer Tabelle verwenden kann, oder eine Software, die mir helfen kann, außer die Ereignisse und Elemente sehr, sehr sorgfältig zu dokumentieren?

DanDan
quelle

Antworten:

11

Klingt nach einem gerichteten Graph-Problem.

Beginnen Sie am Anfang. Notieren Sie für jede Verzweigung in der Story die Elemente, die Sie aktuell haben, und verzweigen Sie dann das Diagramm. Von dort aus folgen Sie jedem Zweig und tun dasselbe, sobald Sie zu einem anderen Zweig gelangen, zeichnen Sie Ihre aktuellen Elemente auf und verzweigen Sie das Diagramm. Dies führt zu einem ziemlich dichten Graphen mit vielen duplizierten Knoten (aber jeder Knoten ist von einer anderen Graphsequenz dorthin gelangt), aber Sie sollten keine Schleifen erhalten.

Am Ende sollten Sie eine grafische Darstellung aller Elemente haben, die Sie zu einem bestimmten Zeitpunkt in Ihrer Geschichte haben können, und alle möglichen Wege, um dorthin zu gelangen.

Nun zu Ihrem vollständigen Diagramm: Suchen Sie für jedes Ihrer Probleme, für die Elemente X + Y + Z erforderlich sind, alle Knoten, bei denen dieses Problem auftritt, und prüfen Sie, ob die aufgezeichneten Elemente diese Bedingung erfüllen können. Wenn ein Fehler auftritt, rufen Sie einfach das Diagramm auf, um alle Entscheidungen zu finden, die Sie dort getroffen haben, ohne die richtigen Elemente zur Lösung dieses Problems.

Mit etwas Glück ist Ihr ursprüngliches Design zumindest konzeptionell bereits so angelegt, sodass der Code die Realität widerspiegeln und leicht zu überprüfen sein sollte.

Wenn Sie ein großes Spiel erstellen, kann die Verarbeitungszeit für die Suche nach Diagrammen etwas lang sein. Erstellen Sie dieses Dienstprogramm, dessen Ausführung einige Zeit in Anspruch nehmen kann, und geben Sie die Ergebnisse in einem Bericht aus, den Sie verwenden können.

Patrick Hughes
quelle
Das heißt, ein Werkzeug zu entwickeln. Ich möchte das als letzten Ausweg bezeichnen.
Ali1S232
6
Das Tool wird entweder Ihr eigenes Gehirn, Ihre Aufzeichnungs- und Speicherkapazität sein oder es wird etwas Automatisiertes sein, das nicht müde wird und keine Panne verpasst Bauen Sie je einen anderen aus demselben Motor, um zu entscheiden, ob sich die aufgewendete Zeit lohnt oder nicht.
Patrick Hughes
Der beste Weg, dies zu tun, besteht möglicherweise darin, einen Abhängigkeitsbaum von oben nach unten zu erstellen (rückwärts). Wenn zwei Elemente im Baum dieselbe Abhängigkeit aufweisen (und für die Abhängigkeit eine Auswahl zwischen ihnen erforderlich ist), liegt eine Verletzung vor.
verzögerte
0

Dies mag seltsam erscheinen, aber Sie können mithilfe von Compilern (z. B. c ++) leicht nach unmöglichen Ereignissen suchen! Lassen Sie mich erklären, wie: Sie haben genau eine Header-Datei für jede Stufe. und das Spiel endet in einer main.cppDatei. Wann immer Sie von stage azu wechseln können stage b, müssen Sie nur die Datei beziehen, die sich auf stage ain bezieht stage b. Wenn Sie in einer Phase einen neuen Artikel erhalten, definieren Sie einfach einen Wert für diesen Artikel. Immer wenn Sie einen Gegenstand verloren haben oder benutzen, müssen Sie ihn nur wieder aufheben. Am Ende müssen Sie in jeder Phase nur alle definierten Werte für die in dieser Phase benötigten Elemente verwenden. Hier ist ein Beispiel, wie dies im Code verwendet wird:

Ah

#define itemA

bh

#include <a.h>
#undef itemA
#define itemB

CH

#include <a.h>

itemA;

#include <b.h>

itemB;

main.cpp

#include <c.h>
int main()
{
}

Es kann zwar einige Änderungen erfordern, bevor es wirklich verwendet wird, aber ich vermute, Sie können einen Code wie diesen erstellen. Sie können auch Vererbung und Klassen für jede Stufe anstelle des von mir vorgeschlagenen Ansatzes verwenden. anders als diese denke ich, dass Sie ein Werkzeug selbst entwickeln müssen.

Ali1S232
quelle
2
Es ist ein echter Missbrauch des Compilers!
Ali1S232
3
Es ist interessant, aber es wäre ziemlich spröde und würde nur funktionieren, wenn ich eine Klasse pro Objekt / Ereignis / Abschnitt in meiner Geschichte hätte. Ich wollte eher datenbasiert vorgehen und aus XML oder so etwas lesen. Vielen Dank für Ihren Vorschlag.
DanDan
3
Es ist keine so gute Idee, eine Neukompilierung jedes Mal zu erzwingen, wenn sich eine Quest ändert, und dies würde auch keine Datenaktualisierungen für die Endbenutzer (z. B. DLC) ermöglichen, oder wenn sie von einem Server ausgeführt werden und Fixes anwenden, ohne Downloads zu erzwingen.
Patrick Hughes
2
Dieses Codebeispiel hat nichts mit dem Code zu tun, der veröffentlicht wird, und dieser Code macht eigentlich nichts. Es wird nur überprüft, ob Ihre Storyline und Ihre Quests gültig sind oder nicht. (Wenn dies nicht der Fall ist, erhalten Sie nur einen Kompilierungsfehler. Andernfalls können Sie diesen
Questbaum
Oh ich verstehe, ich habe falsch interpretiert. Ich vermute, dass eine Person mehr Zeit damit verbringen könnte, sicherzustellen, dass dieser Code die tatsächlichen Daten widerspiegelt, als beim Debuggen von Fehlern in der Questlogik gespeichert werden würde.
Patrick Hughes