Philipp'in cevabı zaten doğru yönü gösteriyor. Sadece veri yapısının gereksiz yere ayrıntılı olduğunu düşünüyorum. Daha kısa metinlerin yazılması ve okunması daha kolay olacaktır.
Kısa metinler algoritmayı biraz daha karmaşık hale getirse bile, bu yapmaya değer, çünkü algoritmayı sadece bir kez yazıyorsunuz, ancak zamanınızın çoğu hikayeyi yazmaya ve sürdürmeye harcanacak. Bu nedenle, en çok zaman harcadığınız kısmı kolaylaştırmak için optimize edin.
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" }
];
Bu tasarım için bazı açıklamalar:
Hikayenin tamamı bir dizide yazılmıştır. Sayı sağlamanız gerekmez, bunlar otomatik olarak dizi sözdizimi tarafından sağlanır: ilk öğenin dizini 0, diğerinin dizini 1 vb.
Çoğu durumda, aşağıdaki adımın numarasını yazmak gerekli değildir. Metin satırlarının çoğunun dal olmadığını varsayıyorum . "Sonraki adım aşağıdaki öğedir" varsayılan varsayımını yapalım ve yalnızca aksi durumda notlar alalım.
Atlamalar için sayı değil etiket kullanın . Daha sonra, birkaç satır ekler veya kaldırırsanız, hikayenin mantığı korunur ve sayıları ayarlamanız gerekmez.
Netlik ve kısalık arasında makul bir uzlaşma bulun. Örneğin, "mesaj" yerine "m" yazmanızı öneririm, çünkü bu şimdiye kadarki en sık kullanılan komut olacaktır, bu yüzden kısa yapmak metni daha okunaklı hale getirecektir. Ancak, geri kalan anahtar kelimeleri kısaltmaya gerek yoktur. (Ancak, istediğiniz gibi yapın. Önemli olan , sizin için en okunaklı hale getirmektir . Alternatif olarak, geçerli anahtar kelimeler olarak "m" ve "ileti" yi de destekleyebilirsiniz.)
Oyunun algoritması şöyle olmalıdır:
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
}
}
}
Bu arada, bu fikirler Ren'Py'den ilham aldı , bu tam olarak istediğiniz şey değil (JavaScript değil, web değil), ancak yine de size harika fikirler verebilir.