Ответ Филиппа уже показывает правильное направление. Я просто думаю, что структура данных излишне многословна. Более короткие тексты было бы легче писать и читать.
Даже если более короткие тексты сделают алгоритм немного более сложным, это стоит сделать, потому что вы пишете алгоритм только один раз, но большая часть вашего времени будет потрачена на написание и поддержание истории. Поэтому оптимизируйте, чтобы упростить ту часть, на которую вы потратите больше всего времени.
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" }
];
Некоторые объяснения этого дизайна:
Вся история написана в одном массиве. Вам не нужно указывать числа, они предоставляются автоматически с помощью синтаксиса массива: первый элемент имеет индекс 0, следующий - индекс 1 и т. Д.
В большинстве случаев нет необходимости записывать номер следующего шага. Я предполагаю, что большинство строк текста не являются ветвями. Давайте сделаем «следующий шаг - следующий элемент» предположением по умолчанию и будем делать пометки только тогда, когда это не так.
Для прыжков используйте метки , а не цифры. Затем, если вы позже добавите или удалите несколько строк, логика истории будет сохранена, и вам не придется корректировать числа.
Найдите разумный компромисс между ясностью и краткостью. Например, я предлагаю написать «m» вместо «message», потому что это будет самая часто используемая команда из всех, поэтому ее сокращение сделает текст более разборчивым. Но нет необходимости сокращать оставшиеся ключевые слова. (Тем не менее, делайте, как хотите. Важно сделать его максимально разборчивым для вас . В качестве альтернативы вы могли бы поддерживать и «m», и «message» в качестве допустимых ключевых слов.)
Алгоритм игры должен быть примерно таким:
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
}
}
}
Кстати, эти идеи были вдохновлены Ren'Py , который не совсем то, что вы хотите (не JavaScript, не веб), но в любом случае может дать вам несколько интересных идей.