Jawaban Philipp sudah menunjukkan arah yang benar. Saya hanya berpikir struktur data tidak perlu bertele-tele. Teks yang lebih pendek akan lebih mudah untuk ditulis dan dibaca.
Sekalipun teks yang lebih pendek akan membuat algoritme sedikit lebih rumit, itu layak dilakukan, karena Anda hanya menulis algoritme satu kali, tetapi sebagian besar waktu Anda akan dihabiskan untuk menulis dan memelihara cerita. Karena itu optimalkan untuk mempermudah bagian yang paling Anda habiskan.
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" }
];
Beberapa penjelasan untuk desain ini:
Seluruh cerita ditulis dalam satu larik. Anda tidak harus memberikan angka, angka itu diberikan secara otomatis oleh sintaks array: item pertama memiliki indeks 0, item berikutnya memiliki indeks 1, dll.
Dalam kebanyakan kasus, tidak perlu menulis nomor langkah berikut. Saya berasumsi bahwa sebagian besar baris teks bukan cabang. Mari kita membuat "langkah selanjutnya adalah item berikut" sebagai asumsi default, dan hanya membuat catatan ketika sebaliknya.
Untuk lompatan, gunakan label , bukan angka. Kemudian, jika nanti Anda menambahkan atau menghapus beberapa baris, logika cerita akan dipertahankan, dan Anda tidak harus menyesuaikan angka.
Temukan kompromi yang masuk akal antara kejelasan dan kekurangan. Sebagai contoh, saya menyarankan untuk menulis "m" daripada "message", karena itu akan menjadi perintah yang paling sering digunakan, jadi membuatnya singkat akan membuat teks lebih terbaca. Tetapi tidak perlu mempersingkat kata kunci yang tersisa. (Namun, lakukan seperti yang Anda inginkan. Yang penting adalah membuatnya menjadi terbaca untuk Anda . Atau, Anda dapat mendukung "m" dan "pesan" sebagai kata kunci yang valid.)
Algoritma untuk gim harus seperti ini:
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
}
}
}
Ngomong-ngomong, ide-ide ini terinspirasi oleh Ren'Py , yang tidak persis seperti yang Anda inginkan (bukan JavaScript, bukan web), tetapi tetap dapat memberi Anda beberapa ide keren.