টাইল মানচিত্র তৈরি করা হচ্ছে


25

আমি একটি টাইল ভিত্তিক গেমটি প্রোগ্রাম করছি এবং আমার কিছু বেসিক টাইলস রয়েছে (ঘাস, ময়লা ইত্যাদি), তবে আমি কীভাবে ভাল এলোমেলো মানচিত্র তৈরি করতে পারি তা বুঝতে পারি না, কারণ আমি যখন সত্যিই কিছু এলোমেলো নির্বাচন করি, টাইল হলে ঘাস / ময়লা হওয়া উচিত, আমি এটি পেয়েছি:

গেমের ছবি

আমি বুঝতে পারছি কেন এটি হচ্ছে, তবে আমি যা চাই তা হ'ল ঘাস বা ময়লার কিছু এলোমেলো ধারাবাহিক অঞ্চল তৈরি করা। এমন কিছু যা আরও অর্থবোধ করতে পারে, এর মতো:

প্রত্যাশিত ফল


1
প্রস্তাবিত উত্তরগুলি ছাড়াও, আপনি এই জাতীয় মানচিত্র তৈরি করতে নিজের সেলুলার অটোমেটন ইঞ্জিনটি লিখতে পারেন। অটোমেটনের নিয়মগুলিকে সংশোধন করে আপনি খুব আলাদা আচরণ তৈরি করতে পারবেন, যা বিভিন্ন ধরণের মানচিত্রে নেতৃত্ব দেয়। উদাহরণস্বরূপ, লাইফের অনুরূপ একটি 2 ডি অটোমেটন পাওয়া, বন্যার নিয়মগুলি "সমুদ্র এবং দ্বীপপুঞ্জ" (উপরে আপনার চিত্রের মতো) হতে পারে এবং 1267/17 এর মতো একটি নিয়ম সুন্দর ল্যাবরেঞ্জগুলিতে নিয়ে যেতে পারে।
মনু 343726

উত্তর:


19

আপনি যা করতে পারেন তা এলোমেলোভাবে একটি ভোরোনাই মানচিত্রটি উত্পন্ন করে:

  1. এলোমেলো বাছাই center points(কালো বিন্দু দেখুন) এবং এগুলি ঘাস বা ময়লা হয় তা এলোমেলোভাবে সিদ্ধান্ত নিন।
  2. তারপরে সমস্ত টাইলসের জন্য, এটি কোনও center pointময়লা বা ঘাসের সবচেয়ে কাছাকাছি কিনা তা পরীক্ষা করুন ।
  3. সম্পন্ন!

আপনি আগে যা করেছিলেন তা প্রতিটি টাইলের জন্য "কয়েন ফ্লিপ করুন" (গোলমাল), একটি ভোরোনাই চিত্র তৈরি করা আরও ভাল ফলাফল প্রদান করবে।

আপনি বিভাজক দ্বারা এই উন্নতি করতে পারে center pointsমধ্যে islandsএকটি আলগোরিদিম যে সঙ্গে:

  1. একটি ছোট গ্রুপ চয়ন করে centers pointsএবং তাদের হিসাবে মনোনীত করে leaders
  2. স্বতঃস্ফূর্তভাবে প্রতিটি মোড় একটি এলোমেলো সংলগ্ন অনিশ্চিত কেন্দ্র পয়েন্ট যোগ করুন।
  3. সম্পন্ন!

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


1
ধন্যবাদ, তবে এটি একটি খুব কঠিন সমাধানের মতো বলে মনে হচ্ছে।
ভিলদা

2
এটি খুব কঠিন সমাধান নয়। প্রথমে এলোমেলোভাবে বাছাই করুন center points। তারপরে সিদ্ধান্ত নিন সেগুলি ঘাস বা ময়লা কিনা। এখন অ্যারের উপরে লুপ করুন এবং সিদ্ধান্ত নিন যে প্রতিটি টাইল ময়লা পয়েন্ট বা গ্রাস পয়েন্টের সবচেয়ে কাছাকাছি কিনা। সম্ভবত আমাকে বলুন কোন অংশটি চ্যালেঞ্জিং?
উলফডন

দূরত্ব পরিমাপ। যাইহোক, আমি চেষ্টা করব এবং আপনাকে জানাবো।
ভিলদা

ঠিক আছে, তাই আমি সফলভাবে কিছু পয়েন্ট তৈরি করেছি। ( dropbox.com/s/dlx9uxz8kkid3kc/random_tile_map2.png ) এবং তাই উত্পন্ন করার জন্য আমার পুরো ক্লাসটি এর মতো দেখায়: ড্রপবক্স / এস / পিএক্সএন 902xqrhtli4 / gen.java । তবে এটি এখনও কাজ করে না।
ভিলদা

3
@ ভিলিক্স আপনার লিঙ্কগুলি নষ্ট হয়ে গেছে
আর্তুর চাজাজা

24

আপনি পার্লিন শব্দটি ব্যবহার করতে পারেন যা উচ্চতা ম্যাপ জেনারেশনের জন্য সাধারণভাবে ব্যবহৃত হয়। গেমসে পার্লিন গোলমাল

তারপরে আপনি উপদেষ্টা হিসাবে উচ্চতাগুলি ব্যবহার করতে পারেন, মানচিত্রের এক অঞ্চলে ঘাস / ময়লা পড়ার সম্ভাবনা কত বেশি।

উদাহরণ (০-২৫ from থেকে পার্লিন শোর মান): মান যদি 200 এর বেশি হয় তবে ঘাস রাখার সম্ভাবনা 80% (ময়লা 20%)। যদি মান 100 এবং 200 এর মধ্যে হয় তবে ঘাস স্থাপনের সুযোগটি 50% (ময়লা এছাড়াও 50%) থাকে। মানটি যদি 100 এর নিচে হয় তবে ঘাসটি স্থাপনের সুযোগটি 20% (ময়লা 80%) থাকে।


ঠিক আছে, আসুন আমরা বলি যে আমার কাছে একটি অ্যারে আছে [] [] ভাসমান (সম্ভাবনার 0-1) এবং আমি এটি সম্ভাব্যতার সাথে টাইলগুলি স্পোন করতে ব্যবহার করতে পারি। তবে আমি কীভাবে এই সম্ভাবনার অ্যারেটি পূরণ করব? অ্যারেটি 400x200 এর (বলা যাক) এটি সম্ভাবনার মানগুলি কীভাবে পূরণ করবেন?
ভিলদা

তিনি এটিকে পার্লিন শব্দের সাথে পূরণ করার পরামর্শ দিচ্ছেন (কয়েন ফ্লিপের মতো সাদা গোলমালের পরিবর্তে)।
উলফডন

হ্যাঁ, তবে আমি কীভাবে এটি অর্জন করতে পারি?
ভিলদা

আমি পোস্ট করা লিঙ্কটি এই প্রশ্নটি পরিষ্কার করতে পারে। প্রথমে একটি শব্দ উত্পন্ন করুন এবং তারপরে এই শব্দটি মসৃণ করুন result ফলাফলটি 2 মাত্রিক অ্যারে হবে যা আপনি টাইলম্যাপটির আরও প্রজন্মের জন্য ব্যবহার করতে পারেন। লিঙ্ক
ক্লিটজ

এটি সত্যিই ভাল উত্তর তবে এটি আপনার উপস্থাপিতের মতো ফল খুব কমই পাবে।
উলফডন

8

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

http://gamedevelopment.tutsplus.com/tutorials/generate-random-cave-levels-using-cellular-automata--gamedev-9664

এখানে সেলুলার অটোমেটা পদ্ধতির আমার সংস্করণটি এলোমেলোভাবে গ্রিডটি পূরণ করে শুরু করুন তারপরে এই কুলুলার অটোমেটা নিয়মগুলি কয়েকবার চালান

  • যদি কোনও জীবন্ত কক্ষে দুটি কম প্রতিবেশী থাকে তবে তা মারা যায়।
  • যদি কোনও জীবন্ত কক্ষে দুটি বা তিনটি জীবিত প্রতিবেশী থাকে তবে তা বেঁচে থাকে।
  • যদি কোনও জীবন্ত কক্ষে তিনটির বেশি জীবিত প্রতিবেশী থাকে তবে তা মারা যায়।
  • যদি কোনও মৃত কোষের ঠিক তিনটি জীবিত প্রতিবেশী থাকে তবে তা জীবিত হয়ে ওঠে।

এবং এটি একটি গুহার মতো দেখতে শেষ হয়

এই কোডটি দিয়ে সূচিটি এক্স ও ওয়াই পজিশনে এবং ফিরে যেতে পারে

public int TileIndex(int x, int y)
{
    return y * Generator.Instance.Width + x;
}
public Vector2 TilePosition(int index)
{
    float y = index / Generator.Instance.Width;
    float x = index - Generator.Instance.Width * y;
    return new Vector2(x, y);
}

আমি কেবল বুলের একটি তালিকা ফিরিয়ে দিয়েছি কারণ আমি এই তালিকাটি অনেক কিছুর জন্য ব্যবহার করি: গুহা, গাছ, ফুল, ঘাস, কুয়াশা, জল আপনি এমনকি বিভিন্ন উপায়ে একাধিক তালিকাগুলি একত্রিত করতে পারেন আমি প্রথমে সমস্ত ছোট গুহাগুলি অপসারণ করি তারপর দুটি এলোমেলো তালিকা সংযুক্ত করি

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

private int GetAdjacentCount(List<bool> list, Vector2 p)
{
    int count = 0;
    for (int y = -1; y <= 1; y++)
    {
        for (int x = -1; x <= 1; x++)
        {
            if (!((x == 0) && (y == 0)))
            {
                Vector2 point = new Vector2(p.x + x, p.y + y);
                if (PathFinder.Instance.InsideMap(point))
                {
                    int index = PathFinder.Instance.TileIndex(point);
                    if (list[index])
                    {
                        count++;
                    }
                }
                else
                {
                    count++;
                }
            }
        }
    }
    return count;
}
private List<bool> GetCellularList(int steps, float chance, int birth, int death)
{
    int count = _width * _height;
    List<bool> list = Enumerable.Repeat(false, count).ToList();
    for (int y = 0; y < _height; y++)
    {
        for (int x = 0; x < _width; x++)
        {
            Vector2 p = new Vector2(x, y);
            int index = PathFinder.Instance.TileIndex(p);
            list[index] = Utility.RandomPercent(chance);
        }
    }
    for (int i = 0; i < steps; i++)
    {
        var temp = Enumerable.Repeat(false, count).ToList();
        for (int y = 0; y < _height; y++)
        {
            for (int x = 0; x < _width; x++)
            {
                Vector2 p = new Vector2(x, y);
                int index = PathFinder.Instance.TileIndex(p);
                if (index == -1) Debug.Log(index);
                int adjacent = GetAdjacentCount(list, p);
                bool set = list[index];
                if (set)
                {
                    if (adjacent < death)
                        set = false;
                }
                else
                {
                    if (adjacent > birth)
                        set = true;
                }
                temp[index] = set;
            }
        }
        list = temp;
    }
    if ((steps > 0) && Utility.RandomBool())
        RemoveSmall(list);
    return list;
}

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

6

মানচিত্রে একটি পয়েন্ট নির্বাচন করুন। 40 এর মতো একটি বেস মান সহ পছন্দসই টাইলের প্রকারটি রাখুন newly একটি তালিকায় প্রারম্ভিক বিন্দু যুক্ত করুন।

এই তালিকার প্রতিটি পয়েন্টের জন্য, আপনি সমস্ত প্রতিবেশী যান। আপনার পর্যাপ্ত শক্তি বাকি আছে (40 এ শুরু হয়েছে) একটি পছন্দসই টাইল যুক্ত করুন এবং এটি দেখার জন্য তালিকায় যুক্ত করুন। আপনার দ্বারা নির্ধারিত নতুন টাইলকে কম শক্তি দিন। সহজতম = এলোমেলোভাবে কমছে। আপনি তালিকাটি থেকে টাইলটি দেখার পরে, এটি সরান। পুনরায় শুরু না করে যেকোন অপ্রত্যাশিত কিন্তু তৈরি টাইলস ঘুরে দেখে।

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