विशेष रूप से विशिष्ट क्षेत्र की एक इमारत का निर्माण


15

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

इन विशिष्टताओं को पूरा करने के लिए एक मूल यादृच्छिक आयत जनरेटर लिखने के लिए इसका अपेक्षाकृत सरल है, लेकिन हमारा लक्ष्य कारखाने को और अधिक जटिल बनाने के लिए है, शायद 2, 3 या 4 प्रतिच्छेदन आयतों से बना है, और अधिक जटिल आकार का निर्माण करते हैं (एल के बारे में सोचो) यू, और ओ आकार की इमारतें)।

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

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

अग्रिम में धन्यवाद!

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

जवाबों:


7

आप इमारतों के वर्गीकरण का निर्माण करने के लिए मेटा आकार के रूप में पूर्व-निर्मित पॉलीओमीनो का उपयोग कर सकते हैं ।

मान लीजिए कि आपकी न्यूनतम स्वीकार्य दूरी 3 ब्लॉक है। तब हम जिस छोटी स्वीकार्य बिल्डिंग यूनिट पर विचार करेंगे, वह 3x3 है। सुविधा के लिए, मैं कॉल करने जा रहा हूं कि एक सेल और यह 9 ब्लॉक का एक क्षेत्र देता है। इसके बाद, अपना लक्ष्य आरंभ क्षेत्र लें और इसे सेल क्षेत्र से विभाजित करें। आपके द्वारा दिए गए शुरुआती मूल्य का उपयोग करते हुए, हमें 3.333 मिलता है; इसलिए 3 कोशिकाएं आपको अपनी इच्छानुसार थोड़ा कम देती हैं और 4 कोशिकाएं आपको अधिक देती हैं।

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

अगला, बेतरतीब ढंग से वांछित सेल गिनती के साथ पॉलीमिनो का चयन करें। पॉलोमिनो पर प्रत्येक वर्ग को एक बिल्डिंग सेल के साथ बदलें और आपके पास अपना अंतिम आकार है।

वर्णन करने के लिए, कहें कि हम नीचे की ओर बढ़ते हैं। यहां सभी आकार 3 पॉलीमिनोइज़ (घुमाव / फ़्लिप शामिल नहीं हैं):

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

मान लें कि हम अनियमित रूप से एल आकार लेते हैं और एक यादृच्छिक घुमाव लागू करते हैं, तो आपके भवन में निम्नलिखित लेआउट होगा:

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

मुद्दों की एक जोड़ी। सबसे पहले, आपके द्वारा उपयोग की जाने वाली कोशिकाओं की संख्या पर एक सीमा होती है। विकिपीडिया आपको सभी पॉलीओमीनो को आकार 8 ( ऑक्टोमिनो ) तक देगा। इसमें 12 आकार तक का सारांश डेटा शामिल है, लेकिन मुझे नहीं पता कि इन सभी के लिए ऑनलाइन सूची है या नहीं। दूसरा, उपरोक्त समाधान केवल उन आकारों के निर्माण के लिए काम करता है जो 9 के गुणक हैं। इनमें से कुछ मुद्दों पर काम करने के कुछ तरीके हैं:

1) एक अलग सेल आकार का उपयोग करें। उदाहरण के लिए 3x4, 4x4, आदि।

2) एक शुरू पॉलीओमीनो में अतिरिक्त कोशिकाएं जोड़ें। यह मुश्किल हो सकता है यदि आपको सुनिश्चित करना चाहिए कि सभी आकृतियाँ समान रूप से होने की संभावना है, लेकिन संभावना अधिकांश गेम देव उद्देश्यों के लिए है जिन्हें आपको भवन आकृतियों के समान वितरण की आवश्यकता नहीं है।

3) इसे बड़ा करने के लिए एक इमारत से बाहर पैड। उदाहरण पर वापस जाएं, यदि आपने 3 कक्षों का उपयोग किया है, तो आपके भवन में 27 वर्गों का क्षेत्र होगा जो आपको 3 से कम छोड़ देगा। तब आप एक स्थान के लिए परिधि को स्कैन कर सकते हैं 1 वर्ग 3 वर्ग के आकार को गोंद करने के लिए। जब तक आपका मेकअप ग्रुप कम से कम एक्सबी है जहां ए कम से कम आपकी न्यूनतम स्वीकार्य दूरी है, आपका परिणाम आपके न्यूनतम स्वीकार्य दूरी की कमी का उल्लंघन नहीं करेगा। उपरोक्त उदाहरण का निर्माण, यहाँ एक संभावित परिणाम का चित्रण है:

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

4) एक इमारत को बाहर करने के बजाय जो बहुत छोटी है, आप एक ऐसी इमारत को गिरा सकते हैं जो बहुत बड़ी हो। यह सुनिश्चित करना कि आपकी न्यूनतम स्वीकार्य दूरी की बाधा का पालन पैडिंग विकल्प की तुलना में अधिक जटिल है, लेकिन आपको विचार करने के लिए अधिक विकल्प देगा।

कुछ अन्य टिप्पणियाँ:

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


16

प्रक्रियात्मक जनरेटर बनाने का एक सरल तरीका है:

  1. बेतरतीब ढंग से चीजों का निर्माण
  2. एक फ़ंक्शन चलाएं जो यह जांचता है कि आउटपुट अच्छा है या नहीं
  3. यदि आउटपुट अच्छा नहीं है, तो चरण 1 पर जाएं

यहां तक ​​कि अगर इसे पूरा करने में हजारों रन लगते हैं, तो ज्यादातर सरल जनरेटर इस दृष्टिकोण के साथ ठीक हो जाते हैं। लाभ यह है कि जनरेटर में बहुत सारे स्मार्ट की आवश्यकता नहीं है, और यह जांचने के बाद कि क्या किसी चीज के निर्माण की तुलना में कुछ अच्छा है, जो कि 100% अच्छा है, यह दृष्टिकोण बहुत आसान है।

आपने कुछ उद्देश्य उपाय सूचीबद्ध किए हैं कि क्या आउटपुट अच्छा है; आपके लिए एक त्वरित और गंदा जनरेटर बनाने के लिए पर्याप्त होना चाहिए। आयतों को एक क्षेत्र के अंदर यादृच्छिक पर रखें, और यदि आउटपुट को अस्वीकार कर दें, उदाहरण के लिए, ऐसे क्षेत्र हैं जो केवल 1-2 ब्लॉक चौड़े हैं।

उसके साथ शुरुआत करें, बाद में सुधार और अनुकूलन करें।


धन्यवाद! मुझे इस पर विचार करना याद है, लेकिन वहाँ एक दूसरे के लिए एक मौका होने के विचार ने मुझे रोक दिया। मुझे अब एहसास हुआ कि मौका कितना छोटा है। मुझे यह कोशिश करनी होगी, लेकिन मैं यह देखने के लिए प्रतीक्षा कर सकता हूं कि क्या किसी के पास पहले अधिक प्रत्यक्ष समाधान है।
user2129189

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

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

@DMGregory हाँ, मैं निश्चित रूप से इसे देख सकता हूँ। एक बेसिक रैंडम जेनरेटर मेरे केस के लिए कुछ अंशों के भीतर 99% समय की तरह काम करेगा, लेकिन अगर मैं बाद में अधिक जटिलता जोड़ना चाहता हूं, तो यह काफी धीमा हो सकता है। किसी को भी किसी भी वास्तविक जीवन की प्रोग्रामिंग / गेम एप्लिकेशन का अनुमान और चेक-जैसे मॉडल के बारे में पता है?
user2129189

हो सकता है कि पीढ़ियों के कार्यों और जाँचों के स्तर हो सकते हैं, देखभाल करने के लिए पीढ़ी के वर्तमान स्तर तक स्थितियों के मिलान को ध्यान में रखते हुए। इस तरह, पूरे स्तर को पूरी तरह से फिर से उत्पन्न करने की आवश्यकता नहीं है केवल एक त्रुटि को गलत तरीके से रखने पर मिली त्रुटि से।
Pysis

7

"सभी क्षेत्रों में कम से कम 3-4 ब्लॉक चौड़े हैं" के प्रतिबंध को देखते हुए पहला विचार है कि मेरे दिमाग में छलांग कुछ इस तरह है:

  1. 3x3, 3x4, 4x3 या 4x4 में से किसी एक को चुनें
  2. ग्रिड के केंद्र में उस आकार का एक ब्लॉक रखें
  3. एक दिशा चुनें (ऊपर, बाएँ, दाएँ, नीचे)
  4. उस दिशा में पहले से रखे गए ब्लॉक के साथ एक 3x3 ब्लॉक लगाने का प्रयास करें
  5. यदि सफल हो, तो कुछ संभावना के साथ, ब्लॉक को 4x3 ब्लॉक में से एक में विस्तारित करने का प्रयास करें जो आपने अभी नहीं चुना था
  6. कुछ संभावना के साथ, ब्लॉकों में भरे हुए एक यादृच्छिक किनारे पर जाएं
  7. 3 से 6 चरणों को दोहराएं जब तक कि क्षेत्र काफी बड़ा न हो

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


4
मैं हमेशा 3x3 ब्लॉक से शुरू करके चीजों को सरल बनाता हूं, फिर यादृच्छिक पदों में 3x1 ब्लॉक जोड़ रहा हूं जहां प्रत्येक वर्ग एक मौजूदा से सटे हुए हैं। एक 3x3 ब्लॉक में जोड़ना, चार संभावित स्थान हैं। सभी आपको 3x4 ब्लॉक देते हैं, अगले एक के लिए छह संभावित पदों के साथ। वहां से यह अधिक जटिल हो जाता है, लेकिन इतना बुरा नहीं।
जॉली जोकर

0

बुलियन नॉट और यूनिअन का उपयोग करने और उनके बीच बेतरतीब ढंग से चयन करने पर विचार करें।

  1. एक यादृच्छिक आयत रखें।
  2. एक दूसरा यादृच्छिक आयत रखें।
  3. बेतरतीब ढंग से चुनें कि क्या उन्हें पहले या दूसरे को पहले से हटा दें।
  4. कई आयतों के लिए दोहराएँ। हालाँकि, केवल दो या तीन ही उचित पर्याप्त परिणाम दे सकते हैं।

फिर, मैं क्षेत्र की गणना करूंगा और आपके द्वारा खोजे जाने वाले अनुमानित आकार से अधिक या अधिक निकटता से मेल खाऊंगा, और फिर परीक्षण करूंगा कि कोई आवश्यक न्यूनतम राशि से कम आयाम तो नहीं हैं।


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