संवाद पेड़ कैसे काम करते हैं?


20

अर्थात्, जब उप-वार्तालाप समाप्त होता है, तो भाषण की पंक्तियों के बीच क्या और कैसे जुड़ा होता है?

यदि आपके पास C # में मूल डायलॉग ट्री का कोई उदाहरण है, तो कृपया उन्हें पोस्ट करें।


मुझे लगता है कि dialog-treeटैग होना बहुत अच्छा होगा ।
user1306322

कोड नमूने के लिए पूछना आमतौर पर कृपापूर्वक नहीं देखा जाता है।
MichaelHouse

अगर कुछ डायलॉग ट्री 101 कोड के नमूने हैं जो साझा करने लायक हैं, तो यह चोट नहीं पहुंचा सकता।
user1306322

समस्या यह है कि यह साइट प्रश्नों के सही उत्तर पाने के बारे में है। यह कोड नमूने एकत्र करने के लिए नहीं है।
MichaelHouse

इसलिए वाक्य "अगर" से शुरू होता है। लेकिन मैं जो पूछ रहा हूं वह इस बात पर स्पष्टीकरण है कि कैसे संवाद लाइनें एक दूसरे से इस तरह जुड़ती हैं कि कुशलता से कोड का अनुवाद किया जा सके। आखिरकार मैं इसे C # में लिखने जा रहा हूं।
user1306322

जवाबों:


24

"डायलॉग ट्री" नाम थोड़ा भ्रामक है - वे आमतौर पर सरल निर्देशित रेखांकन हैं , न कि केवल पेड़ । इस तरह के ग्राफ़ की मूल डेटा संरचना में आमतौर पर नोड्स के लिए कुछ प्रकार के "डेटा" होते हैं, जो बातचीत में हम उन बिंदुओं का प्रतिनिधित्व करते हैं, और उनसे दूसरे नोड्स के लिंक होते हैं, जो प्रतिभागियों द्वारा कही और की जा रही बातों का प्रतिनिधित्व करते हैं। और वैकल्पिक रूप से उन पर विभिन्न अतिरिक्त क्रियाओं को करने के लिए उनकी दृश्यता या स्क्रिप्ट को सीमित करने की शर्तें हैं। आमतौर पर नोड्स में से एक डिफ़ॉल्ट शुरुआती नोड है (इसके लिए विशिष्ट लेबल "रूट", "स्टार्ट" और "ग्रेटिंग") हैं, और नोड्स जिनके पास कोई वैध लिंक नहीं है जो बातचीत को समाप्त करते हैं।

ज्यादातर मामलों में, ग्राफ़ को Nodeडेटा संरचनाओं की सूची के रूप में मेमोरी में दर्शाया जाता है , प्रत्येक में कम से कम एक आईडी और 0.. Linkडेटा डेटा संरचनाओं की एक सूची होती है। सूची एनपीसी या एक वैश्विक एक के लिए स्थानीय हो सकती है; दूसरा मामला पसंद किया जाता है यदि आपके पास बहुत सारे जेनेरिक एनपीसी हैं जिनसे जानकारी के लिए बात की जा सकती है, लेकिन अपने आप ही कोई विशिष्ट बातचीत की पेशकश करें। यह प्रणाली स्वयं एनपीसी के लिए शुरुआती वार्तालाप नोड को ढूंढती है, अपनी आईडी को वर्तमान वार्तालाप आईडी के रूप में याद करती है, खिलाड़ी के लिए वर्तमान में मान्य लिंक प्रस्तुत करती है (या "अंतिम वार्तालाप]" यदि कोई वैध लिंक नहीं हैं) और प्रतीक्षा करता है इनपुट। जब खिलाड़ी एक लिंक चुनता है, तो संबंधित संवाद लाइनें प्रदर्शित हो जाती हैं और कोई भी संबद्ध स्क्रिप्ट चलती है।

लिंक पर जटिल नियम और शर्तें रखने के बजाय, आप इसके बजाय एक सरल "वैध" बूलियन चर के साथ प्राप्त कर सकते हैं, जिसे तब या तो अन्य वार्तालाप लिंक की स्क्रिप्ट से बदला जा सकता है (शुरुआती नोड से डिफ़ॉल्ट एक सहित) या बाहर से तंत्र। सामान्य तौर पर, यह दृष्टिकोण सरल है, लेकिन केवल बहुत कम ऐसे वार्तालापों वाले खेलों के लिए उपयुक्त है, क्योंकि यह "यह प्रतिक्रिया कब संभव है?" प्रतिक्रिया डेटा से ही दूर


ध्यान दें कि जो संरचना मैं यहाँ वर्णित करता हूँ, वह बाइट 56 से थोड़ी अलग है, जिसमें नोड्स को किसी भी संवाद लाइनों की आवश्यकता नहीं है; लिंक उन सभी को हो सकता है। सबसे बुनियादी संस्करण में, यह निम्नलिखित संरचना में अनुवाद करता है।

यहां छवि विवरण दर्ज करें


+1 लिंक पर नियमों और शर्तों का उल्लेख करने के लिए, एक साधारण निर्देशित ग्राफ अक्सर पर्याप्त नहीं होता है, और जब आप उन चीजों की आवश्यकता शुरू करते हैं तो चीजें जटिल हो सकती हैं।
लॉरेंट कौविदौ

+1 मुझे वह संरचना बेहतर लगती है। हालाँकि, मैं इसे पहले पास के रूप में नहीं सुझाऊँगा। मैं कुछ सरल के साथ शुरू करेंगे। यह निश्चित रूप से शूट करने के लिए एक बेहतर लक्ष्य है।
MichaelHouse

+1 बहुत विस्तृत उत्तर के लिए। यह मेरे लिए बाद में काम आ सकता है।
मार्टन

यह छवि मेरे लिए बहुत उपयोगी रही है, लेकिन मुझे आश्चर्य है कि डायलॉगलाइन लिंक से अलग क्यों है? क्या प्रत्येक लिंक का स्वयं का प्रतिक्रिया पाठ नहीं होगा? और एनपीसी का पाठ कहां जाएगा? यह नोड में यह करने के लिए कोई मतलब नहीं होगा?
काइल बरन

@ डेंजेन इस संरचना में, एक लिंक में कई डायलॉगलाइन हो सकते हैं, संभवतः विभिन्न पात्रों से, जब तक कि अगले संवाद विकल्प प्रकट न हो। यह वह जगह भी है जहां एनपीसी पाठ जाता है। जब लाइनें दोहराती हैं, तो अलग-अलग लिंक डायलॉगलाइन को साझा कर सकते हैं, संभवतः उन्हें उनकी सूची (वेक्टर) में पुन: व्यवस्थित कर रहे हैं, उनके हिस्सों को अलग-अलग लाइनों के साथ बदल रहे हैं, बीच में जोड़ते हैं और इसी तरह।
मार्टिन सोजका

16

डायलॉग ट्री एक निर्देशित ग्राफ संरचना के साथ बनाए जाते हैं ।

यहां छवि विवरण दर्ज करें

खिलाड़ी द्वारा किए गए संवाद निर्णयों के आधार पर ग्राफ का पता लगाया जाता है। उपयोगकर्ता को प्रदान किए गए संवाद विकल्प किनारों से आते हैं जो अन्य डायलॉग नोड्स के पथ को परिभाषित करते हैं।

निर्देशित रेखांकन एक बुनियादी डेटा संरचना है। उन्हें आसानी से लागू किया जा सकता है और आप संभवतः इसे स्वयं लागू करना चाहेंगे। चूंकि आप अपने संवाद की जरूरत के लिए ग्राफ को दर्जी बनाना चाहते हैं।

कुछ नोड्स को दिखाने के लिए विशेष शर्तों को पूरा करने की आवश्यकता हो सकती है। उदाहरण के लिए, खिलाड़ी को एक्स के ऊपर भाषण में एक कौशल की आवश्यकता होगी। या खिलाड़ी को संवाद की एक शाखा को आगे बढ़ाने से पहले मिशन जेड को पूरा करना होगा। या एनपीसी के साथ चर्चा करने से पहले उन्हें 4 बार कुछ पूछना होगा। ये सुविधाएँ आपके खेल के लिए कस्टम होंगी। लेकिन जब आप नोड और एज ट्रैवर्सल को लागू कर रहे हैं तो ध्यान देने योग्य हैं। बेशक यह हमेशा सबसे सरल रूप से शुरू करना और वहां से निर्माण करना सबसे अच्छा है।


मैं अभी इस तस्वीर में "न्यूटन-मुसीबत" जैसे मामलों में क्या करना है यह पता नहीं लगा सकता। जैसे उन पंक्तियों के क्रम को बिना दोहराए कोड में कैसे सेट करना है।
user1306322

आप अक्सर पाएंगे कि संवाद दोहराया जा सकता है। यह आमतौर पर बस किसी तरह से चिह्नित किया जाता है ताकि उपयोगकर्ता को पता हो कि वे पहले से ही उस संवाद पथ को चुनते हैं। आप अपने किनारों में एक झंडा लगा सकते हैं जो इंगित करता है कि क्या वे पहले चुने गए हैं। इसलिए यह आप पर निर्भर है कि उपयोगकर्ताओं को इसे फिर से चुनने के लिए अनुमति दें (स्वयं को ताज़ा करने के लिए) या इसे न दिखाएँ।
MichaelHouse

1
यह आम तौर पर कोड की लाइनों के आदेश के साथ नहीं किया जाएगा, लेकिन डेटा संरचना में संदर्भों के माध्यम से।
काइलोटन

7

मैंने एक साधारण संवाद प्रणाली बनाई है: http://iki.fi/sol/d3/ "इंजन" स्वयं वर्तमान में सादा है, लेकिन संपादक द्वारा तैयार किया गया डेटा किसी भी भाषा में उपयोग करने के लिए बहुत सरल है। उपकरण XML, JSON और एक कस्टम बाइनरी प्रारूप को आउटपुट करता है।

मुख्य अवधारणा बहुत सरल है:

आप एक जैसे छोटे से मार्ग से जा रहे हैं, सभी समान हैं

प्रत्येक नोड (जिसे मैं "कार्ड" कहता हूं, जैसा कि संवाद के उपरोक्त एनालॉग के साथ) में प्रश्न पाठ और शून्य या अधिक उत्तर शामिल हैं। प्रत्येक उत्तर दूसरे कार्ड की ओर जाता है।

एक टैग सिस्टम भी है जहां उपयोगकर्ता को कुछ उत्तर केवल तभी दिखाए जाते हैं जब कोई टैग सेट होता है (या टैग सेट नहीं होता है)। एक कार्ड सेट (या अनिश्चित) निर्दिष्ट टैग दर्ज करना।

यह एक खेल में किसी भी तरह के संवाद के बारे में बहुत कुछ करने की जरूरत है। "प्रश्न पाठ" सादा पाठ हो सकता है, या यह एनीमेशन या व्हाट्सएप चलाने के लिए एक स्क्रिप्ट हो सकता है।


4

आप संवाद प्रणाली को मॉडल करने के लिए ट्रीशर्प और व्यवहार पेड़ों का उपयोग कर सकते हैं। ट्रीशर्प एक पुस्तकालय है जो एक सरल व्यवहार ट्री कार्यान्वयन प्रदान करता है। वाह के लिए IA बॉट इस के साथ किया जाता है, इसलिए यह परिपक्व है ... :)

मेरे कार्यान्वयन में नोड्स हैं जो उत्तर के बीच चयन करते हैं, और प्रत्येक उत्तर को डायलॉग या एक्शन, या क्रियाओं के अनुक्रम, या एक नोड में शामिल किया जा सकता है, जो दूसरे डायलॉग को जाने देता है ... या जो आप चाहते हैं ...

मैंने इसे दृष्टिगोचर बनाने के लिए ब्रेनियाक एडिटर का उपयोग किया है ... लेकिन अंत में यह सी # ट्रीशर्प पर आधारित कोड का उत्पादन करता है ...

http://www.youtube.com/watch?v=6uGg6bUYyUU


2

आप एक निर्देशित (संभवतः चक्रीय) ग्राफ चाहते हैं।

आप नोड्स को ऑब्जेक्ट के रूप में मॉडल करेंगे, और ग्राफ़ के नोड में सभी आउटगोइंग तीर को अलग ऑब्जेक्ट के रूप में भी मॉडल किया जाएगा। नोड में आउटगोइंग एरो की सूची होती है, और प्रत्येक "एरो" ऑब्जेक्ट में एक टेक्स्ट होता है जो डेस्टिनेशन को दर्शाता है। निश्चित नहीं है, लेकिन मुझे लगता है कि C # ऑब्जेक्ट्स को हमेशा संदर्भित किया जाता है, इसलिए आप केवल ऑब्जेक्ट पहले बनाते हैं, और फिर जब आप एरो ऑब्जेक्ट बनाते हैं, तो उसी ऑब्जेक्ट को दो एरो डेस्टिनेशन फील्ड में प्लग करते हैं। (C ++ में आप एक संदर्भ या सूचक प्रकार, नोड और या नोड * का उपयोग करेंगे)

डिस्क से इस तरह की चीजों को लोड करने के लिए, आमतौर पर प्रत्येक नोड को एक अद्वितीय आईडी नंबर दिया जाता है, फिर सभी नोड्स को एक सरणी में लोड करता है जहां सूचकांक उस अद्वितीय संख्या है। फिर संख्या लिखकर तीरों को क्रमबद्ध किया जाता है, वास्तविक वस्तु को बाहर नहीं।

जब आप एक तीर लोड करते हैं, तो आप उस नोड के संदर्भ के लिए सरणी और आईडी का उपयोग करते हैं जो इसे इंगित करता है। यदि आपने दो बार ऑब्जेक्ट को लिखा है, तो आपको दो अलग-अलग ऑब्जेक्ट मिलेंगे, जो कि समान दिखते हैं, जो संभवत: वह नहीं है जो आप चाहते थे।

एक संवाद वृक्ष का प्रसंस्करण बहुत सरल हो जाता है। आप बस रूट नोड को एक currentNodeचर में डालते हैं , पूरी चीज को किसी तरह प्रदर्शित करते हैं, फिर जब एक विकल्प बनाया जाता है, rootNodeतो तीर के गंतव्य पर सेट करें। छद्मकोश में:

Node&    currentNode = dialogTree.node[0];
while( currentNode != END_CONVERSATION_PSEUDO_NODE )
{
    stage.displayNode( currentNode );
    currentNode = stage.waitForUserToChoose();
}

1

मुझे हाल ही में नोड का उपयोग करके ऐसा कुछ विकसित करना पड़ा, और बातचीत नोड्स के एक निर्देशित ग्राफ का प्रतिनिधित्व करने के लिए एक बहुत ही मूल पाठ फ़ाइल संरचना का विकल्प चुना।

आप परिणामस्वरूप कोड और पाठ प्रारूप देख सकते हैं:

https://github.com/scottbw/dialoguejs

यह परिस्थितियों (ईवेंट ट्रिगर्स) (अभी तक) का समर्थन नहीं करता है, लेकिन संभवत: यह बहुत सरल है कि कई गेम देवों के लिए शुरू करें।

(GPL, btw में ही कोड)


प्रश्न C # के लिए पूछता है।
सेठ बैटन

D'oh - इस बारे में क्षमा करें।
स्कॉट विल्सन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.