जब संसाधन समाप्त हो जाते हैं तो मैं कारखानों के बीच संसाधनों को कैसे वितरित करता हूं?


12

मेरे खेल में मुख्य संसाधन द्रव्यमान है , एक अस्थायी बिंदु संख्या के रूप में संग्रहीत है जो समय के साथ बदलता है। संसाधन नोड बड़े पैमाने पर बढ़ते हैं और कारखाने इसे सूखा देते हैं। उदाहरण के लिए, यदि मेरे पास प्रति सेकंड 5 द्रव्यमान का उत्पादन करने वाला संसाधन नोड है, तो मैं 5 * deltaTप्रत्येक गेम स्टेप को प्राप्त करूँगा । द्रव्यमान को निकटतम पूर्णांक तक गोल किया जाता है, और लाभ / हानि संकेतक दशम द्वारा प्रदर्शित किए जाते हैं।

मुझे शून्य मारने वाले द्रव्यमान को कैसे संभालना चाहिए? यह एक दौड़ की स्थिति बनाता है यदि कई कारखाने एक बार में निर्माण करने की कोशिश कर रहे हैं: पहले कतार में फैक्टरियां या जो कुछ अधिक संसाधन आने पर कम संसाधन को प्राथमिकता देते हैं और दूसरों की तुलना में तेजी से निर्माण करते हैं।

मैं इससे कैसे निपट सकता हूं? क्या मुझे कदम पूरी तरह से छोड़ देना चाहिए?


बाह, मेरी टिप्पणी नहीं बची। मेरी बेहतर खोज हुई। मूल रूप से मेरे पास एक संसाधन है जो हर कदम पर हर वस्तु तक पहुंचता है। प्रत्येक ऑब्जेक्ट संसाधन से जोड़ता या घटाता है। मेरी समस्या यह है कि अगर संसाधन 0 हिट है तो मुझे नहीं पता कि क्या करना है। क्या मुझे किसी प्रकार की एक कतार बनानी चाहिए? क्या मुझे किसी वस्तु के चरण को छोड़ देना चाहिए। क्या?
Mob

3
राउंड रोबिन। समस्या सुलझ गयी।
पैट्रिक ह्यूजेस

नीचे से रॉय के जवाब ने टिप्पणी के साथ मिलकर एक सभ्य, आसान बनाए रखा और राउंड रॉबिन सिस्टम को ट्यून किया। जब तक आपकी तत्काल डिजाइन समस्या हल हो जाती है तब तक यह सब अच्छा है) =
पैट्रिक ह्यूजेस

जवाबों:


9

मैं पेट्र के साथ सहमत हूं: इसे करने का कोई निर्धारित तरीका नहीं है। आप इसे कैसे करना चाहते हैं, यह एक बात है कि आप अपने खेल को कैसे डिजाइन करना चाहते हैं।

इस परिस्थिति में, मुझे लगता है कि यह तुरंत स्पष्ट हो जाता है कि आप जिस मैकेनिक को पाने की कोशिश कर रहे हैं: आप बस चाहते हैं कि जितनी तेजी से उत्पादन संभव हो, उतनी ही मात्रा में आपके पास उपलब्ध हो।

क्षमता के भीतर उत्पादन

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

एक उत्पादन गति मैकेनिक

प्रत्येक अपडेट चरण, आपके कारखाने सिर्फ एक निर्धारित राशि का उत्पादन नहीं करते हैं: वे एक उत्पादन गति से संचालित होते हैं , जो यह निर्धारित करता है कि वे प्रत्येक चरण में कितनी प्रगति करते हैं और कितना बड़े पैमाने पर उपयोग करते हैं। जब आप 75% क्षमता का उत्पादन कर रहे हैं, तो आपके कारखाने प्रत्येक चरण में 75% की प्रगति करते हैं और 100% क्षमता की तुलना में 75% द्रव्यमान का उपयोग करते हैं।

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

production speed = (total mass capacity / mass required this step)
if (production speed > 1.0) production speed = 1.0

मान लीजिए कि आपको पूरी क्षमता से उत्पादन करने के लिए 125 मास की आवश्यकता है, लेकिन इस चरण में केवल 100 द्रव्यमान हैं। यह समीकरण आपको 0.8 की उत्पादन गति (80% का दशमलव प्रतिनिधित्व) प्रदान करता है। जब आप अपने कारखानों को वास्तव में उनके भवन का प्रदर्शन करने के लिए कहते हैं , तो आप उन्हें यह मान देने के लिए कहते हैं कि वे किस गति से निर्माण कर रहे हैं: और अब आपके उत्पादन को बोर्ड में धीमा कर दिया गया है।

वैकल्पिक

उत्पादन क्षमता से मुक्त होने तक आप अस्थायी रूप से कारखानों को बंद करना शुरू कर सकते हैं, और यह देखना बहुत दिलचस्प हो सकता है कि बेहद कम क्षमता पर जनरेटर से दूर कारखानों में हो रहा है।

कई संसाधन?

आपके ऊपर आप इसे कैसे संभालते हैं; बहुत सारे विकल्प हैं। सबसे सरल शायद प्रत्येक संसाधन के लिए उत्पादन क्षमता की गणना करना और फिर सबसे कम को चुनना है , जैसे कि आपका सबसे कमजोर संसाधन बाकी सभी के लिए एक अड़चन बन जाता है।


मुझे लगता है कि आपको कारखाने को 80% गति से उत्पादन करने की आवश्यकता नहीं है, क्योंकि जो भी आपका कारखाना बनाता है वह निश्चित मात्रा में द्रव्यमान का उपयोग करता है। उदाहरण के लिए: आप एक टैंक का निर्माण करते हैं जिसे बनाने में 100 द्रव्यमान लगते हैं, आम तौर पर कारखाना हर चक्र में 2 द्रव्यमान का उपयोग कर सकता है। इसका मतलब यह है कि टैंक को पूरा करने के लिए 50 चक्र लगते हैं और हर चक्र को आप टैंक के द्रव्यमान में 2 जोड़ते हैं। अब, आपके पास केवल 1 द्रव्यमान उपलब्ध है, इसका मतलब है कि यह चक्र, टैंकों में वर्तमान में 1 के बजाय 1 से बड़े पैमाने पर खर्च होता है। प्रत्येक चक्र के बाद बस वर्तमान द्रव्यमान की जांच करें कुल आवश्यक द्रव्यमान यह देखने के लिए कि क्या टैंक पूरी तरह से निर्मित है या नहीं।
थॉमस

यदि आपके पास 0 द्रव्यमान उपलब्ध है, तो टैंक में कोई द्रव्यमान न डालें। इस तरह से कुछ बनाने में लगने वाला समय आपकी सामूहिक आय के आधार पर भिन्न हो सकता है। यदि आपके पास 2 कारखाने हैं जो 2 द्रव्यमान / चक्र और केवल 3 आय का उपयोग कर सकते हैं, तो टैंक 1 का निर्माण 50 चक्रों में, टैंक 2 का 100 में होता है। दूसरा तरीका यह है कि सभी कारखानों में उपलब्ध द्रव्यमान की कुल मात्रा को विभाजित करें जो इसका उपयोग करते हैं ( सक्रिय रूप से कुछ निर्माण)। किसी कारखाने का उपयोग करने वाली कुल मात्रा को कारखाने में स्तरों को जोड़कर उन्नत किया जा सकता है। उदाहरण के लिए स्तर 1 पर वे 2 मास, स्तर 2: 3 द्रव्यमान आदि पर खर्च कर सकते हैं
थॉमस

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

@Hackworth मैं असहमत हूं, कारखाने को संसाधन प्रणाली के बारे में जानने की आवश्यकता नहीं है। कारखाना केवल यह जानता है कि यह क्या निर्माण कर रहा है और यह कितनी दूर है। संसाधन प्रणाली सिर्फ कारखाने को एक्स राशि जोड़कर निर्माण के लिए कहती है। इस तरह से आपको इस कारखाने में संसाधन आय के प्रतिशत की गणना करने की आवश्यकता नहीं है और आपको अतिरिक्त पूर्णता प्रतिशत में संसाधन आय का अनुवाद करने की आवश्यकता नहीं है।
थॉमस

6

हालांकि मुझे लगता है कि जोनाथन हॉब्स का जवाब मुझे लगता है कि एक कतार प्रणाली और भी सरल है:

Queue<Factory> queue = ...;
int numFactories = ...;

Update()
{
    int resources = GetAllResourcesForThisStep();
    for(int i = 0; i < numFactories; i++)
    {
        if(queue.Peak().RequiredResources <= resources)
        {
            Factory f = queue.Pop();
            resources -= f.RequiredResources;
            queue.Push(f);
        }
        else
        {
            break;
        }
    }
}

यह संभवतः जोनाथन के कार्यान्वयन के समान ही औसत रूप से काम करेगा। हालाँकि, जोनाथन का समाधान समस्याएँ दे सकता है यदि कार्यक्षेत्र बहुत कम निर्धारित किया गया है और मेरे कार्यान्वयन में बहुत अधिक resourcerequest के साथ एक कारखाना हो सकता है इस फ्रेम में कई फ्रेम के लिए अन्य कारखाने हैं।


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

भुखमरी से सावधान रहें यदि आप उन्हें अलग प्राथमिकता देते हैं। :)
रॉय टी।

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

5

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

यदि आपके पास एक सूची है: [निर्माता 1, कंज्यूमर 1, कंज्यूमर 2, कंज्यूमर 3] और आप ऑर्डर में अपडेट करते हैं, तो सप्लाई = 0 से शुरू करें, आपको यह मिलेगा:

producer1 produces 5 mass. You now have 5 mass
consumer1 wants 3 mass. Success, you now have 2 mass
consumer2 wants 3 mass. Fail
consumer3 wants 3 mass. Fail
[next tick]
producer1 produces 5 mass. You now have 7 mass
consumer1 wants 3 mass. Success, you now have 4 mass
consumer2 wants 3 mass. Success, you now have 1 mass
consumer3 wants 3 mass. Fail
etc...

Consumer1 को सभी मज़ेदार मिलते हैं, जबकि उपभोक्ता 2 और 3 तब तक भूखे रहते हैं जब तक कि उपभोक्ता 1 संतुष्ट नहीं हो जाता। आपके खेल के आधार पर, यह वांछनीय नहीं हो सकता है। मुझे अपने खेल में पता है, यह नहीं है। जब मैं इसके चारों ओर हो जाता हूं, तो मैं एक कतार बनाने जा रहा हूं, जहां एक टिक में फीड किए गए उपभोक्ता अगले टिक के लिए कतार के पीछे चले जाएंगे, जो मुझे विश्वास है कि रॉय टी। ऊपर का उदाहरण इस तरह दिखेगा:

producer1 produces 5 mass. You now have 5 mass
consumer1 wants 3 mass. Success, you now have 2 mass. <-- Move to end of queue
consumer2 wants 3 mass. Fail
consumer3 wants 3 mass. Fail
[next tick]
producer1 produces 5 mass. You now have 7 mass
consumer2 wants 3 mass. Success, you now have 4 mass  <-- Note the order change
consumer3 wants 3 mass. Success, you now have 1 mass
consumer1 wants 3 mass. Fail
etc...

इस तरह, सभी को संसाधनों का उचित हिस्सा मिलेगा।

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

इसलिए पुनरावर्तन करने के लिए: उत्पादकों को अपडेट करें, फिर प्राथमिकता कतार, आगे बढ़े उपभोक्ताओं को प्राथमिकता कतार के अंत में ले जाएं, फिर मानक कतार को अपडेट करें, खिलाए गए उपभोक्ताओं को मानक कतार के अंत तक ले जाएं।


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

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

@ कार्डिन, आप काफी सही हैं, लेकिन इसका इस्तेमाल गेम मैकेनिक के रूप में भी किया जा सकता है। सेटलर्स 4, नाइट्स एंड मर्चेंट्स, टोटल एनीहिलेशन, सुप्रीम कमांडर ऐसे खेल हैं जो मुझे पता है कि ऐसा किया था। चाल इस आपूर्ति लॉक तक नहीं पहुंचने के लिए है , और यदि आप करते हैं, तो सुनिश्चित करें कि आप आपूर्ति लॉक से बाहर निकल जाएं। प्राथमिकता कतार में जोड़ने से लोगों को आसानी से बाहर निकलने का रास्ता मिल जाता है।
जॉन मैकडॉनल्ड्स

3

खैर, मैं जॉन के विचार पर विस्तार करूंगा, क्योंकि हमने चैट में इस पर थोड़ी चर्चा की थी ।

संपादित करें: यह समाधान वास्तव में केवल बेहतर है यदि उपभोज्यअमाउंट कितनी बार कारखाने को संसाधनों का एक बैच मिलना चाहिए, इसके लिए प्रासंगिक है। यदि यह सब समान है, तो आप वास्तव में सिर्फ एक कतार का उपयोग कर सकते हैं।

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

यह निर्धारित करने पर कि किस कारखाने में किस तरह के संसाधन मिलते हैं, किसी तरह के छद्म कोड में:

iterator i = factoryqueue.start()
bool starvation = false
while(i.next())
  if(i.ready)
    if (!starvation) 
      if (i.consumeAmount < resource.count) starvation = true
      else 
        i.consume(resource)
        i.priority = 0
    if (starvation)
      i.priority += 1

इस तरह आपके कारखाने प्रत्येक उत्पाद को बारी-बारी से बनाएंगे, यदि आप उपभोग करने वाले खाते को ध्यान में रखते हुए समायोजित करना चाहते हैं ताकि सस्ता उत्पाद अधिक बार बनाया जाए, तो आप उदाहरण के लिए 1 / घातां से प्राथमिकता बढ़ा सकते हैं।


मैं इसे उभारना चाहता हूं, लेकिन मुझे यकीन नहीं है कि यह क्या करने के लिए है - यह भुखमरी का ट्रैक रखता है, लेकिन अन्यथा (संभवतः) बस कतार के माध्यम से सामान्य रूप से घूमता है, और भुखमरी और प्राथमिकता दोनों कभी भी समाप्त नहीं होते हैं कुछ भी करना।
डोपेलग्रेनेनर

यह अंतर स्पष्ट हो जाता है यदि आप प्राथमिकता को + = 1 / राशि से बढ़ाते हैं, तो यह एक उत्पाद बनाने के लिए अधिक संसाधनों की आवश्यकता होती है, जो कम लागत में पीछे रह जाएंगे, जिससे कम खर्चीले संसाधनों का अनुपात अधिक हो सकता है। यह प्रति फैक्ट्री अनुपात के संसाधन को भी समाप्त कर देगा। हालांकि, यह अभी भी मूर्खतापूर्ण प्रमाण नहीं है, क्योंकि भुखमरी संख्या जादू नंबर 0 पर सेट है, जब हर बार कारखाने द्वारा संसाधनों का उपभोग किया जाता है, तो यह बिल्कुल समान रूप से वितरित होने के लिए संसाधन के नवीकरण होने पर विचित्र रूप से वितरित होने वाला नहीं है।
टोनी

वास्तव में मैं अब इतना निश्चित नहीं हूं अगर इसकी वास्तव में गारंटी नहीं है। मुझे कुछ ग्राफ़ खींचने और यह सुनिश्चित करने के लिए परीक्षण करने की आवश्यकता होगी।
टोनी

ओह, और प्राथमिकता प्राथमिकता कतार का एक गुण है। मैं परेशान करने वाला नहीं हूं कि मैं कैसे निर्माण करूं। प्राथमिकता कतार हमेशा अपने सदस्यों के प्राथमिकता मूल्य के अनुसार क्रमबद्ध होती है।
टोनी

+1 यह समझना कि यह एक प्राथमिकता कतार है, इसके कामकाज अब सरल दिखते हैं: कतार के माध्यम से निचोड़ें और जल्द से जल्द उस चीज़ को चुनें जो संसाधनों का उपभोग कर सकती है। यदि क्षमता को भारी रूप से विभाजित किया गया है (आपके पास इस टिक पर 1,000 संसाधन हैं, लेकिन एक सौ 100-संसाधन बनाता है) यह एक समस्या नहीं होनी चाहिए, और चीजें काफी अच्छी तरह से खिलाई जाती हैं। यहां तक ​​कि अगर आपके संसाधनों के ऊपर कुछ अच्छी तरह से टिक गया है, तो यह अंततः थोड़ा सा प्रगति करने के लिए पर्याप्त बचत कर सकता है - जिसका प्रभाव इसे धीमा करने या बड़ी चीजों को पूरी तरह से छोटी चीजों के पक्ष में बंद करने का है जो एक अच्छी बात है। मुझे यह बहुत पसंद है। :)
doppelgreener

2

अजीब सवाल।

मेरी समस्या यह है कि अगर संसाधन 0 हिट है तो मुझे नहीं पता कि क्या करना है। क्या मुझे किसी प्रकार की एक कतार बनानी चाहिए? क्या मुझे किसी वस्तु के चरण को छोड़ देना चाहिए। क्या?

आपको क्या करने की ज़रूरत है, एक गेम लॉजिक पर निर्भर करता है जिसे आप बनाते हैं। आप एक कतार कर सकते हैं, आप को छोड़ सकते हैं। निर्भर करता है कि आपको क्या लगता है कि आपके खेल को कैसे व्यवहार करना चाहिए। मुझे सही करें, अगर मैं आपके प्रश्न पर गलत हूं।


1

आप सभी निर्माणों के लिए प्रति टिक की कुल संसाधन मांग की संख्या रख सकते हैं। यदि एक संसाधन भंडारण इस आवश्यक राशि से कम हिट करता है, तो सभी निर्माण पूरी तरह से बंद हो जाएंगे जब तक कि उत्पादन के कम से कम 1 टिक का समर्थन करने के लिए भंडारण पर्याप्त रूप से इकट्ठा नहीं हो जाता। तब उत्पादन फिर से शुरू हो सकता है।

इसलिए उत्पादन दर को एक फ्लोट के रूप में संग्रहीत करने के बजाय, यह बाइनरी है - या तो आपका कारखाना पूरी गति से उत्पादन करता है या यह नहीं करता है।

कहा जा रहा है कि, यह दृष्टिकोण अनिवार्य रूप से जोनाथन के जवाब के समान है, उत्पादन दर विशेष मामलों के लिए 0.0 और 1.0 - 0.0 के साथ एक मनमाना फ्लोट f <= f <= 1.0 शायद अधिक सुरुचिपूर्ण है क्योंकि आपको झटकेदार भंडारण राशि आंदोलनों नहीं मिलती हैं , लेकिन तर्क थोड़ा सरल होना चाहिए।

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