সংযুক্ত পাথ সহ পদ্ধতিগত 2D মানচিত্রের জন্য অ্যালগরিদম


26

সমাধান করতে সমস্যা: একটি টাইল ভিত্তিক গেমের জন্য যেখানে সমস্ত কক্ষগুলি সংযুক্ত রয়েছে তার জন্য এলোমেলো 2D অন্ধকারের মানচিত্র তৈরি করুন।

আমার বর্তমানে যা আছে তার থেকে আমি আরও ভাল সমাধানের সন্ধান করছি।

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

নীচে আমার বর্তমান বাস্তবায়ন রয়েছে। রুমগুলিতে বর্তমানে কোনও 2, 3 বা 4 দিকের কোনও প্রস্থান বা প্রস্থান নেই।

অন্ধকূপ ঘর তৈরি

সেটআপ: বর্তমান ঘরটি উপরের বাম ঘরে সেট করুন।

  1. ঘরের জন্য একটি বৈধ কক্ষের ধরণ পান (যেখানে বৈধ কক্ষের ধরণটি অন্ধকূপের বাইরে প্রস্থান না করে এমন একটি প্রকার এবং যেখানে উপরের কক্ষের প্রস্থানটি এবং বাম দিকে ঘরের সাথে মেলে এমন প্রস্থান রয়েছে Only কেবল উপরে এবং নীচে চেক করতে হবে নীচে পদক্ষেপ 2 কারণে বাম)।
  2. ঘরটি নীচে রাখুন এবং এক-ধাপে এক্স-সমন্বিত স্থির করুন advance যদি x- স্থানাঙ্কটি অন্ধকূপটির প্রস্থকে ছাড়িয়ে যায়, x- স্থানাঙ্কটি 0 তে সেট করুন এবং y- স্থিতির এক ধাপ এগিয়ে যান। যদি y- স্থানাঙ্কটি অন্ধকূপটির উচ্চতা ছাড়িয়ে যায় তবে আমাদের কাজ শেষ।
  3. # 1 থেকে পুনরাবৃত্তি করুন।

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

সমস্ত কক্ষ সংযুক্ত আছে কিনা তা পরীক্ষা করা হচ্ছে

সেটআপ: পাথের প্রতিনিধিত্ব করে পূর্ণসংখ্যার একটি 2D মানচিত্র তৈরি করুন এবং "অপ্রসারণিত" (এখনও ট্র্যাভারসড হয়নি) মান, -1 এ এন্ট্রিগুলি আরম্ভ করুন। একটি সূচনা পথ সূচক পূর্ণসংখ্যা সেট করুন যা বর্তমানের পাথটিকে ট্র্যাক করে রাখে ১ এ। বর্তমান কক্ষটি চেক করার জন্য কক্ষের স্ট্যাকে যুক্ত করে উপরের বাম ঘরে সেট করুন।

  1. যদি স্ট্যাকটিতে চেক করার জন্য কক্ষ থাকে তবে পপ করুন এটি ঘরের পাথ সূচিটিকে বর্তমানের পথ সূচককে সেট করে। যদি স্ট্যাকটিতে কোনও কক্ষ না থাকে তবে পাথ সূচকটি বাড়িয়ে নিন এবং কলাম, সারিতে সারি কলাম দ্বারা অগ্রসর হয়ে একটি ঘর পাওয়ার চেষ্টা করুন যতক্ষণ না আমরা এমন একটি ঘর পাই যা এখনও প্রক্রিয়া করা হয়নি। যদি কোনও রুম না পাওয়া যায় তবে আমাদের কাজ শেষ।
  2. বামে রুমের একটি প্রস্থান আছে কিনা তা পরীক্ষা করে দেখুন। যদি এটি ইতিমধ্যে সেখানে না থাকে তবে যদি এটি স্ট্যাকের সাথে বাম ঘরটি যুক্ত করে।
  3. নীচে, ডান এবং উপরের দিকনির্দেশের জন্য দ্বিতীয় ধাপটি পুনরাবৃত্তি করুন (যেহেতু আমরা একটি স্ট্যাক ব্যবহার করছি যার অর্থ ঘরগুলি ঘড়ির কাঁটার দিক দিয়ে ক্রমযুক্ত, উপরের দিক দিয়ে শুরু করা)।
  4. পদক্ষেপ 1 থেকে পুনরাবৃত্তি করুন।
  5. পাথ সূচকগুলির গণনা যদি একের বেশি হয় তবে সংযোগ বিচ্ছিন্ন কক্ষ রয়েছে।

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


1
আপনি কি পিসিজি উইকিতে "অন্ধকার জেনারেশন" চেক আউট করেছেন ? এটি আপনার প্রশ্নের উত্তর দেয়?
কংগ্রেসবঙ্গাস

নিশ্চিতভাবে দরকারী কনডাক্ট। এই পৃষ্ঠায় লিঙ্কযুক্ত যে ডোনজন জেনারেটর দুর্দান্ত is ধন্যবাদ।
ব্যবহারকারী 1323245

উত্তর:


33

বাইনারি স্পেস পার্টিশন ব্যবহার করে ডানজিওনস তৈরি করে দেখেছি সেখানে সেরা এবং সর্বাধিক ব্যবহৃত আলগোরিদিমগুলির মধ্যে একটি।

আমি যে শ্রেষ্ঠ সাধারণ ব্যাখ্যাটি পড়েছি তা হ'ল দ্য ক্রোনিকালস অফ দরিয়েনের মধ্যে পাওয়া যায় (ব্যাকআপের জন্য শেষ দিকে সংযুক্ত) কারণ কোডটিতে না গিয়ে প্রক্রিয়াটি ব্যাখ্যা করে, ফলে বাস্তবায়নটি পাঠকের কাছে ছেড়ে যায়।

কোড সহ একই বিষয়ে আরও দুটি টিউটোরিয়াল পাওয়া যাবে


বিএসপি গাছ তৈরি করা

আমরা প্রাচীর কোষে ভরা একটি আয়তক্ষেত্রাকার অন্ধকূপ দিয়ে শুরু করি। প্রতিটি উপ-অন্ধকূপটির ঘরের আকার প্রায় না হওয়া পর্যন্ত আমরা এই অন্ধকূপটি পুনরাবৃত্তভাবে বিভক্ত করতে যাচ্ছি। অন্ধকূপ বিভাজন এই অপারেশনটি ব্যবহার করে:

  • একটি এলোমেলো দিক চয়ন করুন: অনুভূমিক বা উল্লম্ব বিভাজন
  • একটি এলোমেলো অবস্থান চয়ন করুন (উল্লম্ব জন্য এক্স, অনুভূমিক জন্য y)
  • অন্ধকূপটি দুটি উপ-অন্ধকূপে বিভক্ত করুন

এখানে চিত্র বর্ণনা লিখুন

এখন আমাদের দুটি এবং দুটি সাব-ডুনজোন রয়েছে এ এবং বি আমরা তাদের উভয়ের জন্য একই ক্রিয়াকলাপটি প্রয়োগ করতে পারি।

এখানে চিত্র বর্ণনা লিখুন

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

এখানে চিত্র বর্ণনা লিখুন

অন্ধকূপ নির্মাণ

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

এখানে চিত্র বর্ণনা লিখুন

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

এখানে চিত্র বর্ণনা লিখুন

এখন আমরা গাছের এক স্তরে উঠে পিতা উপ-অঞ্চলের জন্য প্রক্রিয়াটি পুনরাবৃত্তি করি। এখন, আমরা দুটি কক্ষ, বা করিডোর এবং একটি কক্ষ বা দুটি করিডোরের মধ্যে একটি লিঙ্কের সাথে দুটি উপ-অঞ্চল সংযুক্ত করতে পারি।

এখানে চিত্র বর্ণনা লিখুন

আমরা প্রথম দুটি সাব-ডুনজোন এ এবং বি সংযুক্ত না হওয়া পর্যন্ত আমরা প্রক্রিয়াটি পুনরাবৃত্তি করি

এখানে চিত্র বর্ণনা লিখুন


এই কৌশলটি কখনই লুপ তৈরি করতে পারে না এটির মূল্যহীন হতে পারে, তবে আমি নিশ্চিত নই যে আরও এলোমেলো করিডোর যোগ না করেই এর আশেপাশে কোনও উপায় আছে কিনা। এখনও খুব ভাল উত্তর, +1
মান 8

এটি একটি প্রতিশ্রুতিবদ্ধ শুরু। এটিতে কিছু লুপ যুক্ত করার জন্য কেবল একটি উপায় খুঁজে বের করতে হবে, তবে আমি বর্তমানে যে পথটি চালিয়ে যাচ্ছি তার চেয়ে চালিয়ে যাওয়ার চেয়ে সমস্যাটি নিয়ে কাজ করি। ধন্যবাদ।
ব্যবহারকারী 1323245

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

যদিও আমি বড় পরিবেশের উপরে পুনরাবৃত্তযোগ্য বীজযুক্ত পদ্ধতিতে এটি কিছুটা সমস্যাযুক্ত বলে মনে করি। এই ধরণের প্রজন্মের জন্য আমি একবার দেখা সেরা পদ্ধতির মধ্যে এটি সরবরাহ করে যা আপনি একবারে আপনার পুরো স্তরটি উত্পাদন করছেন। আমি এটি +1
সেই গৃহহীন গাই

4

বিএসপি পদ্ধতি দৃশ্যত dungeons, জেনারেট করার জন্য সবচেয়ে জনপ্রিয় পদ্ধতি, তবে এতে কেবলমাত্র একটি নয়।

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

কক্ষ সহ একটি গোলকধাঁধা

মূল ধারণাটি হ'ল একটি অন্ধকূপটি হ'ল ঘর, সাজানো ধাঁধা। সুতরাং এই অ্যালগরিদমের প্রথম পদক্ষেপটি একটি গোলকধাঁধা তৈরি করা :

এলিজার অ্যালগরিদমের পরিবর্তনের সাথে গোলকধাঁধা উত্পন্ন হয়েছে

পরের পদক্ষেপটি এটিকে বিচ্ছুরিত করা (মৃত প্রান্তগুলি সরিয়ে ফেলুন):

বিরল তৈরি করুন: মৃত প্রান্তগুলি সরান

৩ য় পদক্ষেপটি কয়েকটি লুপ যুক্ত করতে হবে (এটিকে নিখুঁত করে তুলুন ) তবে আমি চিত্রটি এড়িয়ে যাব কারণ এটি সবে লক্ষণীয় ( এই পয়েন্ট দ্বারা loops ছিল)।

তারপরে, চতুর্থ ধাপের জন্য আমাদের বিচ্ছিন্ন কক্ষগুলি সরিয়ে ফেলতে হবে:

বিচ্ছিন্ন কক্ষগুলি সরান

এই মুহুর্তে আমরা করিডোরগুলি সম্পন্ন করেছি এবং আমরা কক্ষগুলি যুক্ত করতে প্রস্তুত। তার জন্য আমরা নিম্নলিখিতগুলি করি:

  1. কক্ষের একটি সেট তৈরি করুন (প্রস্থ এবং উচ্চতা)
  2. প্রতিটি কক্ষের জন্য আমরা সমস্ত সম্ভাব্য অবস্থানগুলি দিয়ে পুনরাবৃত্তি করি এবং সেরা অবস্থানটি স্থির করি।
    • কন্ডিশনে ওজন যুক্ত করে সবচেয়ে ভাল অবস্থান গণনা করা হয় (যেমন কোনও করিডোরের সংলগ্ন)।
  3. আমরা কক্ষগুলি রাখি।

এখনও অবধি, আমাদের অন্ধকূপটি এটির মতো দেখাবে: রুম যুক্ত করা হয়েছে

চূড়ান্ত পদক্ষেপটি সজ্জা যুক্ত করা হয়।

দরজা এবং ঘরের নম্বর আঁকুন

কিছু চূড়ান্ত চিন্তা

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

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