फिलिप का जवाब पहले से ही सही दिशा दिखाता है। मुझे लगता है कि डेटा संरचना अनावश्यक रूप से क्रिया है। छोटे ग्रंथों को लिखना और पढ़ना आसान होगा।
भले ही छोटे पाठ एल्गोरिथ्म को थोड़ा अधिक जटिल बना देंगे, लेकिन यह करने योग्य है, क्योंकि आप केवल एक बार एल्गोरिथ्म लिखते हैं, लेकिन आपका अधिकांश समय कहानी लिखने और बनाए रखने में व्यतीत होगा। इसलिए आसान बनाने के लिए ऑप्टिमाइज़ करें वह हिस्सा जिसे आप सबसे अधिक समय बिताएंगे।
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" लिखने का सुझाव देता हूं, क्योंकि यह अब तक का सबसे अधिक इस्तेमाल किया जाने वाला कमांड होगा, इसलिए इसे छोटा करने से पाठ अधिक सुपाठ्य हो जाएगा। लेकिन शेष खोजशब्दों को छोटा करने की कोई आवश्यकता नहीं है। (हालांकि, आप अपनी इच्छानुसार काम करें। महत्वपूर्ण बात यह है कि यह आपके लिए सबसे अधिक उपयोगी है । वैकल्पिक रूप से, आप "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 से प्रेरित थे , जो कि वास्तव में आप क्या चाहते हैं (जावास्क्रिप्ट नहीं, वेब नहीं), लेकिन आप वैसे भी कुछ शांत विचार दे सकते हैं।