বেজেওয়াল-জাতীয় গেমের পিছনে যুক্তি


12

একটি প্রোটোটাইপ আমি করছি, বেজেওয়েলের মতো একটি মিনিগেম রয়েছে। গ্রিড যা 2 ডি অ্যারে ব্যবহার করে ( int[,]) ব্যবহারকারীর একটি মিল তৈরি হওয়ার সময় আমি কীভাবে জানতে পারি? আমি কেবল অনুভূমিক এবং উল্লম্বভাবে যত্ন করি।

আমার মাথার উপরের অংশটি আমি ভাবছিলাম আমি কেবল প্রতিটি দিক দেখব। কিছুটা এইরকম:

int item = grid[x,y];
if(grid[x-1,y]==item)
{
    int step=x;
    int matches =2;
    while(grid[step-1,y]==item)
    {
        step++;
        matches++
    }
    if(matches>2)
        //remove all matching items
}
else if(grid[x+1,y]==item
    //....
else if(grid[x,y-1==item)
    //...
else if(grid[x,y+1]==item)
    //...

দেখে মনে হচ্ছে এর চেয়ে ভাল উপায় আর হওয়া উচিত। আছে?


আমার মনে আছে আমি এটি করার জন্য লুপের জন্য ক্লান্তিকর লিখেছি (একটি কানেক্ট-এন এর জন্য)
মিং-টাং

উত্তর:


6

আগের অক্ষরের (এক্স বা y) প্রতিটি আইটেমের মধ্য দিয়ে লুপ করুন, যদি তারা আগের আইটেমের সাথে একই হয় তবে তাদের বৃদ্ধি মেলে। পরবর্তী আইটেমটি আলাদা হয়ে গেলে, মিলগুলি 3 বা তার বেশি হয় কিনা তা যাচাই করুন, ম্যাচিং আইটেমগুলি সরিয়ে ফাংশনটি কল করুন এবং চালিয়ে যান।

AS3 কোড:

var grid:Array = [[2,3,2,2,2,4],
                  [ .. ]]; //multidimensional array
var matches:uint;
var gemType:uint;
for(col = 0; col < grid.length; col++){
    matches = 0;        
    gemType = 0; //Reserve 0 for the empty state. If we make it a normal gem type, then only 2 are needed to match for the start.
    for(i = 0; i < grid[0].length; i++){
        if(grid[col][i] == gemType){
            matches++;
        }
        if(grid[col][i] != gemType || i == grid[0].length - 1){ //subtract 1 because arrays start at 0
            if(matches >= 3){
                removeMatches(blah);
            }
            gemType = grid[col][i];
            matches = 1;
        }
    }
}

এটি কেবল এক্স অক্ষের জন্য, y, গ্রিড [কল] [i] গ্রিড হয়ে যাবে [i] [সারি] ইত্যাদি etc. আমি নিশ্চিত আপনি এটি নির্ধারণ করতে পারেন :)


4

কেবল ভেবেছিলাম আমি ম্যাচ -3-জাতীয় খেলা তৈরির অভিজ্ঞতাটি নিয়ে বিবেচনা করব।

আমরা ম্যাচ -3 ভিত্তিক শব্দ গেমের জন্য একটি প্রোটোটাইপ তৈরি করেছি, কিছুটা স্ক্র্যাবল এবং বেজেভেলডকে ম্যাশ করার মতো। আমরা খুব তাড়াতাড়ি বুঝতে পেরেছিলাম যে কোনও ইঞ্জিনের মাধ্যমে শব্দের গঠনের জন্য অক্ষরগুলির সত্যিকারের সুযোগ তৈরি করতে খালি জায়গাগুলি পূরণের জন্য নতুন রত্ন / টাইলস সরবরাহকারী ইঞ্জিনটি অত্যন্ত আত্মবিজ্ঞানী হতে হবে (আমরা হাইব্রিড হিউরিস্টিক্স এবং মন্টে কার্লো নমুনা চালাই) in ম্যাচ -৩ মেকানিক। এটি বর্ণনার চেয়ে আরও বিস্তৃত তবে আমি এটি সংক্ষেপে রাখছি কারণ আমাদের একটি কাগজ লিখতে হবে।

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


3
আপনার উত্তরটি একটি উত্তর হওয়া উচিত এবং অন্য প্রশ্ন যুক্ত করা উচিত নয়। আপনার যদি প্রশ্ন থাকে তবে দয়া করে "জিজ্ঞাসা জিজ্ঞাসা" বোতামটি ব্যবহার করে একটি নতুন প্রশ্ন তৈরি করুন। এটি কোনও আলোচনার ফোরাম নয়।
বম্মজ্যাক

1
বামমজ্যাক .... তার জন্য আপনাকে ধন্যবাদ। আমার যুক্তিটি ছিল আমাদের অফার করার অন্তর্দৃষ্টি ছিল, বিশেষত এটি যখন গাছ-সন্ধান / অন্তর্নিম্নতা প্রসঙ্গে যুক্ত করা হয়েছিল তখন এর আগে যা প্রস্তাব করা হয়েছিল তার কার্য সম্পাদনের সাথে সম্পর্কিত। এবং এটি প্রাসঙ্গিক হতে থাকবে যেহেতু আমরা এখনও "বেজেভেলড গেমের পিছনে যুক্তি" সম্পর্কে মূলত কথা বলছি। যদি এটি খারাপ রূপ অব্যাহত থাকে তবে আমি আপনার পরামর্শ অনুসারে সম্পাদনা / পুনরায় পোস্ট করতে পেরে খুশি হব।
উইসাম

2
সেটা ঠিক আছে. তবে আপনার উত্তর থেকে আপনার "প্রশ্ন" অংশটি সরিয়ে নেওয়া উচিত। প্রশ্নগুলি নতুন প্রশ্নের হওয়া উচিত এবং কোনও উত্তরের অংশ নয় ...
বম্মজ্যাক

1
প্রশ্নটি সম্পাদনা করে অন্য কোথাও পোস্ট করেছেন
উইসাম

2

পুনরাবৃত্তি, ইও। আপনি যখন নিজের সীমানা জানেন না তখন এটি।

   public int getHMatchSize(int row, int column)
    {
        int returnMe = getMatchValue(row, 0, column, 1);

        if (returnMe < 3)
        {
            return 0;
        }
        else return returnMe;
    }


    public int getVMatchSize(int row, int column)
    {
        int returnMe = getMatchValue(row, 1, column, 0);

        if (returnMe < 3)
        {
            return 0;
        }
        else return returnMe;
    }

    /// <summary>
    /// I return the match size.
    /// </summary>
    /// <param name="row"></param>
    /// <param name="rowDelta">1 means look vertically.  Dont set both deltas to 1.</param>
    /// <param name="column"></param>
    /// <param name="columnDelta">1 means look horizontally.  Dont set both deltas to 1.</param>
    /// <returns>The number of contiguous matching things</returns>
    public int getMatchValue(int row, int rowDelta, int column, int columnDelta)
    {
        int[] start = getEndItem(row, -1 * rowDelta, column, -1 * columnDelta);
        int[] end = getEndItem(row, rowDelta, column, columnDelta);

        int returnMe = 0;
        returnMe += end[0] - start[0];
        returnMe += end[1] - start[1];
        return returnMe;
    }

    /// <summary>
    /// I will return the end of a sequence of matching items.
    /// </summary>
    /// <param name="row">start here</param>
    /// <param name="column">start here</param>
    private int[] getEndItem(int row, int rowDelta, int column, int columnDelta)
    {
        Gem matchGem = new Gem(-1);
        int[] returnMe = new int[2];

        if (boardSpace[row + rowDelta][column + columnDelta] == boardSpace[row][column])
        {
            return getEndItem(row + rowDelta, rowDelta, column + columnDelta, columnDelta);
        }
        else
        {
            returnMe[0] = row;
            returnMe[1] = column;
            return returnMe;
        }
    }

0

আপনি বন্যা ভরাট অ্যালগরিদম ব্যবহার করতে পারেন । এই ধরণের সমস্যার পক্ষে এটি সত্যিই ব্যবহারযোগ্য।


1
না, আসলে প্রশ্নটির সাথে এর কোনও যোগসূত্র নেই। ওপিতে জিজ্ঞাসা করা হচ্ছে কীভাবে একের পর এক তিনটি মেলা আইটেম সনাক্ত করতে হয়।
সাইক্লোপস

2
যদি আপনি উল্টানো উপাদান (গুলি) দিয়ে ফিল শুরু করেন তবে অ্যালগরিদমটি ম্যাচের উপাদানগুলির মধ্য দিয়ে যায়। তবে কেবল একটি সারিতে 3 টি (এবং আরও কিছু নয়) মেলানো উপাদান পরীক্ষা করতে (এবং কোনও ক্রসিং কলাম নেই), এটি সম্ভবত ওভারকিল। আমরা এটি গেমের মতো বুদ্বুদ ধাঁধাতে ব্যবহার করি এবং আমাদের যা প্রয়োজন ঠিক তা করে।
ktornai

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