ষড়ভুজ গ্রিডে সবচেয়ে সংক্ষিপ্ত পথ সন্ধান করা


14

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

আমি নিজেই এটি বের করার চেষ্টা করতে গিয়ে 4 টি দিক ব্যবহার করে কোনও সমস্যা নির্ধারণ করতে পারি

dx = currentX - targetY
dy = currentY - targetY

তবে আমি নিশ্চিত নই যে 6 টি দিকের মধ্যে কোনটি আসলে "সেরা" বা "সবচেয়ে সংক্ষিপ্ত" রুটটি নির্ধারণ করা যায়।

উদাহরণস্বরূপ, বর্তমানে এটির সেটআপটি আমি পূর্ব, পশ্চিম, NE, এনডাব্লু, এসই, এসডাব্লু ব্যবহার করি তবে NE টাইলটিতে পৌঁছানোর জন্য আমি কেবল NW না সরানোর পরিবর্তে পূর্বদিকে NW নিয়ে যাই।

আমি আশা করি এটি সমস্ত ঘোড়া ছিল না। এমনকি আমাকে শুরু করার জন্য মাত্র দু'একটি লিঙ্কই ভাল লাগবে। আমি যে তথ্য পেয়েছি তার বেশিরভাগটি গ্রিডগুলি অঙ্কন করা এবং প্রয়োজনীয় অদ্ভুত সমন্বয় ব্যবস্থাটি গ্রুক করা।


5
আপনার গ্রাফের আকার নির্বিশেষে একটি * আপনাকে সংক্ষিপ্ত পথ দেয় (গ্রিড, হেক্স, ফ্রিফর্ম ..)
জারি কম্প্পা

উত্তর:


21

কয়েকটি উত্তর!

হেক্স-ভিত্তিক ট্র্যাভারসাল জন্য আমি যে স্থানাঙ্ক সিস্টেমটি প্রায়শই দেখেছি তা হ'ল প্লেয়ার হ'ল এনএসডাব্লু, প্রতিটি এনএসডাব্লু, পাশাপাশি এনডাব্লু এবং এসই-তে যেতে পারে। তারপরে আপনি কেবল প্রতিটি সারিকে অর্ধ-বর্গাকার অফসেটটি উপস্থাপন করুন। উদাহরণস্বরূপ, অবস্থানটি (2,7) (1,7), (3,7), (2,6), (2,8), এবং অদ্ভুতগুলির সংলগ্ন হিসাবে বিবেচিত হয়: (1,6) এবং (3,8)। এদিকে, আমরা যদি ধরে নিই (2,7) পর্দার কেন্দ্রে উপস্থাপন করা হয়েছে, (2,6) ডানদিক থেকে ডানদিকে উপস্থাপন করা হবে, (2,8) নীচে এবং থেকে রেন্ডার করা হবে - বাম, (1,7) এবং (3,7) এটিকে যথাক্রমে বাম এবং ডানদিকে বন্ধনী দেবে এবং (1,6) এবং (3,8) যথাক্রমে উপরের-বাম এবং নীচে-ডানদিকে রাখবে।

আমার অর্থের একটি চিত্র:

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

যদি আপনি এটি এভাবেই চালিয়ে যাচ্ছেন তবে সবচেয়ে সংক্ষিপ্ত সরাসরি পথটি সন্ধান করা কঠিন নয় - আপনি আপনার টার্গেটকে কোনও কার্ডিনাল অক্ষ দ্বারা চালিত না করেই সর্বোচ্চ NW / SE দূরত্বে ভ্রমণ করতে পারেন, তবে সেই অক্ষটি বরাবর সরাসরি লক্ষ্যে ভ্রমণ করুন।

তবে অবশ্যই এটি আপনাকে সুখীভাবে সরাসরি পর্বতমালা বা অন্যান্য দুর্গম অঞ্চল দিয়ে চালাবে run আপনি এখনও জিজ্ঞাসা করেননি এমন প্রশ্নের উত্তর দেওয়ার জন্য: এ * সন্ধান অ্যালগরিদম পাথ ফাইন্ডিংয়ের পক্ষে একটি সাধারণ এবং যুক্তিসঙ্গতভাবে ভাল পন্থা। এটি কেবল অদ্ভুত নন-গ্রিড লেআউটগুলিই পরিচালনা করবে না, তবে আনন্দের সাথে বাধা এবং এমনকি বাধা / ধীর স্থলগুলিও মোকাবেলা করবে।


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

4
আমি বলছি যে আপনার রেন্ডার করা চিত্রটির অভ্যন্তরীণ কাঠামোর সাথে খুব একটা সাদৃশ্য থাকতে হবে না। আমি আপনাকে পরামর্শ দিচ্ছি যে অভ্যন্তরীণভাবে আপনি এনএসইডাব্লু এবং এনডাব্লু / এসই ব্যবহার করেন তবে আপনি এটি ব্যবহারকারীর কাছে এমনভাবে প্রদর্শন করেন যেন এটি গ্রিড। মূল জবাবের সাথে একটি ব্যাখ্যামূলক ডায়াগ্রাম যুক্ত করা হচ্ছে :)
জোর্বাথুত

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

2
@ পান্ডপাজামা: দক্ষভাবে আয়তক্ষেত্রাকার মানচিত্র সংরক্ষণের জন্য জাগড ভাল কাজ করে; আপনি এই কৌশলটি দিয়ে অ-দাগযুক্ত স্থানাঙ্কগুলি সুন্দরভাবে কাজ করতে পারেন
amitp

2
@ পান্ডপাজামা, আপনি ব্যবহার করতে পারেন এমন আরও একটি আকর্ষণীয় কৌশল - আপনি স্থানাঙ্কগুলির জন্য নন-জগড উপস্থাপনা ব্যবহার করতে পারেন, তারপরে "জাগড" পদ্ধতিটি ব্যবহার করে এমন কোনও কিছুর পিছনে আপনার ডেটা স্টোরেজটির জন্য ব্যাকিং অ্যাবস্ট্রাক্ট করুন। আমি খুঁজে পেয়েছি যে নন-জ্যাগডের সমন্বয় ব্যবস্থাটি মোকাবেলা করা আরও সহজ তবে অবশ্যই এটি একবার বিমূর্ত হয়ে গেলে, ব্যাকএন্ড জিনিসগুলি দক্ষ করে তুলতে যা পছন্দ করতে পারে তা করতে পারে :)
জোর্বাথুত

5

আমি এখানে কোডপ্লেক্স.কম-এ হেক্স-গ্রিড ইউটিউটের একটি লাইব্রেরি পোস্ট করেছি: https://hexgridutilities.codeplex.com/ লাইব্রেরিতে পাথ সন্ধান (এ- * একটি লা এরিক লিপার্ট ব্যবহার করে) অন্তর্ভুক্ত রয়েছে এবং এর মধ্যে স্বয়ংক্রিয় রূপান্তরকরণের জন্য ইউটিউটিস অন্তর্ভুক্ত রয়েছে জ্যাগড (চিহ্নিত ব্যবহারকারী) কর্ডিনেটস এবং নন-জ্যাগড (ক্যানোনিকাল হিসাবে পরিচিত) স্থানাঙ্ক। পাথ-সন্ধানকারী অ্যালগরিদম প্রতিটি নোডের জন্য পদক্ষেপ ব্যয়কে এন্ট্রি হেক্স এবং টে ট্র্যাভার্সড হেক্স-সাইড উভয়ের সাথে পরিবর্তিত করতে দেয় (যদিও প্রদত্ত উদাহরণটি সহজ)। এছাড়াও, ছায়া-ingালাই ব্যবহার করে এলিভেটেড ফিল্ড অফ দ্য ভিউ সরবরাহ করা হয়েছে, [সম্পাদনা করুন: শব্দগুলি সরানো হয়েছে]।

এখানে একটি কোড নমুনা যা তিনটি হেক্স-গ্রিড স্থানাঙ্ক সিস্টেমের মধ্যে সহজেই রূপান্তরিত করে:

static readonly IntMatrix2D MatrixUserToCanon = new IntMatrix2D(2,1, 0,2, 0,0, 2);
IntVector2D VectorCanon {
  get { return !isCanonNull ? vectorCanon : VectorUser * MatrixUserToCanon / 2; }
  set { vectorCanon = value;  isUserNull = isCustomNull = true; }
} IntVector2D vectorCanon;
bool isCanonNull;

static readonly IntMatrix2D MatrixCanonToUser  = new IntMatrix2D(2,-1, 0,2, 0,1, 2);    
IntVector2D VectorUser {
  get { return !isUserNull  ? vectorUser 
             : !isCanonNull ? VectorCanon  * MatrixCanonToUser / 2
                            : VectorCustom * MatrixCustomToUser / 2; }
  set { vectorUser  = value;  isCustomNull = isCanonNull = true; }
} IntVector2D vectorUser;
bool isUserNull;

static IntMatrix2D MatrixCustomToUser = new IntMatrix2D(2,0, 0,-2, 0,(2*Height)-1, 2);
static IntMatrix2D MatrixUserToCustom = new IntMatrix2D(2,0, 0,-2, 0,(2*Height)-1, 2);
IntVector2D VectorCustom {
  get { return !isCustomNull ? vectorCustom : VectorUser * MatrixUserToCustom / 2; }
  set { vectorCustom  = value;  isCanonNull = isUserNull = true; }
} IntVector2D vectorCustom;
bool isCustomNull;

ইন্টারমেট্রেক্স 2 ডি এবং ইন্টভেক্টর 2 ডি হ'ল অ্যাফাইন 2 ডি গ্রাফিক্স ভেক্টর এবং ম্যাট্রিক্সের পূর্ণসংখ্যা বাস্তবায়ন [সম্পাদনা করুন: সমজাতীয়]। ভেক্টর অ্যাপ্লিকেশনগুলিতে 2 দ্বারা চূড়ান্ত বিভাজনটি ভেক্টরগুলিকে পুনরায় সাধারণকরণ করা হয়; এটি অন্তর্মাত্রিক 2 ডি বাস্তবায়নে সমাহিত হতে পারে তবে তারপরে ইন্টম্যাট্রিক্স 2 ডি নির্মাণকারীদের 7 তম যুক্তির কারণ কম স্পষ্ট। অ-বর্তমান সূত্রগুলির সম্মিলিত ক্যাচিং এবং অলস-মূল্যায়ন নোট করুন।

এই ম্যাট্রিকগুলি মামলার জন্য:

  • হেক্স শস্য উল্লম্ব;
  • ক্যানোনিকাল এবং ব্যবহারকারী স্থানাঙ্কের জন্য উপরের-বামে উত্স, কাস্টম স্থানাঙ্কের জন্য নীচে-বামে;
  • Y- অক্ষগুলি উল্লম্বভাবে নীচে;
  • আনুভূমিকভাবে আয়তক্ষেত্রাকার এক্স-অক্ষ; এবং
  • ক্যানোনিকাল এক্স-অক্ষটি উত্তর-পূর্বের (যেমন উপরে এবং ডানদিকে, ওয়াই-অক্ষ থেকে 120 ডিগ্রি সিসিডাব্লু)।

উপরে উল্লিখিত কোড লাইব্রেরি হেক্স-বাছাইয়ের জন্য একই ধরণের মার্জিত মেকানিজম সরবরাহ করে (অর্থাত্ মাউস ক্লিকের সাহায্যে নির্বাচিত হেক্স চিহ্নিত করা)।

ক্যানোনিকাল স্থানাঙ্কগুলিতে, জেগানো স্থানাঙ্কগুলির অসম্পূর্ণতা ছাড়াই 6 টি মূল নির্দেশিকা-ভেক্টর হ'ল (1,0), (0,1), (1,1) এবং সমস্ত হেক্সাগনের জন্য তাদের বিপরীতমুখী।


কি দারুন! উদাহরণস্বরূপ এবং ডকুমেন্টেশন সহ ওয়ার্কিং কোডের একটি লাইব্রেরি পোস্ট করার জন্য নিখরচায় একটি ভোট, যা ওপি কর্তৃক উত্পন্ন প্রশ্ন / সমস্যার উত্তর দেয়।
পিটার জেরকেন্স

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

ভাল দিক; ধন্যবাদ. আমি একাধিক হেক্স গ্রিড স্থানাঙ্ক কীভাবে দক্ষতার সাথে রক্ষণাবেক্ষণের প্রশ্নে সম্বোধন করে অংশটি পোস্ট সহ প্রসারিত করেছি। পোস্ট করা কোড লাইব্রেরি হ'ল ফ্রিওয়্যার
পিটার জেরকেন্স

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

public IntVector2D Normalize() { if (Z==1) return this; else { var x = (X >= 0) ? X : X - Z; var y = (Y >= 0) ? Y : Y - Z; return new IntVector2D(x/Z, y/Z); } }
পিটার জেরকেন্স

0

এটি একটি সমাধানযোগ্য সমস্যা, এর ব্যাক আপ করার জন্য অনেক সাহিত্য with আমার জানা সবচেয়ে ভাল সংস্থানটি হ'ল রেড ব্লব গেমস: https://www.redblobgames.com/grids/hexagons/

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

আপনি যদি সত্যিই অন্য কোনও সিস্টেম ব্যবহার করতে চান তবে প্রয়োজনে রূপান্তর করুন এবং যখন থেকে প্রয়োজন।

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