La réponse de Philipp montre déjà la bonne direction. Je pense simplement que la structure des données est inutilement verbeuse. Des textes plus courts seraient plus faciles à écrire et à lire.
Même si des textes plus courts rendraient l'algorithme un peu plus complexe, cela vaut la peine, car vous n'écrivez l'algorithme qu'une seule fois, mais la plupart de votre temps sera consacré à l'écriture et à la maintenance de l'histoire. Par conséquent, optimisez pour faciliter la partie que vous passerez le plus de temps à faire.
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" }
];
Quelques explications pour cette conception:
L'histoire entière est écrite dans un tableau. Vous n'avez pas à fournir de nombres, ils sont fournis automatiquement par la syntaxe du tableau: le premier élément a l'index 0, le suivant a l'index 1, etc.
Dans la plupart des cas, il n'est pas nécessaire d'écrire le numéro de l'étape suivante. Je suppose que la plupart des lignes de texte ne sont pas des branches. Faisons "l'étape suivante est l'élément suivant" une hypothèse par défaut, et ne prenons des notes que dans le cas contraire.
Pour les sauts, utilisez des étiquettes , pas des chiffres. Ensuite, si vous ajoutez ou supprimez plus tard quelques lignes, la logique de l'histoire sera préservée et vous n'aurez pas à ajuster les nombres.
Trouvez un compromis raisonnable entre clarté et brièveté. Par exemple, je suggère d'écrire "m" au lieu de "message", car ce sera la commande la plus fréquemment utilisée, donc la rendre courte rendra le texte plus lisible. Mais il n'est pas nécessaire de raccourcir les mots clés restants. (Cependant, faites comme vous le souhaitez. L'important est de le rendre plus lisible pour vous . Alternativement, vous pouvez prendre en charge "m" et "message" comme mots clés valides.)
L'algorithme du jeu devrait ressembler à ceci:
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
}
}
}
Soit dit en passant, ces idées ont été inspirées par Ren'Py , qui n'est pas exactement ce que vous voulez (ni JavaScript, ni Web), mais pourrait vous donner quand même quelques idées intéressantes.