अगर किसी खिलाड़ी ने कोई उपलब्धि हासिल की है तो मुझे कैसे जांचना चाहिए?


13

मैं एक पैराग्राफ गेम बना रहा हूं और मुझे सिर्फ एक बिंदु पर जाना है जहां मुझे उपलब्धियों को लागू करने की आवश्यकता है ... मैं यह कैसे कर सकता हूं? हर 100ms में एक बार इसे चलाने के लिए सबसे सीधी बात यह होगी:

for a in achievements
    for p in players
        if a.meetsRequirements(p) then p.completeAchievement(a)

लेकिन यह सिर्फ और भी जटिलताओं को जन्म देता है। उदाहरण के लिए, यदि वास्तव में उपलब्धि पूरी हो गई है तो मैं कैसे जांच करूं? क्या खिलाड़ियों के पास किसी विशिष्ट उपलब्धि के लिए खुद पर कस्टम गुण हैं? मैंने quests के साथ इस तरह का काम किया, क्योंकि वे मुख्य रूप से "100 लकड़ी इकट्ठा करते हैं", इसलिए एक खिलाड़ी की जांच पर सक्रिय quests कि। इसके अलावा, इसे जांचने के लिए बेहतर समय होना चाहिए, इससे समय-समय पर मेरा सर्वर धीमा होता जाएगा, मुझे लगता है।


7
क्यों न केवल उचित जांच चलाएं क्योंकि कार्रवाई की जाती है? यदि उपयोगकर्ता लकड़ी इकट्ठा करता है, तो देखें कि क्या वे "100 लकड़ी इकट्ठा" विनिर्देश से मेल खाते हैं।
माइक क्लार्क

1
यह थोड़े बहुत गड़बड़ लगता है ... हर जगह कई टन की जाँच होगी। मुझे लगता है कि मैं सादगी के कारण उपरोक्त एल्गोरिथम पर
टिक जाऊंगा

10
इसे कम गन्दा बनाने के तरीके हैं: जैसे कि "OnChange" ईवेंट हैंडलर होने के बाद उन लोगों के लिए उपलब्धि "ऑब्जेक्ट" संलग्न करें और वहां तर्क को संभालें। यह भी समझें कि आपके वर्तमान सेटअप के साथ आपके पास जटिलता का O (n ^ 2) स्तर है, जिसका अर्थ है कि आपका खेल अधिक वर्णों की तुलना में बहुत तेज़ हो गया है। एक
पैराग्राफ के

जवाबों:


23

आप जो करते हैं वह उपलब्धि की प्रकृति पर निर्भर करता है। जब तक आपकी उपलब्धियां सभी एक साधारण पैटर्न (Y की एकत्रित संख्या X) में फिट नहीं हो जातीं, तब तक आपको उन्हें कुछ हद तक विशेष स्थिति में रखना होगा।

एक संदेश-आधारित संचार प्रणाली का उपयोग करके, आप हुक प्रदान कर सकते हैं जो विशेष-केस कोडिंग को स्थानीय बनाता है। आप श्रोताओं के लिए कुछ कार्य आग संदेश हो सकते हैं जो खुद को पंजीकृत करते हैं। तब आपका उपलब्धि कोड / स्क्रिप्ट केवल उचित श्रोताओं के साथ खुद को पंजीकृत कर सकता है और उपलब्धि को आग लगाने के लिए जो भी परीक्षण आवश्यक है, वह करें।

आपके पास उन विशिष्ट घटनाओं के लिए संदेश होगा जिन्हें आप सुनना चाहते हैं। "खिलाड़ी ने आइटम एक्स का अधिग्रहण किया है" या "संस्था वाई मारे गए इकाई जेड" जैसी चीजें। इस तरह, आप चीजों को ट्रैक कर सकते हैं जैसे कि कितने जेड खिलाड़ी ने मारे हैं।

यह शायद सबसे अच्छा आप उपलब्धियों के लिए एक प्रणाली के लिए कर सकते हैं। यह कोड को यथासंभव केंद्रीकृत करता है, और वास्तविक उपलब्धि का पता लगाने के लिए श्रोताओं पर जोर डालता है।

इसके अलावा, यह ध्यान दिया जाना चाहिए कि, केंद्रीकृत उपलब्धि प्रणालियों (एक्स-बॉक्स लाइव, स्टीम उपलब्धियों) के लिए, उपलब्धियों की दिशा में प्रगति आम तौर पर सर्वर पर संग्रहीत होती है। तो संचय उपलब्धियों के लिए ("कार्य XY संख्या का बार-बार प्रदर्शन"), उपलब्धि स्क्रिप्ट बस का पता लगाती है जब एक्स का प्रदर्शन किया गया है और सर्वर की गिनती को रोक देता है। अन्य प्रकार की उपलब्धियों के लिए ("कार्य एक्स निष्पादित करें"), सर्वर उपलब्धि बाइनरी है: या तो आपने इसे किया है, या आपने नहीं किया है।


+1 यह बहुत अच्छी जानकारी है। इस समय उपलब्धियों को लागू करने की आवश्यकता के बिना भी मेरे लिए उपयोगी है।
यहोशू हेजेज

धन्यवाद! इसे लागू करने के लिए इंतजार नहीं कर सकता, काश मेरे पास यह विचार पहले होता ...
jcora

3

अपनी उपलब्धियों की प्रकृति के आधार पर आप किसी प्रकार की "मार्कर उपलब्धियाँ" भी पेश कर सकते हैं।

यदि आपके पास उदाहरण के लिए 3 लगातार उपलब्धियां हैं:
लकड़ी 1 - 100 लकड़ी इकट्ठा करें
लकड़ी 2 - 500 लकड़ी
लकड़ी 3 इकट्ठा करें - 1k लकड़ी इकट्ठा करें

तब यह पहली उपलब्धि के लिए ऑनकेंज घटना को पंजीकृत करने के लिए समझ में आता है जब तक कि खिलाड़ी इसे पूरा नहीं करता। पूरा होने पर आप अगली उपलब्धि ऑब्जेक्ट रजिस्टर कर सकते हैं।

इस कोर्स के लिए एक उपलब्धि निर्भरता पेड़ के डिजाइन (या गणना) की आवश्यकता होती है।

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