Philipps Antwort zeigt bereits die richtige Richtung. Ich denke nur, dass die Datenstruktur unnötig ausführlich ist. Kürzere Texte wären leichter zu schreiben und zu lesen.
Selbst wenn kürzere Texte den Algorithmus etwas komplexer machen würden, lohnt es sich, dies zu tun, da Sie den Algorithmus nur einmal schreiben, aber die meiste Zeit damit verbringen, die Geschichte zu schreiben und zu pflegen. Optimieren Sie daher, um den Teil zu vereinfachen, für den Sie die meiste Zeit aufwenden.
var story = [
{ m: "Hi!" },
{ m: "This is my new game." },
{ question: "Do you like it?", answers: [
{ m: "yes", next: "like_yes" },
{ m: "no", next: "like_no" },
] },
{ label: "like_yes", m: "I am happy you like my game!", next: "like_end" },
{ label: "like_no", m: "You made me sad!", next: "like_end" },
{ label: "like_end" },
{ m: "OK, let's change the topic" }
];
Einige Erklärungen für dieses Design:
Die ganze Geschichte ist in einem Array geschrieben. Sie müssen keine Zahlen angeben, diese werden automatisch von der Array-Syntax bereitgestellt: Das erste Element hat den Index 0, das nächste den Index 1 usw.
In den meisten Fällen ist es nicht erforderlich, die Nummer des folgenden Schritts zu schreiben. Ich gehe davon aus, dass die meisten Textzeilen keine Zweige sind. Machen wir "Der nächste Schritt ist das folgende Element" zu einer Standardannahme und machen wir uns nur Notizen, wenn dies nicht der Fall ist.
Verwenden Sie für Sprünge Beschriftungen , keine Zahlen. Wenn Sie später einige Zeilen hinzufügen oder entfernen, bleibt die Logik der Geschichte erhalten, und Sie müssen die Zahlen nicht anpassen.
Finden Sie einen vernünftigen Kompromiss zwischen Klarheit und Kürze. Zum Beispiel schlage ich vor, "m" anstelle von "message" zu schreiben, da dies der am häufigsten verwendete Befehl aller Zeiten ist. Wenn Sie ihn also kurz machen, wird der Text besser lesbar. Die verbleibenden Schlüsselwörter müssen jedoch nicht gekürzt werden. (Tun Sie jedoch, was Sie möchten. Wichtig ist, dass es für Sie am besten lesbar ist . Alternativ können Sie sowohl "m" als auch "message" als gültige Schlüsselwörter unterstützen.)
Der Algorithmus für das Spiel sollte ungefähr so aussehen:
function execute_game() {
var current_line = 0;
while (current_line < story.length) {
var current_step = story[current_line];
if (undefined !== current_step.m) {
display_message(current_step.m);
if (undefined !== current_step.next) {
current_line = find_label(current_step.next);
} else {
current_line = current_line + 1;
}
} else if (undefined !== current_step.question) {
// display the question: current_step.question
// display the answers: current_step.answers
// choose an answer
// and change current_line accordingly
}
}
}
Diese Ideen wurden übrigens von Ren'Py inspiriert , was nicht genau das ist, was Sie wollen (nicht JavaScript, nicht Web), aber Ihnen trotzdem einige coole Ideen geben könnte.