कनेक्टेड पथों के साथ प्रक्रियात्मक 2 डी मानचित्र के लिए एल्गोरिदम


26

हल करने के लिए समस्या: एक टाइल आधारित गेम के लिए एक यादृच्छिक 2 डी डंगऑन मानचित्र बनाएं जहां सभी कमरे जुड़े हुए हैं।

मैं वर्तमान में जो कुछ है उससे बेहतर समाधान की तलाश में हूं।

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

नीचे मेरे वर्तमान कार्यान्वयन हैं। वर्तमान में कमरों में 2 या 3 या 4 दिशाओं में कोई निकास या निकास नहीं है।

कालकोठरी के कमरे बनाना

सेटअप: वर्तमान कमरे को ऊपरी बाएँ कमरे में सेट करें।

  1. कमरे के लिए एक वैध कमरा प्रकार प्राप्त करें (जहाँ वैध कमरे का प्रकार एक प्रकार है जिसमें कालकोठरी से बाहर नहीं निकलता है और जो बाहर निकलता है जो ऊपर के कमरे और बाईं ओर के कमरे से बाहर निकलता है। केवल ऊपर की जाँच करने की आवश्यकता है। नीचे चरण 2 के कारण छोड़ दिया गया)।
  2. कमरे के नीचे रखें और एक्स-समन्वय को एक कदम आगे बढ़ाएं। यदि x-निर्देशांक कालकोठरी चौड़ाई से अधिक है, तो x-निर्देशांक को 0 पर सेट करें और y-निर्देशांक एक चरण को आगे बढ़ाएं। यदि y-निर्देशांक कालकोठरी ऊंचाई से अधिक है, तो हम कर रहे हैं।
  3. # 1 से दोहराएं।

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

यह देखने के लिए जाँच की जा रही है कि सभी कमरे जुड़े हुए हैं या नहीं

सेटअप: पथों का प्रतिनिधित्व करने वाले पूर्णांकों का 2 डी मानचित्र बनाएं और प्रविष्टियों को एक "अनप्रोसेस्ड" (अभी तक ट्रैवर्स नहीं किया गया) मान -1 से शुरू करें। प्रारंभ पथ इंडेक्स पूर्णांक सेट करें जो वर्तमान पथ का ट्रैक रखता है। वर्तमान कमरे को चेक करने के लिए कमरों के ढेर में जोड़कर शीर्ष बाएं कमरे में सेट करें।

  1. यदि स्टैक में जांच के लिए कमरे हैं, तो इसे कमरे के पथ सूचकांक को वर्तमान पथ सूचकांक पर सेट करें। यदि स्टैक में कोई कक्ष नहीं है, तो पथ अनुक्रमणिका बढ़ाएं और स्तंभ द्वारा पंक्ति, पंक्ति द्वारा स्तंभ को आगे बढ़ाकर एक कमरा प्राप्त करने का प्रयास करें, जब तक कि हमें एक कमरा नहीं मिलता है जिसे अभी तक संसाधित नहीं किया गया है। अगर कोई कमरा नहीं मिल सकता है, तो हम कर रहे हैं।
  2. यह देखने के लिए जांचें कि कमरे में बाईं ओर निकास है या नहीं। यदि यह पहले से ही वहाँ पर नहीं है, तो स्टैक के लिए बाएं कमरे को जोड़ दिया है।
  3. नीचे, दाईं और शीर्ष दिशाओं के लिए चरण 2 को दोहराएं (क्योंकि हम एक स्टैक का उपयोग कर रहे हैं, जिसका अर्थ है कि कमरे को दक्षिणावर्त क्रम में लगाया गया है, शीर्ष दिशा से शुरू होता है)।
  4. चरण 1 से दोहराएँ।
  5. यदि पथ सूचक गणना एक से अधिक है, तो डिस्कनेक्ट किए गए कमरे हैं।

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


1
क्या आपने पीसीजी विकी पर "डंगऑन जेनरेशन" की जाँच की है ? क्या यह आपके सवालों का जवाब देता है?
कोन्गुसबोंगस

@congusbongus सुनिश्चित करने के लिए उपयोगी पढ़ना। उस पेज पर लिंक किया गया डोनजोन जेनरेटर कमाल का है। धन्यवाद।
user1323245

जवाबों:


33

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

सबसे अच्छी सामान्य व्याख्या जो मैंने पढ़ी है वह द क्रॉनिकल्स ऑफ डोरेन (बैकअप उद्देश्यों के लिए अंत में संलग्न) में पाई गई है क्योंकि कोड में शामिल किए बिना प्रक्रिया को समझाता है, इस प्रकार पाठक को कार्यान्वयन को छोड़ देता है।

एक ही विषय पर दो अन्य ट्यूटोरियल, कोड के साथ मिल सकते हैं


बसपा के पेड़ का निर्माण

हम दीवार कोशिकाओं से भरे एक आयताकार तहखाने से शुरू करते हैं। हम इस कालकोठरी को पुनरावर्ती रूप से विभाजित करने जा रहे हैं जब तक कि प्रत्येक उप-कालकोठरी में लगभग एक कमरे का आकार न हो। कालकोठरी विभाजन इस ऑपरेशन का उपयोग करता है:

  • एक यादृच्छिक दिशा चुनें: क्षैतिज या ऊर्ध्वाधर विभाजन
  • एक यादृच्छिक स्थिति चुनें (ऊर्ध्वाधर के लिए x, क्षैतिज के लिए y)
  • तहखाने को दो उप-कालकोठों में विभाजित करें

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

अब हमारे पास दो सब-ड्यूजन्स ए और बी हैं। हम दोनों को एक ही ऑपरेशन लागू कर सकते हैं।

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

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

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

काल कोठरी का निर्माण

अब हम पेड़ के प्रत्येक पत्ते में यादृच्छिक आकार के साथ एक कमरा बनाते हैं। बेशक, कमरा संबंधित उप-कालकोठरी के अंदर होना चाहिए। बीएसपी के पेड़ के लिए धन्यवाद, हमारे पास दो अतिव्यापी कमरे नहीं हो सकते हैं।

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

गलियारों का निर्माण करने के लिए, हम पेड़ के सभी रिसावों के माध्यम से लूप करते हैं, प्रत्येक पत्ती को उसकी बहन से जोड़ते हैं। यदि दो कमरों की आमने-सामने की दीवारें हैं, तो हम एक सीधे गलियारे का उपयोग कर सकते हैं। और हमें Z आकार के गलियारे का उपयोग करना होगा।

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

अब हम पेड़ में एक स्तर ऊपर उठते हैं और पिता के उप-क्षेत्रों के लिए प्रक्रिया को दोहराते हैं। अब, हम दो उप-क्षेत्रों को एक लिंक के साथ या तो दो कमरों, या गलियारे और एक कमरे या दो गलियारों के बीच जोड़ सकते हैं।

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

हम इस प्रक्रिया को तब तक दोहराते हैं जब तक कि हम पहले दो सब-डंगेन्स ए और बी से जुड़ नहीं जाते

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


यह कुछ भी नहीं के लायक हो सकता है कि यह तकनीक कभी भी लूप नहीं बनाएगी, हालांकि मुझे यकीन नहीं है कि अगर कोई ऐसा तरीका है जिसके बिना अधिक यादृच्छिक गलियारे जोड़े बिना। अभी भी बहुत अच्छा जवाब, +1
वैलिटी

यह एक आशाजनक शुरुआत है। बस इसमें कुछ छोरों को जोड़ने के लिए एक तरीका जानने की जरूरत है, लेकिन मैं उस समस्या पर काम कर रहा हूं जो वर्तमान में मैं कर रहा हूं। धन्यवाद।
user1323245

2
अच्छा लगा! मुझे आईडी में दिलचस्पी थी इसलिए मैंने एक छोटा सा प्रयास किया। यादृच्छिक का उपयोग करते समय आपको सावधान रहने की आवश्यकता है अन्यथा बहुत ही अजीब परिणाम का पालन करेंगे। और मुझे आश्चर्य है कि अगर गलियारे को पुनरावर्ती विभाजन के दौरान ठीक से संभाला नहीं जाना चाहिए, क्योंकि मुझे गलियारों को पेड़ से बाहर बनाने का आसान तरीका नहीं दिखता है। वैसे भी किसी के लिए भी दिलचस्पी की बेला यहाँ है: jsfiddle.net/gamealchemist/xt57zwb8
GameAlchemist

जबकि मुझे यह कुछ हद तक बड़े वातावरण में दोहराए जाने वाले प्रक्रियात्मक रूप से समस्याग्रस्त लगता है। यह संभवतः इस तरह की पीढ़ी के लिए मैंने कभी देखा सबसे अच्छा तरीकों में से एक है, बशर्ते आप एक ही बार में अपना संपूर्ण स्तर उत्पन्न कर रहे हों। I +1 यह
वह बेघर गाय

4

बसपा विधि जाहिरा तौर पर तहखानों पैदा करने के लिए सबसे लोकप्रिय तरीका है, लेकिन यह केवल एक नहीं है।

पूर्णता के लिए मैं अपने लिए काम करने वाले जनरेटर की व्याख्या करूँगा । मैं स्वीकार करने के लिए है कि मुझे याद है नहीं है जहां मैं इस बारे में पढ़ा तो मैं सिर्फ इतना कहना है कि यह मेरे आविष्कार नहीं है है (एक पुराने लेख द्वारा Jamis बक बहुत परिचित लग रहा है)।

कमरों के साथ एक भूलभुलैया

मूल विचार यह है कि एक कालकोठरी कमरे के साथ एक भूलभुलैया है, जैसे। तो इस एल्गोरिथ्म के लिए पहला कदम, एक भूलभुलैया उत्पन्न करने के लिए है :

ऐल एल्गोरिथ्म की विविधता के साथ उत्पन्न भूलभुलैया

अगला कदम इसे विरल बनाना है (मृत सिरों को हटा दें):

विरल बनाओ: मृत सिरों को हटा दें

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

फिर, चरण 4 के लिए, हमें पृथक कोशिकाओं को हटाने की आवश्यकता है:

पृथक कोशिकाओं को हटा दें

इस बिंदु पर हम गलियारों के साथ कर रहे हैं और हम कमरे जोड़ने के लिए तैयार हैं। उसके लिए हम निम्नलिखित कार्य करते हैं:

  1. कमरों का एक समूह (चौड़ाई और ऊंचाई) उत्पन्न करें
  2. प्रत्येक कमरे के लिए हम सभी संभावित स्थानों के माध्यम से पुनरावृत्ति करते हैं और सर्वोत्तम स्थान तय करते हैं।
    • सर्वोत्तम स्थान की गणना परिस्थितियों के लिए एक वजन जोड़कर की जाती है (जैसे कि गलियारे के निकटता)।
  3. हम कमरों को जगह देते हैं।

अब तक, हमारे कालकोठरी इस तरह दिखेगा: कमरे जोड़े गए

अंतिम चरण सजावट जोड़ना है।

दरवाजे और कमरे की संख्या ड्रा करें

कुछ अंतिम विचार

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

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