डियाब्लो / वाह-शैली की प्रतिभा के पेड़ के लिए मुझे किस डेटा संरचना का उपयोग करना चाहिए?


23

मैं एक ऑनलाइन आरपीजी के लिए एक प्रतिभा-ट्री प्रणाली को लागू करने पर विचार कर रहा हूं, जो कि विश्व में Warcraft के रूप में देखा जाता है, जहां एक कौशल प्राप्त करने से यह पेड़ के नीचे अगले "टियर" को अनलॉक करता है।

क्या किसी को डेटाबेस / कोड में इस संरचनात्मक रूप से लागू करने का सबसे अच्छा तरीका पता है?

जवाबों:


13

एक डेटाबेस में एक पेड़ का प्रतिनिधित्व करने के लिए इस तरह की संरचना का उपयोग करें:

#Talent
id  parent  description
1   0       Tackle
2   1       Kick
3   1       Punch
4   3       Fire Punch

और प्रति उपयोगकर्ता अर्जित प्रतिभाओं का प्रतिनिधित्व करने के लिए एक और तालिका

#UserTalent
id  user  talent
1   4     1
2   4     3
3   4     4

आप पूरी प्रतिभा तालिका को क्वेरी करके, और लिंक किए गए ट्री का निर्माण करके प्रतिभा निर्भरता के लिए कार्यक्रम की जाँच कर सकते हैं। आप SQL के साथ भी ऐसा कर सकते हैं, लेकिन इसके लिए पुनरावर्ती सबसिलेक्ट या बहुत सारे प्रश्नों की आवश्यकता होगी। बेहतर है इसे अपने कोड में करें।

यदि कई निर्भरताएं हैं, उदाहरण के लिए निर्भरता ग्राफ का प्रतिनिधित्व करने के लिए दो तालिकाओं Fire Punchपर निर्भर करता है Punchऔर Immolationउपयोग करता है :

#Talent
id  description
1   Tackle
2   Kick
3   Punch
4   Fire Punch
5   Immolation

#Depedency
id  parent  child
1   0       1
2   0       5
3   1       2
4   1       3
5   3       4
6   5       4

आपकी UserTalentतालिका में किसी ऑटोकै कॉलम की जरूरत नहीं है। userऔर talentकेवल दो कॉलम और एक संयुक्त कुंजी हो सकती है: वे कभी भी डुप्लिकेट नहीं होंगे और आप कभी idभी क्वेरी नहीं करेंगे ।
doppelgreener 14

मैं एक डेटाबेस डिज़ाइनर नहीं हूं और मुझे इस पर किसी की बात सुनने में दिलचस्पी होगी: यदि हर प्रतिभा का एक अनूठा नाम था, तो क्या आप इस तालिका डिजाइन में हर दूसरे संख्यात्मक आईडी फ़ील्ड के साथ दूर नहीं कर सकते हैं, और कुंजी के रूप में नामों का उपयोग कर सकते हैं (साथ में) किसी भी संपादन कैस्केड)? क्या ऐसा करने में कोई महत्वपूर्ण लागत या लाभ होगा?
doppelgreener

3
@ जोनाथन हॉब्स: डिलीट / अपडेट ऑपरेशंस के लिए एक ऑटोनॉरेमेंट प्राइमरी आईडी हमेशा अच्छा होता है। यह कभी धीमा नहीं होता लेकिन अक्सर तेज होता है। इसके अलावा पंक्ति आकार यहाँ चिंता का विषय नहीं है। अद्वितीय प्रतिभा नामों के मामले में भी यही सच है। अच्छे प्रदर्शन के लिए आप केवल अनन्य पूर्णांक पर अपनी तालिका में शामिल होना चाहते हैं। En.wikipedia.org/wiki/Database_normalization इत्यादि देखें
जोनास Bötel

धन्यवाद। एक डीबी डिजाइनर, जो मुझे पता था कि एक बार कहा गया था कि ऑटोकाइज़ बुराई थे और इससे बचा जाना चाहिए, लेकिन मैं कभी भी स्पष्ट नहीं हूं कि यह मामला है या क्यों। मुझे लगता है यह नहीं है।
doppelgreener

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

5

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

class Talent {
    std::vector<Talent*> children;
    bool earned;
};

यह निर्धारित करने के लिए कि एक खिलाड़ी में कौन सी प्रतिभा है, आप मूल प्रतिभा को लेते हैं और ग्राफ को नीचे तक चलते हैं जब तक कि आप उन प्रतिभाओं तक नहीं पहुंच जाते जहां अर्जित गलत है। इससे यह भी पता चलेगा कि कौन सी प्रतिभाएँ प्राप्त करने के लिए उपलब्ध हैं: प्रत्येक शाखा में पहली प्रतिभा जड़ प्रतिभा से नीचे है जहाँ अर्जित झूठी है।


आपको एक देशी सरणी और एक आकार के लिए एक संकेतक मिला है? फेल- एक सेल्फ-स्विंग सेल्फ-साइजिंग पॉइंटर का उपयोग करें।
डेडएमजी

वूप्स ... C / C ++ मिक्सअप और एक त्रुटि। मैंने अपना उत्तर अपडेट कर दिया है। सर उठाने के लिए धन्यवाद।
भूत

@DeadMG: 'सेल्फ-सेल्फिंग सेल्फ-सिजिंग' से आपका क्या तात्पर्य है? क्या आप ऊपर दिए गए वेक्टर की तरह कुछ का जिक्र कर रहे हैं, या आप कुछ और सोच रहे थे?
काइलोटन

एक बूस्ट और ptr_vectorभी बेहतर हो सकता है।
ज़ैन लिंक्स

5
पेड़ की संरचना पूरी तरह से अलग होनी चाहिए कि क्या खिलाड़ी ने इसे अर्जित किया है, पूर्व डिजाइनरों द्वारा बनाया गया स्थिर डेटा है और बाद वाला प्रति गेम या डीबी में संग्रहीत प्रति खिलाड़ी डेटा है।

1

अपने खेल में मैं इसे इस तरह से करता हूँ:

डेटाबेस:

reference_talent : एक विशिष्ट आईडी, नाम, प्रभाव आदि शामिल है

प्रतिभा : आईडी, खिलाड़ी <- सभी प्रतिभा खिलाड़ियों को "सीखा" है।

इनगेम: (सर्वर पर)

मैं सभी संदर्भ_ उपादानों को एक 'स्थिर' (केवल पढ़ने के लिए) std :: मानचित्र पर लोड करता हूं ताकि मैं उनकी आईडी द्वारा आसानी से उन तक पहुंच सकूं।

जब एक ग्राहक एक खिलाड़ी की जाँच करता है, तो मुझे डेटाबेस से सभी प्रतिभाएँ मिलती हैं और उन्हें एक std :: वेक्टर में स्टॉक करता है ताकि जब मुझे विशेषताओं आदि की गणना करने की आवश्यकता हो, तो मुझे उनके पास RAM में होना चाहिए। मैं क्लाइंट को टैलेंट भी भेज देता हूं।

यह इसके बारे में है (पाठ्यक्रम की नई प्रतिभाओं को बचाने के अलावा, जो तालिका में सिर्फ एक 'INSERT' है 'प्रतिभा' + ग्राहक को एक संदेश)।


0

संबंधपरक दृष्टिकोण

आप इसे अनलॉकर्स के बीच संबंध के रूप में वर्णित करते हैं और इस ट्यूटोरियल में समान अनलॉक किए जाते हैं । मेरा सुझाव है कि संबंधपरक बीजगणित और डेटाबेस के बारे में अधिक जानें। वे कैसे डेटा मॉडल करने के लिए अच्छा तरीका है। यदि आप डेटाबेस से जानकारी की क्वेरी करना सीखते हैं, तो आप डेटा को आसानी से मॉडल कर सकते हैं।

मुझे नहीं पता कि आप मॉडलिंग संबंधों के बारे में कितना जानते हैं। उस ट्यूटोरियल को आपकी सहायता करनी चाहिए।

एक हल

मुझे लगता है कि वाह वास्तविकता (ईएचएम) के रूप में काम करते हैं, कि यह है

  • प्रतिभा कई (अन्य) प्रतिभाओं को अनलॉक करती है
  • प्रतिभा कई (अन्य) प्रतिभाओं द्वारा अनलॉक की जाती है।

यह N: N संबंध है, जिसका तात्पर्य है कि आपको "मध्यम पुरुष" की दो प्रतिभाओं के बीच एक नया संबंध चाहिए:

(talent who unlocks id, talent who is unlocked)

इस तरह आपके पास प्रतिभा ए अनलॉकिंग बी, सी और डी (ए, बी), (ए, सी), (ए, डी) और प्रतिभा वाई द्वारा एक्स, जेड और डब्ल्यू (एक्स, वाई), ( जेड, वाई), (डब्ल्यू, वाई))। अनिवार्य / प्रक्रियात्मक / वस्तु-उन्मुख भाषा में, आप इसे वहाँ जैसे जोड़े की सूची / सरणी के रूप में करेंगे:

var unlocks_unlocked = [[A, B],[A,C],[A,D],[X,Y],[Z,Y],[W,Y]];

तो "वास्तविक दुनिया" उदाहरण के लिए आपके पास हो सकता है:

... ["running fast", "jumping superhigh"], ["antigravity's child", "jumping superhigh"]

और इसका मतलब है कि "जंपिंग सुपरहिग" आपको "तेज दौड़ने" और "एंटीग्रेविटी के बच्चे" प्रतिभाओं के बाद प्राप्त होती है।

अन्य समाधान

मैंने हाल ही में डियाब्लो नहीं खेला है लेकिन यह हो सकता है, कि यह केवल था:

  • प्रतिभा कई अन्य प्रतिभाओं को अनलॉक करती है
  • प्रतिभा को सिर्फ एक प्रतिभा द्वारा अनलॉक किया जाता है।

यह 1 है: एन संबंध:

 You put "is unlocked by this talent's id" variable into talent's structure

पसंद:

 var Talent[8] = { "name": "superpower", "unlocked by": "being Clark Kent"};
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.