คำตอบของฟิลิปป์แสดงให้เห็นทิศทางที่ถูกต้องแล้ว ฉันแค่คิดว่าโครงสร้างข้อมูลนั้นไม่มีความจำเป็น ข้อความสั้นจะง่ายต่อการเขียนและอ่าน
แม้ว่าข้อความสั้น ๆ จะทำให้อัลกอริทึมมีความซับซ้อนมากขึ้น แต่นั่นก็คุ้มค่าที่จะทำเพราะคุณเขียนอัลกอริธึมเพียงครั้งเดียว แต่เวลาส่วนใหญ่ของคุณจะใช้ในการเขียนและบำรุงรักษาเรื่องราว ดังนั้นปรับให้เหมาะสมสำหรับการทำส่วนที่ง่ายขึ้นคุณจะใช้เวลาทำ
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" และ "ข้อความ" เป็นคำหลักที่ถูกต้อง)
อัลกอริทึมสำหรับเกมควรเป็นดังนี้:
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 ไม่ใช่เว็บ) แต่สามารถให้ความคิดดีๆแก่คุณได้