Wie verhindere ich in einem textbasierten Adventure-Spiel lange verwirrenden bedingten Code?

9

Ich erstelle eine Text-basierte, wählen Sie Ihr eigenes Abenteuerspiel in C ++.

In diesem Spiel wird es viele Möglichkeiten geben, wohin du gehen willst, was du tun willst usw.

Meine Frage ist, wie ich verhindern kann, dass dies extrem verwirrend wird.

Beispiel:

Sagen wir mal, an einem Punkt im Spiel kann man gefragt werden, ob man in den Wald oder in die Wüste gehen soll. Wenn du Wüste auswählst, ist das eine komplett andere Geschichte aus dem Wald.

Wie würde ich verhindern, dass mein Code so aussieht?

%Vor%

Innerhalb dieser Handlungsstränge würde es mehr Konditionalitäten wie diese und ausgefeiltere Handlungsstränge geben, also gibt es eine Möglichkeit, den Code für eine Handlungsstränge in einer separaten Datei zu schreiben, dann führe einfach diese Datei für diese Bedingung aus ? Wie auch immer, ich kann das separat machen, anstatt alles innerhalb der Bedingungen zu schreiben? Wenn ich das täte, würde der Code schnell lang und verwirrend sein, um zu sehen / zu bearbeiten.

Ich habe darüber nachgedacht, Header zu schreiben und Funktionen in den Headern zu erstellen, die die Storyline ausschreiben, also müsste ich nur die Funktion eingeben, aber wenn ich das täte, könnte ich nicht auf die globalen Variablen im Spiel zugreifen wie playerName oder playerRace usw.

Alle Vorschläge werden geschätzt. Ich bin neu in C ++, also bitte vergib mir, wenn ich etwas Mühsames übersehen habe.

    
Alice The Hatter 24.09.2016, 18:56
quelle

4 Antworten

1

Wahrscheinlich eine klassenbasierte Lösung. Die Frage ist breit, also nicht ganz sicher, welche Designmuster passen würden. Eine Beispielklasse kann jedoch CrossroadsDesicision sein, die Optionen ["Go to desert", "Go to city", ...] exportiert und eine Methode apply hat, die Optionen vom Array erhalten und die relevante Entscheidungsklasse für den nächsten Schritt zurückgeben soll

Bearbeiten: Die Basisklasse sollte enthalten:

  • possibleDecisions - ein Array von möglichen Entscheidungen (Sie könnten hier eine Optionsklasse verwenden, die aus einem Namen (String oder enum - Sie sollten hier Templating verwenden) und einer Beschreibung)

  • besteht
  • anwenden - eine Funktion, die eine Entscheidung erhält, die darauf reagiert und die nächste Entscheidung zurückgibt

eavidan 24.09.2016, 18:59
quelle
2

Ich werde ein wenig auf Trevor Hickey Zustandsmaschine Vorschlag erweitern, weil es eine großartige Idee ist.

Zuerst müssen Sie erkennen, dass Ihre Handlungsstränge mit einem guten alten Graphen modelliert werden können.

  1. Die unabhängigen Geschichten sind das Element Ihres Spiels, das Sie als Ganzes und nicht dissoziierbar betrachten. Zum Beispiel gibt es die DesertStory, die ForestStory. Sie sind die Knoten, Vertices. Sie sollten eine Geschichte eindeutig identifizieren, zum Beispiel durch den Namen
  2. Die Beziehung zwischen den Geschichten sind die Kanten. Diese Kanten müssen serialisierbar sein, was bedeutet, dass sie sowohl als Objekte als auch in einem dauerhaften Format dargestellt werden können und zwischen denen geladen und gespeichert werden kann. Da Sie Ihr Spiel anpassen möchten, möchten Sie vielleicht zulassen, dass das persistente Format textbasiert ist, damit sie zu Beginn des Spiels manuell bearbeitet und geladen werden können.
  3. Jetzt kommt die Zustandsmaschine von der Tatsache, dass der Übergang zwischen einer Geschichte zu einer anderen bedingt ist.

In der Programmiersprache bedeutet das: eine virtuelle Story-Klasse

%Vor%

Ein Story Arc, der eine Verbindung zwischen Geschichten herstellt. Es muss eine Bedingung ausgelöst werden, die die letzte Geschichte zurückgeben kann

%Vor%

Mit diesem können Sie einzelne Geschichten auf einer Seite schreiben und dann Storybögen separat schreiben. Sie können die Logik Ihres Spiels auch anpassen und modifizieren, indem Sie die Handlungsbögen modifizieren. Sie können mehrere Spiele spielen, wobei jede nur eine Gruppe von StoryConnections ist.

Die Logik wird einfach sein als:

%Vor%     
UmNyobe 24.09.2016 22:46
quelle
1

Sie müssen Ihren Code strukturieren. Sie haben also eine Klasse Player, eine Klasse Place, dann brauchen Sie ein Array, um die Orte zu speichern, was auch immer an diesem Ort passiert, wird von einer virtuellen Funktion behandelt:

BEARBEITEN:

Ich habe den Code geändert, um auf die Ziele zu achten, Sie benötigen nur eine andere Klasse, wenn Sie die Ziele in einer Liste zum einfachen Hinzufügen / Entfernen pflegen möchten:

%Vor%

kompilieren mit:

%Vor%     
Dominique Lorre 24.09.2016 19:59
quelle
0

Sie könnten enum und switch verwenden:

%Vor%

Sie können auch alles in Klassen oder Funktionen einschließen und ihre Adressen in player object speichern, so dass Sie nicht einmal überprüfen müssen, in welchem ​​Zustand player ist, Sie würden einfach schreiben:

%Vor%

Aber gutes Spieldesign zu wählen ist ein komplexes Thema, das nicht als "einfache Antwort" gedacht ist.

    
xinaiz 24.09.2016 19:16
quelle

Tags und Links