এক সাথে একই স্কোয়ারে প্লেয়ারদের সরিয়ে নেওয়া?


15

স্কোয়ারের 2 এক্স 2 গ্রিড বিবেচনা করুন। কোনও খেলোয়াড় স্কোয়ারের দিকে যেতে পারে যদি:

  • অন্য কোনও খেলোয়াড় পরের বারে স্কোয়ারে যেতে চান না
  • অন্য কোনও খেলোয়াড় অপেক্ষা করেনি এবং এখনও এই টার্নটি স্কয়ারটি দখল করছে

উদাহরণ চিত্র

আমি আমার সমস্যাটি বর্ণনা করতে উপরের চিত্রটি অন্তর্ভুক্ত করেছি।

খেলোয়াড়রা একই সাথে চলাফেরা করে।

যদি 2 (বা ততোধিক) প্লেয়াররা একই স্কোয়ারে যাওয়ার চেষ্টা করে তবে তারাও সরবে না।


1
খেলোয়াড় কি এক ধাপে একে অপরের টাইলস স্থানান্তর করতে পারেন? উদাহরণস্বরূপ, হলুদ এবং নীল রঙের স্যুইচগুলি ঠিক একই ধাপে স্থানগুলি ফেলতে পারে (নীল এক টালি বামে যায় এবং হলুদ এক টালি ডানে যায়)?
Ali1S232

গ্যাজেট আপাতত হ্যাঁ তবে এক পর্যায়ে আমি চাই না যে 2 প্রতিবেশী খেলোয়াড় সরাসরি জায়গা সোয়াপ করতে সক্ষম হবেন
t123

তাহলে আমার উত্তরটি এই সমস্যার সমাধান করে।
Ali1S232

2
অত্যন্ত প্রাসঙ্গিক: কূটনীতির জন্য আন্দোলনের নিয়মগুলি পরীক্ষা করে দেখুন। en.wikipedia.org/wiki/Diplomacy_(game)#Movement_phase
TehShrike

উত্তর:


11
  1. সমস্ত খেলোয়াড়কে স্থির বা চলমান হিসাবে পতাকাঙ্কিত করুন, যদি তারা এই টার্নটি কোনও পদক্ষেপ জমা দেন তবে depending
  2. চালগুলির তালিকার মধ্য দিয়ে যান। যদি দুটি চাল একই স্থানে ইঙ্গিত করে তবে তাদের তালিকা থেকে সরিয়ে প্লেয়ারদের স্থির করে দিন।
  3. স্টেশন প্লেয়ার বা অন্যান্য বাধা নির্দেশ করে এমন সমস্ত চাল মুছে ফেলা তালিকার মধ্য দিয়ে লুপ করুন। আপনি যখন যাবেন তখন তালিকার পরিবর্তন না হওয়া পর্যন্ত এটি বারবার করুন।
  4. সমস্ত খেলোয়াড় সরান।

আমি মনে করি এটি কাজ করা উচিত। এটি আপনার পোস্ট করা কেসটির জন্য অবশ্যই কাজ করে এবং আমি এটি পরীক্ষা করে দেখি এমন আরও কয়েকটি তুচ্ছ ঘটনাও ঘটে।


হ্যাঁ, এটি কাজ করা উচিত। নোট করুন যে আপনি খেলোয়াড়দের তালিকার উপরে বারবার লুপ করতে চান না; অনুশীলনে, ব্যাকট্র্যাকিংয়ের মাধ্যমে সংঘর্ষগুলি সমাধান করা অনেক বেশি দক্ষ হবে।
ইলমারি করোনেন

16

সংঘর্ষ প্রতিরোধের পরিবর্তে সংঘর্ষের রেজোলিউশন।

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


1
হ্যাঁ তবে যদি কেউ ফিরে যেতে হয় তবে অন্যকেও ফিরে যেতে হবে ...
t123

2
আপনি সঠিক, তবে আবার এটি প্রকৃত গেমের ধরণের উপর নির্ভর করে, আরও তথ্যের প্রয়োজন হবে এবং প্রকারের ভিত্তিতে পরিস্থিতি পরিবর্তিত হবে। এটি ছিল সর্বাধিক সাধারণ উত্তর সম্পর্কে।
আলটিফিনিটাস

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

4
Move all players according to their request.
while there are still some squares multiply occupied:
    For each square that is now multiply occupied:
        For each player in that square that moved there this turn:
            Return them to their previous square
            Mark them as having not moved this turn

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


3

আর একটি সমাধান হ'ল আপনি যা দেখিয়েছেন তার চেয়ে 2x বড় ম্যাপ ব্যবহার করা। প্রতিবার আপনি খেলোয়াড়দের সরিয়ে নিতে চাইলে আপনি তাদের দু'বার সরিয়ে নিয়ে যান তাই প্লেয়াররা সর্বদা এক্স এবং ওয়াই উভয়ের জন্য সমান মান সহ টাইলসে অবতরণ করে again আবার এমন কিছু বিরল ঘটনা ঘটবে যাতে আরও মনোযোগ দেওয়া প্রয়োজন তবে বেশিরভাগ সম্ভাব্য কেসগুলি সমাধান করা হয়েছে (যেমন আপনি তার মতো বর্ণিত) দুইবার চিন্তা না করে।


আমি মনে করি যে এখানে আপনার মনে কিছু আছে তবে এটি আপনার উত্তরে আসে না। 2x ম্যাপ ব্যবহার করে সংঘর্ষের সমস্যাটি কীভাবে সমাধান করা যায়?
Zan Lynx

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

@ জ্যানলিন্যাক্স: সমস্যাটি ঠিক ঠিক সমাধান করে, একমাত্র সমস্যা তখন ঘটবে যখন দুটি টুকরো (সবুজ এবং নীল বলুন) সংঘর্ষে চলে যাবে এবং আরেকটি টুকরো (হলুদ) সবুজ রঙের শেষ অবস্থানটি পূরণ করবে। এইগুলির অনুরূপ ক্ষেত্রে (যদি তারা সম্ভব হয় তবে) আপনাকে আলটিফিনিটাসের পরামর্শ অনুসারে সংঘর্ষগুলি সমাধান করা দরকার।
Ali1S232

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

0

অ্যারে বা মানচিত্র ব্যবহার করে অনুরোধ করা সমস্ত পদক্ষেপ নিবন্ধন করুন।

যদি কোনও বিরোধ হয়, তবে প্রশ্নে সরানো অনুরোধটি প্রত্যাহার করুন। যদি এটি বস্তুকে স্কোয়ারে ফেরত দেয় অন্য কোনও অবজেক্ট দখল করার চেষ্টা করছে, অনুরোধকারী অবজেক্টের অনুরোধটি প্রত্যাহার করুন।

সুডোকোড:

int[][] game; // game board

var doMoves() {
    int[][] dest = [][]; // destinations; cleared each run

    for (obj in gameObjects)
        if (obj.moveRequest) {
            var o = dest[obj.moveX][obj.moveY];
            if (o) {
                // collision!
                o.doNotMove = true;
                obj.doNotMove = true;
            } else {
                dest[obj.moveX][obj.moveY] = obj;
            }
        }
    }

    // check move validity
    for (obj in gameObjects) {
        if (obj.doNotMove) continue;

        var o = game[obj.moveX][obj.moveY];
        if (o and o.doNotMove)
            revertRequest(obj, dest);
    }

    // process moves
    //etc
}

// recursive function to back up chained moves
var revertRequest(obj, dest) {
    if (!obj.doNotMove) {
        obj.doNotMove = true;
        var next = dest[obj.x][obj.y];
        if (next)
            revertRequest(next, dest);
    }
}

0

সাইমনডাব্লিউর উত্তরে বিল্ডিং , এখানে একটি স্পষ্ট আলগোরিদিম রয়েছে:

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

  • যদি squares[S]হয় NULLতবে স্কোয়ারটি Sসরানো মুক্ত।
  • যদি squares[S] == Sহয়, না হয় প্লেয়ারটি Sস্থানান্তর করতে পারে না বা না যায়, বা দু'জন (বা আরও) খেলোয়াড় Sএকই সাথে যাওয়ার চেষ্টা করেছিল এবং উভয়কেই অস্বীকার করা হয়েছিল।
  • অন্যথায়, squares[S]স্কয়ারের সূচি থাকবে যা থেকে কোনও খেলোয়াড় স্কোয়ারে যেতে চায় S

প্রতিটি মোড় তারিখে, সব এন্ট্রি আরম্ভ squaresকরার NULLএবং তারপর নিম্নলিখিত অ্যালগরিদম সঞ্চালন করুন:

for each player:
   current := the player's current location;
   target := the location the player wants to move to (may equal current);
   if squares[target] is NULL:
      squares[target] := current;  // target is free, mark planned move
   else
      // mark the target square as contested, and if necessary, follow
      // the pointers to cancel any moves affected by this:
      while not (target is NULL or squares[target] == target):
         temp := squares[target];
         squares[target] := target;
         target := temp;
      end while
      // mark this player as stationary, and also cancel any moves that
      // would require some else to move to this square
      while not (current is NULL or squares[current] == current):
         temp := squares[current];
         squares[current] := current;
         current := temp;
      end while
   end if
end for

এরপরে, আবার খেলোয়াড়দের তালিকার মধ্য দিয়ে লুপ করুন এবং যারা এটি করতে সক্ষম তাদের সরিয়ে দিন:

for each player:
   current := the player's current location;
   if not squares[current] == current:
       move player;
   end if
end for

যেহেতু প্রতিটি পদক্ষেপ কেবল একবারেই পরিকল্পনা করা যেতে পারে এবং একবারে বাতিল করা যায়, তাই এই অ্যালগরিদম সবচেয়ে খারাপ ক্ষেত্রে এমনকি এন ( খেলোয়াড় ) এর জন্য ও ( এন ) সময়ে চলবে ।

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

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