Логіка за грою, схожою на коштовності


12

У прототипі, який я роблю, є міні-гра, схожа на коштовний камінь. Використовуючи сітку, що представляє собою 2d масив ( 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)
    //...

Схоже, має бути кращий шлях. Є там?


Я згадав, що написав нудний цикл для цього (для підключення)
Ming-Tang,

Відповіді:


6

Проведіть петлю через кожен елемент на одній осі (x або 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;
        }
    }
}

Це лише для осі x, для y, сітка [col] [i] стане сіткою [i] [рядок] тощо. Я впевнений, що ви можете це зрозуміти :)


4

Я просто подумав, що я зважуюся на наш досвід створення гри, схожої на матч 3.

Ми побудували прототип для гри на словах на основі Match-3, трохи схожий на розтирання скраблу та Bejeweled. Ми дуже рано зрозуміли, що двигун, який постачає нові дорогоцінні камені / плитки для заповнення порожніх просторів, повинен був бути дуже інтроспективним (ми проводимо гібридну евристику та вибірку MonteCarlo) для того, щоб створити гравцю реальні можливості для рядків літер для формування слів через Матч-3 механіка. Це набагато більш детально, ніж опис, але я його короткий, тому що нам доведеться написати документ.

Щоб відповісти на ОП - ми робимо перевірку шаблону, щоб визначити, скільки відповідностей на будь-якому даному поясі, в даний момент, за допомогою методу, дуже схожого на фрагмент коду "gladoscc". Хоча це працює надійно, обчислювальна вартість запуску, який рекурсивно під час відтворення дерев стає серйозним тягарем, тому ми зараз переписуємо цю частину логіки та представлення даних методологією біт-плати ( зазвичай реалізовується в інших сітках, таких як ігри, як шахи, шашки, Othello тощо). У тестах ми показали, що він може працювати в 20 разів швидше в ActionScript, і тому для нас необхідність цього робити - це слэм-данк - і звільняє необхідні цикли для чуйності, звуку, анімації тощо.


3
Ваша відповідь повинна відповідати, а не додавати іншого питання. Якщо у вас виникло питання, будь ласка, створіть нове запитання за допомогою кнопки «ЗАПИТИ ЗАПИТАННЯ». Це не дискусійний форум.
bummzack

1
bummzack .... дякую за це. Моє обґрунтування було те, що ми мали запропонувати зрозуміти, тим більше, що це стосується виконання того, що було запропоновано раніше, коли пошук дерева / самоаналіз був доданий до контексту. І це продовжувало бути актуальним, оскільки ми все ще говоримо по суті про "Логіку за грою Bejeweled". Якщо це і надалі буде поганою формою, я буду радий редагувати / повторно публікувати за вашими порадами.
Віссам

2
Добре. Але слід видалити частину "питання" зі своєї відповіді. Питання повинні бути новими питаннями, а не частиною відповіді ...
bummzack

1
редагував і розміщував питання в іншому місці
Wissam

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 (і не більше) відповідного елемента підряд (і жодних схрещувальних стовпців) це, можливо, надлишок. Ми використовуємо це як у грі Bubble Puzzle, і робить саме те, що нам потрібно.
ktornai

2
Ви можете, можливо, пояснити трохи більше, ніж просто "використовувати заливку", тому що я на секунду розгубився, як це стосується цієї проблеми.
поштовх
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.