कुशलता से बाधाओं के आसपास कई झुंड दुश्मनों को पथभ्रष्ट करना


20

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

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

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

क्या यह एक व्यवहार्य समाधान है? मैं अपने खेल इंजन के रूप में Slick2D के साथ जावा का उपयोग कर रहा हूं। या वहाँ एक बेहतर समाधान / एल्गोरिथ्म है जो इन दोनों समस्याओं से निपटता है?


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

1
आप उन्हें कैसे लागू करते हैं प्रदर्शन को प्रभावित करता है। उदाहरण के लिए, केवल नेताओं पर A * चल रहा है और अनुयायियों के लिए झुंड पर निर्भर है।
पिकालेक

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

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

जवाबों:


49

यह फ्लो फील्ड्स के लिए उपयोग के मामले जैसा लगता है।

इस तकनीक में, आप अपने प्लेयर ऑब्जेक्ट (आउट) से एक सिंगल पाथफाइंडिंग क्वेरी करते हैं, प्रत्येक सेल को उस सेल से चिन्हित करते हैं, जिस सेल से आप पहुँचे हैं।

यदि आपकी सभी टाइलों / किनारों पर समान ट्रैवर्सल लागत है, तो आप इसके लिए एक सरल चौड़ाई-पहली खोज का उपयोग कर सकते हैं। अन्यथा, दिक्जस्ट्रा का एल्गोरिथ्म (जैसे ए * बिना किसी लक्ष्य / अनुमान के साथ) काम करता है।

यह एक प्रवाह क्षेत्र बनाता है: एक लुकअप तालिका जो प्रत्येक सेल को उस स्थिति से निकटतम खिलाड़ी ऑब्जेक्ट की ओर अगले चरण के साथ जोड़ती है।

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

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

सटीक रूप से जहां ब्रेक-इवन पॉइंट हिट होता है, व्यक्तिगत A * से सस्ता होना, A से * ज्ञापन सस्ता होना (जहां आप पिछले पाथफाइंडिंग क्वेरी के लिए कुछ परिणामों का पुनः उपयोग करते हैं, अगले एक को गति देने के लिए), फ़ील्ड्स को प्रवाहित करने के लिए सस्ता, आपके कार्यान्वयन, एजेंटों की संख्या और आपके नक्शे के आकार पर निर्भर करेगा। लेकिन अगर आप कभी भी एक सीमित क्षेत्र में कई दिशाओं से आने वाले दुश्मनों के एक बड़े झुंड की योजना बनाते हैं, तो एक प्रवाह क्षेत्र लगभग निश्चित रूप से iterated A * से सस्ता होगा।

एक चरम उदाहरण के रूप में, आप यहां 20 000 एजेंटों के साथ एक वीडियो देख सकते हैं , सभी एक साथ एक छोटे ग्रिड पर पाथफाइंग कर सकते हैं


यह तकनीक वास्तव में साफ-सुथरी लगती है। मैं इसे देख लूँगा।
डारिन ब्यूड्रेउ

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

1
टकराव से बचने के बारे में क्या? वह (कुछ) ओपी में वर्णित है (खिलाड़ी तक पहुंचने पर क्लिपिंग से बचना)। मुझे लगता है कि आप हर बार कुछ भी स्थानांतरित (या कुछ अतिरिक्त तर्क में) पूर्ण djikstras फिर से करना होगा
मंगल

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

3
@ Luaan टाइल आधारित खेल में, आपको आश्चर्य होगा कि टक्कर कितनी बार होती है। व्यक्तिगत रूप से, मुझे "कतारबद्ध" विकल्प इष्टतम से कम है। इसके अलावा, यदि इकाइयाँ एक-दूसरे से नहीं गुज़र सकती हैं, तो जब आपको इकाइयाँ अपने अंतिम स्थान और दूसरे किनारे के मामलों के समूह में मिलनी शुरू होंगी, तो आपको पुनर्गणना करनी होगी। आलिंगन कठिन है;)
मंगल

8

A * प्रदर्शन भारी नहीं है। मैं एल्गोरिदम को अलग करके इस स्थिति से संपर्क करूंगा। समय-समय पर ए और बीच में चेक करें कि क्या अगला कदम कदम उठाने के लिए स्वतंत्र है या आपको चोरी की जरूरत है।

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

मैट बकलैंड द्वारा "स्टेटिंग गेम एआई बाय उदाहरण" पुस्तक को पढ़ने के लिए यहां परिमित राज्य मशीनों के साथ काम करना सबसे अच्छा है। पुस्तक आपकी समस्या के लिए सिद्ध तकनीक प्रदान करती है और आवश्यक गणित का विवरण देती है। पुस्तक का स्रोत कोड वेब पर उपलब्ध है; पुस्तक सी ++ में है लेकिन कुछ अनुवाद (जावा सहित) उपलब्ध हैं।


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

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

4

न केवल यह संभव है, मेरा मानना ​​है कि यह 90 के दशक में एक व्यावसायिक खेल में किया गया था - बैटलज़ोन (1998)।

उस गेम में नि: शुल्क गैर-टाइल-आधारित आंदोलन और टाइल-आधारित आधार निर्माण के साथ 3 डी इकाइयां थीं।

यह काम करने के लिए लग रहा था:

सबसे पहले, A * या ऐसा ही कुछ (A की भिन्नता होने की संभावना A) कड़े सीमाओं के साथ कि यह कितना लंबा रास्ता खोज सकता है, इसलिए इसे चलाने में बहुत अधिक संसाधन नहीं लगते हैं लेकिन गंतव्य के लिए हमेशा एक रास्ता नहीं मिलता है) टाइल-आधारित बाधाओं में फंसने के बिना अपने गंतव्य तक पहुंचने के लिए एक होवरटेक के लिए एक रास्ता खोजने के लिए उपयोग किया जाएगा।

तब टैंक अंतरिक्ष के चारों ओर उड़ जाएगा जैसे कि वह अपने रास्ते में एक पास की टाइल के केंद्र की ओर आकर्षित हो गया था, और बाधाओं, अन्य पास के टैंकों, आदि द्वारा repulsed।


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