La risposta di Philipp mostra già la giusta direzione. Penso solo che la struttura dei dati sia inutilmente dettagliata. Testi più brevi sarebbero più facili da scrivere e leggere.
Anche se testi più brevi renderebbero l'algoritmo un po 'più complesso, vale la pena farlo, perché scrivi l'algoritmo solo una volta, ma la maggior parte del tuo tempo sarà speso a scrivere e mantenere la storia. Pertanto ottimizza per rendere più semplice la parte che trascorrerai più tempo a fare.
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" }
];
Alcune spiegazioni per questo disegno:
L'intera storia è scritta in una matrice. Non è necessario fornire numeri, sono forniti automaticamente dalla sintassi dell'array: il primo elemento ha indice 0, il successivo ha indice 1, ecc.
Nella maggior parte dei casi, non è necessario scrivere il numero del passaggio seguente. Presumo che la maggior parte delle righe di testo non siano rami. Facciamo che "il passaggio successivo sia l'elemento seguente" un presupposto predefinito e prendiamo appunti solo quando è diversamente.
Per i salti, utilizzare le etichette , non i numeri. Quindi, se successivamente aggiungi o rimuovi alcune righe, la logica della trama verrà preservata e non dovrai modificare i numeri.
Trova un ragionevole compromesso tra chiarezza e brevità. Ad esempio, suggerisco di scrivere "m" invece di "messaggio", perché sarà il comando più usato di sempre, quindi accorciandolo renderà il testo più leggibile. Ma non è necessario abbreviare le parole chiave rimanenti. (Tuttavia, fai come desideri. L'importante è renderlo più leggibile per te . In alternativa, potresti supportare sia "m" che "messaggio" come parole chiave valide.)
L'algoritmo per il gioco dovrebbe essere qualcosa del genere:
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
}
}
}
A proposito, queste idee sono state ispirate da Ren'Py , che non è esattamente quello che vuoi (non JavaScript, non web), ma potrebbe darti comunque delle idee interessanti.