টাওয়ার ডিফেন্স গেমের জন্য গতিশীল প্যাথিং অ্যালগরিদম


16

আমি একটি টাওয়ার প্রতিরক্ষা তৈরি করছি এবং এর জন্য আমার একটি ভাল পথের অ্যালগরিদম প্রয়োজন।

আমি ডিজকস্ট্রা সম্পর্কে ভেবেছি তবে আমার একটি দরকার যা গতিশীল হতে পারে; যখন একটি কিনারা সম্পূর্ণ পুনর্নবীকরণ ছাড়াই মুছে ফেলা হয় বা যুক্ত করা হয় তখন এটি অবশ্যই নিজেকে আপডেট করতে সক্ষম হবে।

যদি এটি সাহায্য করে তবে আমি সি # তে কোডিং করছি।

উত্তর:


8

আপনি সন্ধান করছেন এমন গুরুত্বপূর্ণ কিছু না থাকলে আপনি সাধারণত এ * ব্যবহার করতে চান।


আমি যদি এ * এর সাথে তেমন পরিচিত না হই তবে কীভাবে পরিবর্তনশীল পরিবেশগুলিকে আমি সম্বোধন করব? প্রতিটি ফ্রেমে পুনরায় গণনা করবেন? সংঘর্ষে?
জাস্টিন এল।

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

6
যদি এটি অলস হয় তবে আমার প্রস্তাবনাগুলি: প্রতিটি জনতার জন্য পথ গণনা করবেন না। সম্ভবত, তারা সবাই একই পথ নিচ্ছে। আমি কেবল নতুন টাওয়ার বসানোতে পুনঃসংযোগ করেছি, এবং টাওয়ারটি বর্তমান পথে রয়েছে । তারপরেও, শুধুমাত্র ব্লক স্কোয়ারের আগে পথের পয়েন্টগুলিতে দানবদের জন্য পুনরায় গণনা করুন, এটি অতীতের ভিড়গুলির পক্ষে নয় এবং তাই যত্নশীল নয়। এবং তারপরে, পাথ ফাইন্ডিংটি আরও খাটো করার জন্য, আপনি এটিকে অবরুদ্ধ স্কোয়ারের পরে স্কোয়ারের সন্ধানের সীমাটি সীমাবদ্ধ করতে পারেন, যেহেতু সেখান থেকে আপনি ইতিমধ্যে পথটি জানেন।
seanmonstar

4
আসলে, "মুব" ইন্ডাস্ট্রি (এবং এমএমও / এমইউডি প্লেয়ার) "মোবাইল অবজেক্ট" এর জন্য লিঙ্গো।

3
নির্বিশেষে, এটি দীর্ঘস্থায়ী, এমইউডি 1 এর সাথে ডেটিং, এবং অনেকগুলি প্রকাশনাতে উপস্থিত হওয়ার পক্ষে যথেষ্ট স্ট্যান্ডার্ড। en.wikipedia.org/wiki/Mob_%28computer_gaming%29

19

আমার অনুরূপ সমস্যা সমাধান করার দরকার ছিল: ক্রমাগত "ব্যয়" এবং বাধা পরিবর্তন করে বড় ধাঁধা জাতীয় গ্রিডে পাথ ফাইন্ডিং।

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

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

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

আমার অ্যালগরিদম মূলত (সিউডো কোড) এর মতো কিছু ছিল:

update_node method in Node class:
    $old <- $my_score
    find $neighbor node among all neighbors such that
        $neighbor.score + distance_to($neighbor) is minimal
    $my_score <- $neighbor.score + distance_to($neighbor)
    $next_node <- $neighbor
    if ($my_score != $old)
        for each $neighbor
            $neighbor.update_node()

নোড একটি লক্ষ্য বা কোনও ধরণের বাধা কিনা তার উপর নির্ভর করে প্রাথমিক স্কোর সহ।


1
সিপিইউ লোড পরিবর্তনের সাথে সাথে এটিকে ফ্রেমের বাইরেও গতিশীলভাবে ছড়িয়ে দেওয়া সহজ হবে।
টেন্পেন

এ * ব্যবহারের জন্য সঠিক অ্যালগরিদম না হওয়ার জন্য +1।
রিকিট

5

আমি আমার টিডিতে যে রুট অ্যালগরিদমটি ব্যবহার করেছি সেগুলি খেলায় আমার সংখ্যার সত্তার কারণে স্বাভাবিক এ * পাথের থেকে পিছনে ছিল। গোল থেকে খারাপ লোকদের দিকে যাওয়ার পরিবর্তে, আমি গোল থেকে বোর্ডের প্রতিটি খালি স্কোয়ারে চলে এসেছি।

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

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

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

আরেকটি সুবিধা হ'ল প্রতিবারই বাধাগুলি সামঞ্জস্য করার সময় আপনাকে এই কাজটি চালাতে হবে (বা আমার খেলায় যখন কোনও টুকরোটি আপনার টাওয়ারের মধ্যে দিয়ে খায়)। প্রতিবার কোনও ক্রিপ / ভিড় মাঠে প্রবেশ করে না (যা প্রতি সেকেন্ডে কয়েক হাজার ভিড় এবং দশ সহস্র মাথাব্যথা হয়ে উঠত)।


4

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


1
এটি লক্ষণীয় যে টাওয়ার ডিফেন্স মোবাইল ফোনে জনপ্রিয়, যেখানে পাথফাইন্ডিং দ্রুত নয় । বিশেষত সাইডিকিক বা অ্যান্ড্রয়েড 1.6 ডিভাইসের মতো কিছুটা পুরানো ডিভাইসে।
seanmonstar

1
বিকাশকারীরা কয়েক দশক ধরে অনেক কম শক্তিশালী হার্ডওয়্যারে এ * এবং ডিজকস্ট্রার মতো প্যাথফাইন্ডিং অ্যালগরিদম ব্যবহার করে আসছেন (মনে করুন গেম বয়)। গেমিংয়ের জন্য পর্যাপ্ত পর্দা পাওয়ার জন্য নতুন যে কোনও ফোনে কোনও সমস্যা হওয়া উচিত নয়, অবশ্যই এই বাস্তবায়ন যথাযথভাবে দক্ষ। এখানে কিছু নিফটি অপ্টিমাইজেশান আলোচনা করা হয়েছে: harablog.files.wordpress.com/2009/06/beyondastar.pdf
মাইক স্ট্রোবেল

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


2

এটি আপনার সমাধানের জন্য ওভারকিল হতে পারে তবে ফরোয়ার্ডের পরিবর্তে পিছনের দিকে যাত্রা করার কথা ভাবেন।

একটি টিডি খেলায় শত্রুরা সাধারণত একটি নির্দিষ্ট লক্ষ্যে পৌঁছানোর চেষ্টা করে। প্রথম শত্রুতে সেই লক্ষ্য থেকে পিছনে যাত্রা করুন, তারপরে সেই পথটি ক্যাশে করুন। পরবর্তী শত্রুদের জন্য পাথ জেনারেশনে, প্রথম পাথটি একটি প্রারম্ভিক পয়েন্ট হিসাবে ব্যবহার করুন ইত্যাদি। আপনার যদি একাধিক শত্রু এনট্রেস পয়েন্ট বা একাধিক লক্ষ্য থাকে তবে প্রারম্ভিক প্রাক-ক্যাশেড পথ রয়েছে range


1

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


এটি কেবলমাত্র সেই টিডি গেমগুলির জন্যই কাজ করে যেখানে আপনি কেবল পথের পাশের বারান্দাগুলি রাখতে পারেন - এমন গেমস নয় যা বোর্ডের যে কোনও জায়গায় টাওয়ার স্থাপনের অনুমতি দেয়।
আয়ান

হ্যাঁ প্রথমদিকে লেখক কোন ধরণের তিনি চেয়েছিলেন তা নির্দিষ্ট করে দেয়নি তাই আমি অ ডায়নামিক ধরে নিয়েছি।
লোকটার 18

1

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

নোট করুন যে কয়েকটি টিডি গেমগুলির একটি নির্দিষ্ট পথ রয়েছে এবং আপনাকে এতে টাওয়ার স্থাপনের অনুমতি দেয় না, সুতরাং তারা সহজেই পাথ ফাইন্ডিং সমাধান করে: কোনও পথ হার্ডকোড করে এবং আপনাকে এটিকে অবরুদ্ধ না করে :)


1

একটি সহজ সমাধান প্রতারণা করা হয়।

কোনও মৃত প্রান্ত নেই তা নিশ্চিত করতে আগে থেকেই মানচিত্রটি ডিজাইন করুন। তারপরে প্রতিটি ছেদগুলিতে একটি ট্রিগার যুক্ত করুন যা চরিত্রটিকে কোনও রুট বেছে নিতে দেয় (উদাহরণস্বরূপ: সর্বদা বাম দিকে ঘুরুন, সর্বদা ডানদিকে ঘুরুন বা এলোমেলো)।


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