এন প্লেয়ারদের মধ্যে কীভাবে সমানভাবে হেক্স গ্রিড ভাগ করবেন?


15

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

আমি জানি যে এটি দুই বা তিনজন খেলোয়াড়ের পক্ষে সর্বদা সম্ভব নয় (কারণ এটি "মানচিত্রের রঙিন করা" সমস্যাটির অনুরূপ) এবং তাদের জন্য অন্যান্য সমাধান করার ক্ষেত্রে আমি ঠিক আছি (যেমন মানচিত্র তৈরির পরিবর্তে যা সমস্যার সমাধান করে)। তবে, চার থেকে আটজন খেলোয়াড়ের জন্য, আমি কীভাবে এই সমস্যার কাছে যেতে পারি?


উত্তর:


3

এটি আমি করতাম:

  1. এলোমেলো খেলোয়াড়দের সমস্ত ঘর নির্ধারণ করুন। বড় মানচিত্রে এটি খুব সম্ভবত সমস্ত খেলোয়াড়ের জন্য বেশ কয়েকটি টাইলস তৈরি করতে পারে, ছোট মানচিত্রগুলিতে আপনাকে সম্ভবত কিছু সংশোধন করতে হবে।
  2. খুব বড় যে অংশগুলি ভেঙে দিন। সবচেয়ে সহজ কাজটি হ'ল হ'ল সমস্ত টাইলস খণ্ডে এবং আবার প্রতিটি টাইল এলোমেলোভাবে নির্ধারণ করা।
  3. ভারসাম্যহীন সংখ্যক কক্ষের ক্ষেত্রে (যেমন প্লেয়ার এ এর ​​24 টি কোষ রয়েছে, প্লেয়ার বি রয়েছে 16 টি), ওপ্রেজেন্টেড প্লেয়ারদের থেকে বেশ কয়েকটি ঘর পুনরায় স্বাক্ষরিত খেলোয়াড়ের কাছে জমা দিন।
  4. খণ্ডখণ্ডের জন্য আবার চেক করুন। যদি পদক্ষেপ 3 নতুন খণ্ডগুলি উপস্থাপিত করে, তবে দ্বিতীয় ধাপে ফিরে যান 2, যদি না হয়, দুর্দান্ত মানচিত্র!

পিএস আমি মনে করি না যে এই সমস্যাটি কখনও অসম্ভব, মানচিত্রের বর্ণের সমস্যাটি একেবারেই আলাদা (এক জিনিসটির জন্য এটি অন্যান্য উপায়ে, বর্ণ-> রঙের পরিবর্তে রং>> টাইল অ্যাসাইনমেন্ট)।
জুনক্সেক্স

আমি এই পদ্ধতিকে বেশ খানিকটা পছন্দ করি তবে এ অঞ্চলের আকারগুলি ভারসাম্য বজায় রাখার চেষ্টা করে দীর্ঘকাল এটি চালানোর কোন সম্ভাবনা নেই?
manabreak

1
@ মানাব্রাক: এটি চেষ্টা করার জন্য আমি কিছু তৈরি করেছিলাম । দ্বিতীয় ধাপে একটি ছোট পরিবর্তন করে (এলোমেলোভাবে পুনরায় নিয়োগের পরিবর্তে সমস্ত খেলোয়াড়কে সাইকেল চালিয়ে পুনরায় সাইন ইন করুন) এটি বেশ কার্যকরভাবে কাজ করে। আমার সময় পেলে এটি লেখার চেষ্টা করব।
জুনক্সেক্স

1
আমি যা খুঁজছিলাম ঠিক সেটাই দেখতে পাওয়া যায়। :)
manabreak

1

ধরে নেওয়া যাক আপনার একটি hexmap আছে nমোট কোষ, এবং pপ্লেয়ার, যেখানে p <= n, সবচেয়ে ভালো উপায় এই মোকাবেলা করার মাধ্যমে হয় রাউন্ড-রবিন বন্টন মাধ্যমে সেলুলার অটোমাটা (সিএ)।

Initialisation

এলোমেলোভাবে (এবং / অথবা কিছু বা অন্যান্য তাত্ত্বিক ব্যবহার যেমন মানচিত্রের কেন্দ্র থেকে দূরত্ব) প্রতিটি প্লেয়ারের জন্য একটি প্রারম্ভিক সেল বাছাই করে। যেহেতু p <= n, এটি কোনও সমস্যা হওয়া উচিত নয়।

সেলুলার অটোমেটা

আপনার হেক্স সেলগুলির মধ্যে আপনার সম্পূর্ণ সংযোগের প্রয়োজন। আমি প্রতি ঘরে প্রতি 6-প্রতিবেশী অ্যারে প্রস্তাব করব:

class Cell
{
   //... other members...
   Cell[6] neighbours = new Cell[6];
}

স্থির আকারের অ্যারেগুলির ব্যবহারের ফলে কোষগুলির মধ্যে টপোগ্রাফিক দিকনির্দেশের ধারণা বিদ্যমান থাকতে পারে, যা কোনও তালিকা বা ভেক্টর না করে। আমি এটির প্রস্তাব দিচ্ছি, কারণ এটি নির্দিষ্ট কিছু নেভিগেশনকে সহজতর করতে পারে।

আপনি প্রতি সারি অফসেট সহ আপনার হেক্সম্যাপটি 2 ডি অ্যারেতেও সঞ্চয় করতে পারেন। এটি প্রতি প্রতি সারিতে জ্যামিতিক অফসেটের কারণে, প্রতি ঘরে প্রতিবেশী অ্যারে সংরক্ষণ করার চেয়ে কিছুটা স্বজ্ঞাত হতে পারে।

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

রাউন্ড-রবিন বিতরণ

সুডোকোড:

count number of neutral cells in entire map, minus those starting cells taken by players
while neutral cells remain (or while true)
   for each player
      if player has not yet reached expected territory size in cells
         for each cell already constituting this player's territory
           if territory can grow by one cell into a neutral neighbour
              grow into neighbour
              reduce neutral cell count for entire map by one
              if no more neutral cells remain in map
                 break out of outermost while loop immediately
              else
                 continue to next player immediately
begin game

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

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


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

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

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

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

আমি উপরে আমার মন্তব্য সম্পাদনা করতে হবে, তবে অনেক দেরি হয়ে গেছে। "আমি আপনার অ্যালগরিদমের কোনও উপায় দেখতে পাচ্ছি না "। যদিও আপনি পরবর্তী লেখায় ধারণাটি উল্লেখ করেছেন।
fnord

0

আরেকটি উপায় হ'ল 'ন্যায্য' তবে নিয়মিত এমন একটি বিতরণ দিয়ে শুরু করা এবং তারপরে ন্যায্যতাটি না হারিয়ে নিয়মিততা ভেঙে দেওয়ার জন্য সিমুলেটেড অ্যানিলিংয়ের অনুরূপ একটি প্রশংসা ব্যবহার করুন:

  • আপনার গ্রিডের সমস্ত কক্ষগুলিকে নিয়মিত প্যাটার্নে রঙ বরাদ্দ করে শুরু করুন (উদাহরণস্বরূপ, প্রথম সারিতে একটি পুনরাবৃত্তি '123412341234' প্যাটার্ন পরে রয়েছে, তারপরে '341234123412' ইত্যাদি)। এটি যদি আপনার মানচিত্রটি বিশেষত দুর্বল আকারের হয় তবে রঙের অ-ইউনিফর্ম বিতরণ হতে পারে, তবে আমি ধারণা করছি যে আপনি একটি নির্দিষ্ট মানচিত্র দিয়ে শুরু করছেন, তাই আপনি খুঁজে পেতে সক্ষম হবেন এটির কিছুটা নিয়মিত রঙিন রঙ ।
  • তারপরে আপনার মনে হয় যতগুলি পদক্ষেপের জন্য নিম্নলিখিতটি পুনরাবৃত্তি করুন (কোনও সত্য 'দান' মাপদণ্ড নেই, তাই পরীক্ষাগুলি আপনাকে জানায় যে ন্যূনতম যুক্তিসঙ্গত পদক্ষেপগুলি কী):
    • এলোমেলোভাবে গ্রিডের দুটি উপাদান চয়ন করুন
    • যদি তাদের রঙ একই হয় তবে আবার চেষ্টা করুন (অন্যথায় কোনও লাভ নেই, যেহেতু অদলবদল হ'ল নো-অফ হবে You আপনার কাছে একই রঙটি আঘাতের 1/4 সুযোগ এবং একই রঙে আঘাতের 1/16 সুযোগ রয়েছে) একটানা দু'বার, যাতে আপনাকে কখনই খুব বেশি চেষ্টা করতে হবে না)
    • এই দুটি উপাদানের রঙ অস্থায়ীভাবে অদলবদল করুন
    • অদলবদলের পরে উপাদানগুলির অবস্থানগুলিতে নতুন-গঠিত অঞ্চলের আকারগুলি পরীক্ষা করুন:
      • যে রঙের অঞ্চলটি সোয়াপ তৈরি করবে তা নির্ধারণ করতে প্রতিটি উপাদানের নতুন স্পট থেকে সরল বন্যা পূরণ করুন।
    • এই দুটি অঞ্চলের যে কোনও একটি যদি আপনার প্রান্তিকের চেয়ে বড় হয় তবে অস্থায়ী সোয়াপটি পূর্বাবস্থায় ফিরিয়ে আনুন; অন্যথায়, দুটি উপাদানের রঙের 'অদলবদল'।

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

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


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