रॉगुलाइक भूलभुलैया पीढ़ी के लिए सबसे लंबा पथ एल्गोरिदम


10

मेरे पास कमरों से बना एक साधारण ग्रिड-आधारित नक्शा है, जैसे (ए = प्रवेश, बी = निकास):

   0 1 2 3
  #########
0 # बी # #####
  #########
1 # ### #
  #########
2 # # #
  # # #
3 # # #
  #########
4 # ### #
  #########
5 ### ए #
  ### #
6 ### #
  #########

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

दूसरे शब्दों में, मैं A से B तक के सबसे लंबे संभव मार्ग को खोजने का प्रयास कर रहा हूं ।

(मैं जानता हूँ कि इस समस्या को चक्रीय रेखांकन के लिए हल किया जा सकता है; हालाँकि, इस मामले में चक्र हो सकते हैं।)

EDIT: एक और उदाहरण जहां कमरे फ्लडफ़िल के उपयोग से जुड़े हैं, और प्रवेश द्वार से सबसे दूर के कमरे के रूप में चुना गया है:

   0 1 2 3
  #########
0 # बी # #
  # # - #####
1 # | # #
  ### # #
2 ### # #
  ### - # - ###
3 # | ###
  # - #######
4 #A | #
  # # #
5 # # #
  # # #
6 # # #
  #########

ध्यान दें कि बाहर निकलने का रास्ता सबसे लंबा संभव रास्ता नहीं है।


यदि आप खिलाड़ी को सबसे लंबा रास्ता तय करने के लिए मजबूर करते हैं, तो आप वास्तव में एक सीधा रास्ता बना रहे हैं जो जटिल होने का दिखावा करता है। ये गलत है।
ओ ० '।

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

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

जवाबों:


11

मुझे लगता है कि आप इस बारे में गलत तरीके से जा रहे हैं। चक्र के साथ एक ग्राफ में अधिकतम पथ तकनीकी रूप से अपरिभाषित है क्योंकि यह अनंत है अगर चक्र शुरू और अंत के बीच स्थित है। संभवत: ऐसे चतुर तरीके हैं जिनसे आप अधिकतम पथ की परिभाषा को बढ़ा सकते हैं / सीमित कर सकते हैं, लेकिन मुझे नहीं लगता कि यह सबसे अच्छा तरीका है।

आप एक वास्तविक लंबा रास्ता (उदाहरण के लिए एक नक्शे में अधिक से अधिक क्षेत्र का पता लगाने की कोशिश कर रहा एक रोबोट) मॉडल करने की कोशिश नहीं कर रहे हैं। आप बस कई कमरों का पता लगाने के लिए खिलाड़ी को लाने की कोशिश कर रहे हैं।

इसलिए, खिलाड़ी को अब तक खोजे गए नक्शे के प्रतिशत के बाहर निकलने के लिए आनुपातिक पाता है । मान लीजिए कि एक स्तर पर एक्स कमरे हैं, और खिलाड़ी के चरित्र ने वाई की खोज की है। अगली बार जब चरित्र एक कमरे में प्रवेश करता है, तो बाहर निकलने को च (वाई, एक्स) की संभावना के साथ रखें। F का एक तुच्छ उदाहरण हो सकता है (Y * Y) / (X * X) - उदाहरण के लिए 10 कमरों के लिए, अंतिम कमरे में 100% संभावना है, 81% संभावना यह अगले कमरे में है - और केवल a 1% मौका यह पहले कमरे में है।

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

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

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


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

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

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

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

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

6

एक संभावित विकल्प प्राइम / क्रुस्कल (चक्र को खत्म करने के लिए) का उपयोग करके एक फैले हुए पेड़ (अधिकतम?) का निर्माण करना होगा और फैले हुए पेड़ पर एक पारंपरिक सबसे लंबे पथ एल्गोरिथम को लागू करना होगा।

हालाँकि, मुझे चिंता है कि फैले हुए पेड़ के एल्गोरिथ्म में डेड-एंड शाखाएँ बनेंगी, जो खिलाड़ी को लगातार पीछे जाने के लिए मजबूर करती हैं।

EDIT: क्रुस्कल-आधारित एल्गोरिथ्म का उपयोग करने और सबसे लंबी शाखा के अंत में निकास रखने का परिणाम:

   0 1 2 3
  #########
0 # ए | #
  # ##### - #
1 # # #
  ### #
2 ### #
  ### #
3 ### #
  ### - #####
4 # | #
  # - ##### - #
5 # ### #
  # - #######
6 # # बी #
  # # - #
7 # | #
  #########

1
मैं प्राइमम को भी सुझाव देने जा रहा था :-), +1, मुझे लगता है कि बैकट्रैक बहुत सारे खेलों का एक महत्वपूर्ण हिस्सा है ... डायब्लो की जाँच करें 2.
Mr.Gando

2

यहाँ कुछ के साथ बेला है:

Connect each room with a door to another room.
N = 0.75*TotalNumberOfRooms
Until (pathSize > N) {
  Use A* pathing to get a path from A to B. (G being size of room, or # of monsters)
  if (pathSize < N) remove a connection/door
  if (noPath) choose a different door/connection
  if (room.doors < 1) choose a different door/connection
}

मैं रास्ते के साथ बेतरतीब ढंग से दरवाजे हटा देता हूं, अन्यथा आप बाहर निकलने पर 1 दरवाजे और अंत में दरवाजे के टन के साथ समाप्त होते हैं।

मुझे लगता है कि यह O(n^2)बड़े नक्शे के लिए बहुत अच्छा नहीं है।


सिद्धांत रूप में एक बहुत ही सुंदर समाधान। अगली बार, मुझे इस तरह की तकनीकों के लिए जाने से पहले कुछ सोचने की कोशिश करनी चाहिए।
उपयोगकर्ता

खैर, सुरुचिपूर्ण हो सकता है लेकिन यह एक प्रोसेसर हॉग होने जा रहा है। O (n ^ 2) बड़े नक्शे के साथ अच्छी तरह से स्केल नहीं होगा।
स्टीफन फुरलानी


1

मेरा मानना ​​है कि आपके पास पहले से ही शानदार उत्तर हैं, लेकिन यहां समस्या के सैद्धांतिक समाधान के लिए $ 0.02 है।

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

  1. अपने शुरुआती कमरे में शुरू करें। इसके प्रत्येक पड़ोसी को चिह्नित करें। वे शुरुआती कमरे से 1 दूरी पर हैं।
  2. 1 चिह्नित किए गए प्रत्येक कमरे के लिए, उसके प्रत्येक पड़ोसी के पास जाएं और उन्हें चिह्नित करें 2. वे शुरू से 2 दूरी की दूरी पर हैं।
  3. तब तक जारी रखें जब तक आप सभी कमरों को कवर नहीं कर लेते। अधिकतम संख्या वाला कमरा शुरू से सबसे दूर है।

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

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