Odpowiedź Filipa już pokazuje właściwy kierunek. Myślę, że struktura danych jest niepotrzebnie pełna. Krótsze teksty łatwiej byłoby pisać i czytać.
Nawet jeśli krótsze teksty uczynią algorytm nieco bardziej złożonym, warto to zrobić, ponieważ algorytm pisze się tylko raz, ale większość czasu poświęcisz na napisanie i utrzymanie historii. Dlatego zoptymalizuj, aby ułatwić wykonanie części, którą poświęcisz najwięcej czasu.
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" }
];
Kilka wyjaśnień dla tego projektu:
Cała historia jest napisana w jednym szyku. Nie musisz podawać liczb, są one dostarczane automatycznie przez składnię tablicy: pierwszy element ma indeks 0, następny ma indeks 1 itd.
W większości przypadków nie jest konieczne wpisanie numeru następnego kroku. Zakładam, że większość wierszy tekstu nie jest gałęziami. Uczyńmy „następnym krokiem jest następujący element” domyślne założenie i robimy notatki tylko wtedy, gdy jest inaczej.
Do skoków używaj etykiet , a nie liczb. Następnie, jeśli później dodasz lub usuniesz kilka wierszy, logika historii zostanie zachowana i nie będziesz musiał dostosowywać liczb.
Znajdź rozsądny kompromis między jasnością a skrótem. Na przykład proponuję napisać „m” zamiast „wiadomość”, ponieważ będzie to najczęściej używane polecenie w historii, więc skrócenie go spowoduje, że tekst będzie bardziej czytelny. Ale nie ma potrzeby skracania pozostałych słów kluczowych. (Rób jednak, co chcesz. Ważne, aby było to dla Ciebie najbardziej czytelne . Alternatywnie możesz podać zarówno „m”, jak i „wiadomość” jako prawidłowe słowa kluczowe.)
Algorytm gry powinien wyglądać mniej więcej tak:
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
}
}
}
Nawiasem mówiąc, te pomysły zostały zainspirowane przez Ren'Py , który nie jest dokładnie tym, czego chcesz (nie JavaScript, nie internet), ale i tak może dać ci fajne pomysły.