প্রতিবন্ধকতার আশপাশে অনেক ঝাঁক শত্রুদের দক্ষতার সাথে পথচলা


20

আমি আমার গেমের শত্রুদের জন্য প্যাথফাইন্ডিং উন্নত করার চেষ্টা করে কাজ করছি। এই মুহুর্তে, তারা মূলত কেবল নিজের এবং খেলোয়াড়দের মধ্যে কোণ গণনা করে সেই দিকটিতে অগ্রসর হয়ে প্লেয়ারের সঠিক অবস্থানের দিকে এগিয়ে যায়। আমার কাছে একটি ফ্লকিং অ্যালগরিদম রয়েছে যা শত্রুদের একে অপরের উপরে সজ্জিত করতে বাধা দেয়, তাই তারা একে অপরের মাধ্যমে ক্লিপ না করে গ্রুপে পরিণত হবে।

যাইহোক, এখন আমি একটি টাইল-ভিত্তিক মানচিত্র যুক্ত করেছি, উদাহরণস্বরূপ শত্রুদেরও বাধা এবং দেয়ালের আশেপাশে যেতে সক্ষম হতে হবে। আমি প্রথমে "নন-ওয়াকেবল" টাইলগুলির সাথে পৃথকীকরণের মান যুক্ত করার চেষ্টা করেছি যাতে ফ্লকিং অ্যালগরিদম দেয়াল এবং বাধাগুলি বস্তু থেকে দূরে সরে যেতে বিবেচনা করে। এটি সম্ভব হয়েছে কি না তা নিয়ে এখনও আমার কাজ করা হয়নি কারণ আমার প্রাথমিক পরীক্ষায় শত্রুরা অদৃশ্য একটি "প্রাচীর" মারছে যেখানে কোনও হাঁটা-চলার টাইলস নেই, তবুও কোনও কারণে তারা এটিকে আঘাত করে এবং বাইরে বেরিয়ে আসা শুরু করে।

আমি ভাবছিলাম যে এ * ব্যবহার করে প্লেয়ারের পাথ গণনা করার জন্য খুব পারফরম্যান্স ভারী হতে পারে এবং ক্লাম্পিং প্রতিরোধে ফ্লকিং অ্যালগরিদম ব্যবহার করুন। মূলত আমার গেমটি ওয়েভ-ভিত্তিক শ্যুটার হতে চলেছিল, তবে আমি হটলাইন মায়ামির শিরাতে এটি স্তর-ভিত্তিক করার সিদ্ধান্ত নিয়েছি, তাই সম্ভবত আমার মাঝে মাঝে কম শত্রু থাকবে, এবং আমি কেবল তৈরি করব তাদের শক্তিশালী।

এটি কি একটি কার্যকর সমাধান? আমি আমার গেম ইঞ্জিন হিসাবে স্লিক 2 ডি এর সাথে জাভা ব্যবহার করছি। অথবা এই উভয় সমস্যার মোকাবেলা করার একটি ভাল সমাধান / অ্যালগরিদম আছে?


7
আমি যেমন সম্পাদনাটিতে বর্ণনা করেছি, "এটি কি খুব ভারী" আপনার প্রোফাইলারকে জিজ্ঞাসা করার জন্য একটি প্রশ্ন, কারণ এটি আপনার বাস্তবায়ন, টার্গেট হার্ডওয়্যার, পারফরম্যান্স বাজেট এবং আপনার গেমের প্রসঙ্গে নির্ভর করবে - আপনি এবং আপনার প্রোফাইলার জানেন এমন সমস্ত স্টাফ ঘনিষ্ঠভাবে কিন্তু ইন্টারনেট অপরিচিত না। যদি আপনি দক্ষতার সাথে ঝাঁককে পথনির্দেশ করতে চান তবে আমরা সেগুলি সহায়তা করার জন্য কৌশলগুলি প্রস্তাব করতে পারি, তবে কেবল আপনার নিজের প্রোফাইলই আপনার প্রয়োজনের জন্য যথেষ্ট দক্ষ efficient আপনি যদি প্রোফাইল নির্দিষ্ট করে থাকেন এবং কোনও নির্দিষ্ট পারফরম্যান্স সমস্যা সনাক্ত করেন তবে আমরা কীভাবে এই সমস্যাটি সমাধান করতে পারি তা আপনাকে সহায়তা করতে পারি।
ডিএমগ্রিগরি

1
আপনি এগুলি কীভাবে প্রয়োগ করেন তা কার্যকারিতাকে প্রভাবিত করে। উদাহরণস্বরূপ, কেবল নেতাদের উপর এ * চালানো এবং অনুসরণকারীদের ঝাঁকুনির উপর নির্ভর করা।
পিকালেক

যদি আপনার গেমটি প্রাথমিকভাবে এই শত্রুদের বিরুদ্ধে লড়াইয়ের উপর ভিত্তি করে থাকে, তবে আপনার নেওয়া অ্যালগরিদমটি গেমটি কেমন লাগে তার উপর ব্যাপক প্রভাব ফেলবে। সুতরাং আপনার বিভিন্ন পদ্ধতির চেষ্টা করা উচিত, উদাহরণস্বরূপ, শত্রুরা খেলোয়াড়ের স্তর এবং অবস্থান সর্বদা পুরোপুরি জানে এবং তারা তাকে সর্বজনবিদিত এআই দ্বারা পরিচালিত মত ট্র্যাক করে? - অন্যান্য পন্থাগুলি শত্রুদের সাধারণ দিকে চালাতে দেয় যেখানে প্লেয়ারটি শব্দ করে এবং কেবল তার দৃষ্টির সরাসরি লাইনে দৌড়ে যায়, বা চিত্কার করে এবং খেলোয়াড় যেখানে থাকে অন্য শত্রুদের অবহিত করে ...
ফ্যালকো

@ ফ্যালকো যেহেতু গেমটি আর তরঙ্গ-ভিত্তিক নয়, এবং এটি স্তর-ভিত্তিক হবে, এবং যেহেতু শত্রুরা জম্বি হয় ... আমি আপনাকে এটি তৈরি করার কথা ভাবছিলাম যাতে আপনাকে খুঁজে পেতে বা তাদের জন্য শব্দ করতে হবে। তাহলে আপনি যদি শোরগোলের অস্ত্র ব্যবহার করেন? এটি একটি পরিসরে একটি শব্দ এবং সমস্ত শত্রু নির্গত শব্দটির অবস্থানের দিকে পরিসীমা পথে বেরিয়ে আসে এবং এরপরে এলোমেলোভাবে সেই অঞ্চলটির চারপাশে চলে আসবে।
দারিন বিউড্রিউ

উত্তর:


49

এটি ফ্লো ফিল্ডগুলির জন্য ব্যবহারের মতো শোনাচ্ছে।

এই কৌশলটিতে, আপনি আপনার প্লেয়ার অবজেক্ট (গুলি) থেকে বাইরের দিকে একটি একক পাথফাইন্ডিং ক্যোয়ারী করেন, আপনি যে ঘরে পৌঁছেছেন সেটির সাথে আপনার দেখা প্রতিটি কক্ষ চিহ্নিত করে।

যদি আপনার সমস্ত টাইলস / প্রান্তগুলির সমান ট্র্যাভার্সাল ব্যয় হয় তবে আপনি এটির জন্য একটি সাধারণ প্রস্থের প্রথম অনুসন্ধানটি ব্যবহার করতে পারেন। অন্যথায়, ডিজকস্ট্রার অ্যালগরিদম (কোনও লক্ষ্য / হিউরিস্টিকবিহীন এ * এর মতো) কাজ করে।

এটি একটি প্রবাহ ক্ষেত্র তৈরি করে: একটি সন্ধানের টেবিল যা প্রতিটি কক্ষকে সেই অবস্থান থেকে নিকটতম প্লেয়ার অবজেক্টের দিকে পরবর্তী পদক্ষেপের সাথে সংযুক্ত করে।

এখন আপনার শত্রুরা প্রত্যেকে প্রবাহের ক্ষেত্রের তাদের বর্তমান অবস্থানটি সন্ধান করতে পারে তাদের নিকটতম খেলোয়াড় অবজেক্টের প্রতি তাদের স্বল্পতম বাধা-এড়ানো পথের পরবর্তী পদক্ষেপের জন্য, প্রত্যেকে তাদের নিজস্ব পাথফাইন্ডিং কোয়েরি না করে।

আপনার পালগুলিতে আপনার যত বেশি শত্রু রয়েছে এটি এই স্কেল আরও ভাল এবং ভাল better একক শত্রুর পক্ষে এটি * এর চেয়ে বেশি ব্যয়বহুল কারণ এটি পুরো মানচিত্রটি অনুসন্ধান করে (যদিও আপনি একবারে সমস্ত পাথফাইন্ডিং এজেন্টদের কাছে পৌঁছে গেলে আপনি তাড়াতাড়ি বেরিয়ে আসতে পারেন)। তবে আপনি আরও শত্রু যুক্ত করার সাথে সাথে তারা একবারে ওভারের পরিবর্তে ভাগ করে নেওয়া পাথ বিভাগগুলিকে গণনা করে আরও বেশি করে পাথফাইন্ডিং ব্যয় ভাগ করে নেবে। আপনি বিএফএস / ডিজক্ট্রার এ * এর চেয়ে সহজতর এবং পরিদর্শনকৃত প্রতি সেল মূল্যায়নের জন্য সস্তা ব্যয় থেকেও আপনি একটি প্রান্ত অর্জন করতে পারেন।

ঠিক যেখানে বিরতি-সমাপ্তি বিন্দু হিট হয়, স্বতন্ত্র এ * সস্তায় এ থেকে * মেমোয়েজেশন কম সস্তা হয় (যেখানে আপনি পরবর্তীগুলির গতি বাড়ানোর জন্য কোনও অতীত পথনির্দেশক প্রশ্নের জন্য কিছু ফলাফল পুনরায় ব্যবহার করেন), ক্ষেত্রগুলি প্রবাহিত করতে সস্তা, আপনার প্রয়োগ, এজেন্টের সংখ্যা এবং আপনার মানচিত্রের আকারের উপর নির্ভর করবে। তবে আপনি যদি কোনও সীমিত অঞ্চলে একাধিক দিক থেকে আগত শত্রুদের একটি বৃহত ঝাঁকির পরিকল্পনা করেন তবে একটি প্রবাহ ক্ষেত্র অবশ্যই পুনরাবৃত্ত এ * এর চেয়ে কম সস্তা হবে।

চরম উদাহরণ হিসাবে, আপনি এখানে 20,000 এজেন্ট সহ একযোগে যুক্তিসঙ্গতভাবে ছোট গ্রিডে পাথ ফাইন্ডিং সহ একটি ভিডিও দেখতে পারেন


এই কৌশলটি সত্যিই ঝরঝরে শোনাচ্ছে। আমি তা চেক আউট করব.
ডারিন বিউড্রিউ

15
একটি হাইব্রিড অ্যালগরিদম ব্যবহার করা সম্ভব যা এ * এর কাছে বারবার কল করার চেয়ে মানচিত্রের বেশি অনুসন্ধান না করে আংশিক প্রবাহ ক্ষেত্র তৈরি করে এবং কখনও একই পজিশনে দু'বার অনুসন্ধান না করে। মূল ধারণাটি হ'ল একটি স্বেচ্ছাচারী শত্রু বাছাই করা এবং সেই শত্রুটির দিকে খেলোয়াড়ের কাছ থেকে একটি * অনুসন্ধান শুরু করা, সাধারণ প্রবাহ ক্ষেত্রের প্রজন্মের মতোই কোষগুলির মুখোমুখি হওয়ার সাথে সাথে চিহ্নিত করুন। অনুসন্ধানটি সেই শত্রুটিকে একবার খুঁজে পেলে, অন্য শত্রুটিকে লক্ষ্য হিসাবে বেছে নিন (যা আপনি এখনও খুঁজে পাননি), নতুন হিউরিস্টিক অনুসারে খোলা সেটটি পুনরায় সাজান এবং অনুসন্ধান চালিয়ে যান। আপনি যখন সমস্ত শত্রু পেয়েছেন তখন থামুন।
ইলমারি করোনেন

1
সংঘর্ষ এড়ানো সম্পর্কে কী? এটি (কিছুটা) ওপিতে উল্লেখ করা হয়েছে (প্লেয়ারের কাছে পৌঁছালে তারা ক্লিপিং এড়ানো)। আমার মনে হচ্ছে আপনি সম্পূর্ণ djikstras প্রত্যেক সময় কিছু সরানো পুন: প্রকাশ করতে হবে (অথবা কিছু অতিরিক্ত যুক্তিবিজ্ঞান মধ্যে যোগ করুন)
মঙ্গল

2
@ মার্স ওপি ঝাঁকুনির কথা বলে, তাই আমি ধরে নেব যে সমস্ত ব্যক্তি একই গতিতে চলতে পারে; যে জায়গাগুলিতে সংঘর্ষের ঘটনা ঘটবে কেবল সেগুলি হ'ল বাধা, যা থামতে এবং অপেক্ষা করতে কিছু ঝাঁক প্রয়োজন। তবে, এটি অবশ্যই পাথপথটি পরিবর্তন করার দরকার নেই - একটি সাধারণ কাত সম্ভবত বেশিরভাগ ক্ষেত্রে যথেষ্ট ভাল কাজ করবে এবং কিছু পথ বাইসিং (কিছু অনুরূপ ব্যয়ের বিকল্প বিকল্পের সিউডো-এলোমেলো নির্বাচন) আরও প্রাকৃতিক দেখায় এমন ঝাঁক তৈরি করতে কাজ করবে প্রবাহগুলি যা পুরো
ঝাঁককে

3
@ লুয়ান একটি টাইল ভিত্তিক গেমটিতে, আপনি প্রায়ই অবাক হয়ে যাবেন যে সংঘর্ষগুলি প্রায়ই ঘটে। ব্যক্তিগতভাবে, আমি "কুইউং" বিকল্পটি অনুকূলের চেয়ে কম হতে দেখি। এছাড়াও, ইউনিটগুলি একে অপরের মধ্য দিয়ে যেতে না পারলে, ইউনিটগুলি যখন তাদের চূড়ান্ত অবস্থানে এবং অন্য প্রান্তের মামলায় একসাথে প্রবেশ শুরু করে তখন আপনাকে পুনরায় গণনা করতে হবে। Flocking কঠিন;)
মঙ্গল

8

এ * পারফরম্যান্স ভারী নয়। আমি অ্যালগরিদমগুলি পরিবর্তিত করে এই পরিস্থিতিতে পৌঁছাতে চাই। পরের ধাপে ধাপে মুক্ত বা আপনার ফাঁকা দরকার কিনা তা পরীক্ষা করে নিন এবং সময়ে সময়ে একটি করুন।

উদাহরণস্বরূপ, A * লক্ষ্য অবস্থান থেকে খেলোয়াড়দের দূরত্বটিকে ট্র্যাক করুন, যদি এটি একটি প্রান্তিকের উপরে থাকে * একটি পুনরায় গণনা করে এবং তারপরে আপডেটের চলাচল করে। বেশিরভাগ গেমগুলিতে ওয়ে পয়েন্টগুলির সংমিশ্রণ ব্যবহার করা হয়, উদাহরণস্বরূপ পাথ সন্ধানের জন্য একটি সরল গ্রিড এবং একটি যুক্তি যা রেইকাস্টগুলি ব্যবহার করে স্পিয়ার স্টিয়ারিং অ্যালগরিদমগুলির সাথে ওয়েপ পয়েন্টগুলির মধ্যে চলাচল পরিচালনা করে। এজেন্টরা তাদের সান্নিধ্যে বাধার আশ্রয় নিয়ে দূরপাল্লার দিকে যাওয়ার চেষ্টা করে আমার মতে সেরা পন্থা।

এখানে সীমাবদ্ধ রাষ্ট্রের মেশিনগুলির সাথে কাজ করা এবং ম্যাট বাকল্যান্ডের "প্রোগ্রামিং গেম এআই বাই উদাহরণ" বইটি পড়া ভাল। বইটি আপনার সমস্যার জন্য প্রমাণিত কৌশল এবং প্রয়োজনীয় গণিতের বিশদ সরবরাহ করে। বই থেকে উত্স কোড ওয়েবে উপলব্ধ; বইটি সি ++ তে রয়েছে তবে কয়েকটি অনুবাদ (জাভা সহ) উপলভ্য।


2
একটি অবিচ্ছিন্নভাবে আপডেট হওয়া * * পদ্ধতির সাহায্যে আপনার আপডেটগুলি আটকে রাখতে সহায়ক হতে পারে, একক ফ্রেমে কত শত্রুকে পুনরায় পথে চলার অনুমতি দেওয়া হয়েছে তার বাজেট বজায় রাখা। এইভাবে আপনি প্রতি ফ্রেম কেপড আপনার শিখর প্যাথফাইন্ডিং ব্যয়টি ধরে রাখতে পারেন এবং অনেকগুলি ফ্রেমের উপরে মোট ব্যয়কে মূল্যবান করে আরও অনেক শক্তিশালীভাবে এআই পাথ পরিচালনা করতে পারেন। ফ্রেমের বাজেট ছাড়িয়ে গেলে বা ফ্রেমের জন্য বাজে পথ ব্যবহার করে এমন একটি এআই, অথবা কাছাকাছি থাকলে মৃত গণনার পিছনে পড়ে গেলে সাধারণত বিঘ্নিত হবে না।
ডিএমগ্রিগরি

2
সম্ভবত এখানে সুস্পষ্ট বক্তব্য রেখেছেন, তবে আপনি যদি কেবল একটি নির্দিষ্ট ফ্রেমে আপনার কয়েকটি পথ আপডেট করতে চলেছেন তবে আপনি প্লেয়ারের দূরত্বের ভিত্তিতে একটি অগ্রাধিকার ব্যবস্থা চাইবেন। প্লেয়ারের কাছাকাছি থাকা শত্রুদের পক্ষে তাদের পাথগুলি আপডেট করা সম্ভবত এটি আরও গুরুত্বপূর্ণ, যদিও দূরের শত্রুদের পক্ষে বাসি পথ ব্যবহার করা সম্ভবত এটি ঠিক।
এসি

4

এটি কেবল সম্ভাব্য নয়, আমি বিশ্বাস করি এটি 90 এর দশকে বাণিজ্যিক গেমটিতে হয়েছিল - ব্যাটলজোন (1998)।

এই গেমটিতে ফ্রি নন-টাইল-ভিত্তিক চলন এবং টাইল ভিত্তিক বেস নির্মাণ সহ 3 ডি ইউনিট রয়েছে।

এটি দেখে মনে হচ্ছে এটি কাজ করেছে:

প্রথমত, এ * বা অনুরূপ কিছু (সম্ভবত কোনও পথ এটি কতক্ষণ সন্ধান করতে পারে তার কঠোর সীমা সহ এ * এর প্রকরণ, তাই এটি চালাতে কখনই খুব বেশি সংস্থান লাগে না তবে সর্বদা গন্তব্যের সমস্ত পথ খুঁজে পায় না) টাইল-ভিত্তিক বাধা না পেয়ে কোনও গন্তব্যস্থলে যাওয়ার জন্য হোভারট্যাঙ্কের জন্য একটি পথ খুঁজে বের করা হবে।

তারপরে ট্যাঙ্কটি শিবিরহীন স্থানের আশেপাশে উড়ে যেত যেন এটি কোনও পথের নিকটবর্তী টাইলের কেন্দ্রে আকৃষ্ট হয় এবং প্রতিবন্ধকতা, নিকটবর্তী অন্যান্য ট্যাঙ্কগুলি ইত্যাদির দ্বারা প্রতিরোধ করা হয় etc.


1
সুতরাং পথ অনুসরণ করে পরিচালনা করার একটি ভাল উপায় কি তবে ঠিক নয়? যদি আমি কিডি কর্নিংয়ের অনুমতি দিই, তবে আমার শত্রুদের কোনও বাধার কোণে সংঘর্ষ করা থেকে বিরত রাখতে সক্ষম হওয়া দরকার। শত্রু এবং বাধা উভয়ের জন্যই কি আমার ঝাঁকুনির আচরণ চালিয়ে যাওয়া উচিত এবং এই পরিস্থিতিগুলি মোকাবেলায় A * যুক্ত করা উচিত?
ডারিন বিউড্রিউ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.