गेमिंग में उपलब्धियों का पता कैसे लगाएं?


10

मैंने इसे स्टैकओवरफ्लो में गलती से पोस्ट किया था और अब उस साइट पर एक सुझाव के आधार पर यहां पोस्ट कर रहा हूं ...

यह एक उच्च स्तरीय वैचारिक प्रश्न है। एक सॉफ्टवेयर एप्लिकेशन में कहें, मेरे पास 4 अलग-अलग क्रियाएं हैं, उदाहरण के लिए: अपलोड, शेयर, टिप्पणी और पसंद

और मैं उपयोगकर्ताओं को उपलब्धि बैज देना चाहता हूं जैसे:

  • Rookie - अपनी पहली 5 फाइलें अपलोड करें
  • जंकली अपलोड करें - 1 दिन में 20 फाइलें अपलोड करें
  • नाइट क्रॉलर - आधी रात के बाद एक फ़ाइल अपलोड करें
  • शेयर-ए-होलिक - शेयर 10 अलग-अलग फाइलें
  • पसंद-सब कुछ - 20 अलग-अलग फ़ाइलों की तरह

तुम्हें नया तरीका मिल गया है। वह जाँचने और देखने का सबसे अच्छा तरीका है कि क्या किसी उपयोगकर्ता ने मेरे कोड में उपलब्धि के लिए तर्क संकलित किए बिना एक विशेष उपलब्धि हासिल की है? और .. - नई उपलब्धियां पोस्ट कंपाइल (xml या db) जोड़ने की क्षमता को बनाए रखें - उपलब्धियां विशिष्ट क्रियाओं, समय की संख्या और अतिरिक्त मापदंड (जैसे दिन का समय) को ट्रैक करना चाहिए - डिटेक्शन वास्तविक समय के पास होना चाहिए ताकि उपयोगकर्ता को सूचित किया जाए एक उपलब्धि पूरी होने पर लगभग तुरंत

मेरा सबसे बड़ा सवाल यह है कि मैं इन उपलब्धियों को कैसे प्राप्त करूं? क्या मैं:

1) हर कार्रवाई के बाद देखें कि क्या ... (अधिकांश वास्तविक समय) 2) क्या एक और कार्यक्रम नियमों के एक सेट के खिलाफ हर समय डीबी की जांच करता है? (सबसे आसान)

क्या एक और प्रतिमान है जो मुझे याद आ रहा है? मुझे लगता है कि निश्चित रूप से ऐसा है क्योंकि कई खेलों में (उदाहरण के लिए iOS के लिए जेटपैक), मुझे उस उपलब्धि के बारे में सूचित किया गया है जिसे मैंने तत्काल में अनलॉक किया है जिसमें मैं इसे अनलॉक करता हूं जो मुझे बहुत प्रभावशाली लगा।

धन्यवाद


क्या आपने अभी तक उपलब्धियां सिस्टम को डिज़ाइन या बनाया है और यह जानना चाहते हैं कि गेम में इसका उपयोग कैसे करें?
हैरिसन ब्रॉक

जवाबों:


6

आमतौर पर आप जो करते हैं, उसमें "उपलब्धि" प्रणाली होती है। कोई भी कार्रवाई जो होती है उसे उपलब्धि प्रणाली कहते हैं और कहते हैं "अरे यह बात अभी हुई"।

फिर उपलब्धि प्रणाली आम तौर पर नियमों का एक सेट है, जो आमतौर पर विभिन्न "घटनाओं" के लिए सरल कॉम्बाटिनैटोरियल लॉजिक और काउंटर से बना होता है। यह तो बाहर काम करने के लिए उपलब्धि प्रणाली की जिम्मेदारी है, नियमों और काउंटरों की मदद से, मट्ठा हुआ, और क्या उपलब्धियां देने के लिए।

आपके ऐसा करने का कारण दुगना है।

  • आप अपने राज्य तर्क को अपने कोडबेस पर नहीं फैलाना चाहते।

  • कभी-कभी उपलब्धियों के लिए "सामान" के संयोजन की आवश्यकता होती है जो पूरी तरह से अलग-अलग प्रणालियों / समय / आदि में हो सकती है और आपके कोड आधार के चारों ओर इसके लिए तर्क फैलाने से बड़ी मात्रा में अनावश्यक जटिलता हो जाएगी।

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

  • जब "उपयोगकर्ता ने कुछ दबाया" होता है "वृद्धि" "दबाया" चर।

तब आपके पास एक और नियम हो सकता है

  • जब "दबाया गया" वेरिएबल "कुछ मूल्य" की तुलना में "बड़ा" होता है, तो उपलब्धि "ब्लाह" होती है।

या शायद

  • जब "उपयोगकर्ता बॉस को मारता है" तब होता है "हैंड आउट" उपलब्धि "ब्ला"।

उपलब्धि प्रणाली को भी काम सौंपा जाएगा जिसमें राज्य की उपलब्धियों को पहले ही सौंप दिया गया है, इसलिए आपको डुप्लिकेट नहीं मिलते हैं।


0

इसे संभालने का एक साफ तरीका विनिर्देश पैटर्न हो सकता है। आपके पास एक उपलब्धि प्रबंधक होगा, जो समय-समय पर आपके उपयोगकर्ताओं को उन विनिर्देशों के लिए क्वेरी करेगा, जो किसी भी विनिर्देशन के सेट से मेल खाते हैं। इसलिए आपकी उपलब्धि वर्ग में सामान्य के रूप में एक नाम, लोगो, बिंदु स्कोर आदि शामिल होंगे, और उस उपलब्धि का वर्णन करने वाले उपयोगकर्ता का वर्णन करने वाले विनिर्देश भी शामिल होंगे। उदाहरण के लिए, C # में, "शेयर-ए-होलिक" उपलब्धि इस तरह दिख सकती है:

AchievementType ShareAHolic = new AchievementType
{
    Name = "Share-a-holic",
    Description = "Shared 10 files",
    Score = 25,
    Specification = (user => user.SharedFiles.Distinct().Count() > 10)
};

AchievementManager.AddAchievementType(ShareAHolic);

और फिर उचित बिंदु पर, आपका उपलब्धि प्रबंधक इस तरह से कुछ कर सकता है:

foreach (AchievementType achievement in AchievementTypes)
{
    var users = DB.Users.Where(achievement.Specification && !(user.Achievements.Contains(achievement)));
    foreach (User u in shareaholics)
    {
        AchievementManager.Award(u, achievement);
    }
}

आपके उपलब्धि प्रबंधक की .Award()विधि को भी उचित बिंदु पर सीधे बुलाया जा सकता है यदि किसी उपलब्धि का तुरंत पता लगाया जा सकता है। आप किसी विशिष्ट उपयोगकर्ता पर इन चेकों को चलाने के लिए एक विधि भी जोड़ना चाह सकते हैं, ताकि आप उपयोगकर्ताओं को तुरंत उपलब्धियां प्राप्त करने की अनुमति देने के लिए महत्वपूर्ण घटनाओं के बाद एक चेक ट्रिगर कर सकें।


विभाजन की उपलब्धियां जल्दी से महत्वपूर्ण हो जाती हैं, AchType को 'sope' प्रॉपर्टी की आवश्यकता होती है जो DB.Users.Where () को असंबंधित उपलब्धियों से बचने के लिए, जब संभव हो, सहायता कर सकती है। तो अगर फ़ाइल शेयर उपलब्धि केवल PvP में ही दी जा सकती है, केवल PvP की खोज करें। जबकि लूट जैसी कोई चीज विश्व स्तर पर संभव हो सकती है और इस तरह की गुंजाइश नहीं होगी।
hpavc
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.