Гра в слова - реалізація дошки?


12

Я працюю над грою типу boggle для android, використовуючи libgdx. Користувачеві представлена ​​сітка букв 4x4 і повинна знаходити слова, перетягуючи пальцем по буквах.

На відміну від фігня, я хочу, щоб використані букви зникли. Залишилися листи впадуть вниз (до нижньої частини дошки, орієнтована орієнтація екрана), і дошка заправляється зверху. Користувачі можуть обертати дошку, щоб спробувати перекласти букви в кращому місці за допомогою стратегічного вибору слова.

Приклад:

d g a o
u o r T
h v R I
d G n a

Якби я вибрав слово GRIT, ці літери зникнуть, а решта впаде:

d
u g a
h o r o
d v n a

а потім замінюються новими літерами

d w x y
u g a z
h o r o
d v n a

Я застряг, з'ясовуючи, як зобразити дошку та плитку.

Я намагався представляти дошку як матрицю для відстеження вибраних плиток та дійсних рухів, а також плиток, що зберігаються в матриці, щоб було зручне відображення. Це працює, але мені довелося написати якийсь заплутаний код, щоб обертати дошку.

Як інші ігри вирішують цю проблему?

EDIT: Отже, думаючи про це, я дійсно повинен просто обробити точку дотику відповідно до обертання дошки, щоб клітини залишалися постійними. Додав образ того, про що я думаю.Обробляйте сенсорний екран, щоб орієнтація плати ніколи не змінювалася


1
Ви маєте на увазі, що напрямок, до якого падають літери, залежить від орієнтації пристрою? Чи можете ви також уточнити, що ви маєте на увазі під "накрученим, коли я хочу повернути плитку" .
Петро Абдулін

Я мав на увазі, що моє відображення від розташування дошки до місця розташування плитки було дуже перекрученим, коли я здійснив обертання. Однак я думаю, що я можу вирішити цю проблему, якщо вважаю, що дошка обертається щодо походження системи координат замість того, щоб усі місця мінялися плитками ...
andy mcevoy

Дякуємо за оновлення. Зазвичай краще оновити саме питання, тому іншим не потрібно буде заглиблюватися в коментарі для цінної інформації. Досі мені не зрозуміло, як здійснюється обертання (зараз), який це результат і як насправді ускладнює відстеження. Не зрозуміло, чи повноцінний пансіон обертається чи лише окремі плитки. Зазвичай додавання фрагментів коду допомагає зрозуміти проблему.
Петро Абдулін

Я думаю, що я вирішив проблему зовсім неправильно, обробка точки дотику користувачів відповідно до обертання дозволить мені розглядати плату як статичний об'єкт.
Andy mcevoy

Будь ласка, поставте це у відповідь і прийміть свою відповідь, якщо ви знайшли рішення своєї проблеми; інакше ви можете тримати це відкритим, якщо ви все ще не впевнені на 100%. Термін для опису запропонованого рішення - "переклад простору", тобто ви перекладаєте свою точку дотику між простором екрану та (повернутим) простором плати.
Інженер

Відповіді:


1

Я б взагалі не використовував для цього масиви, оскільки управління ним стане складнішим. Створіть власну структуру даних Ради з вузлами, які мають посилання на своїх сусідів. Це по суті багатовимірний LinkedList of Nodes. Таким чином, якщо лист вузла видалено, інші вузли можуть переглядати це в капсульованому вигляді. Це дозволяє уникнути складної арифметики масиву. Вам знадобиться одна велика функція, щоб правильно підключити все, але колись зв'язана логіка, працювати буде набагато простіше.

Ваші крайові вузли матимуть встановлені сусіди null, тому переконайтеся, що це обробляйте відповідно до ваших методів у класі Node, які мають посилатися на сусідів.

Я використовував цей підхід для впровадження гри Conway's Game Of Life, і як тільки ви налаштуєте її, це різко зменшує складність додавання логіки, яка змінює стан Вузла на основі сусідів.

Залежно від того, як ви маніпулюєте вузлами на дошці, вам може знадобитися один метод плати, щоб перебрати і визначити наступний стан або дію та зберегти це у кожному вузлі. Потім виконайте це, повторивши і переклавши кожен вузол у новий стан. Це дозволяє уникнути того, щоб вузли визначали їх наступний стан, переглядаючи вузли, які вже змінилися.

введіть тут опис зображення


-2

Так, рішення полягає в тому, що ви отримуєте значення від своєї матриці або масиву і встановлюєте це значення для тимчасового масиву або матриці, а потім встановлене значення звідти це показує вам ваше значення обертання повороту. Я додав код нижче, я думаю, його допомогти вам

    int MAX_GRID = 4;
    int[][] main_array = new int[MAX_GRID][MAX_GRID];
    int[][] temp_array = new int[MAX_GRID][MAX_GRID];

    /** This method for clockwise **/
    int mainRow = MAX_GRID - 1;
    for (int c = 0; c < MAX_GRID; c++) {
        for (int r = 0; r < MAX_GRID; r++) {
            temp_array [mainRow][c] = main_array [r][c];
            Log.i("TAG", "R C : [ " + mainRow + " " + c + " ]" + " => [ "
                    + r + " " + c + " ]");
            mainRow--;
        }
    }
    main_array = temp_array;

    /** This method for anti-clockwise **/
    int mainCol = 0;
    for (int c = MAX_GRID - 1; c >= 0; c--) {
        for (int r = MAX_GRID - 1; r >= 0; r--) {
            temp_array [r][mainCol] = main_array [c][r];
            Log.i("TAG", "R C : [ " + r + " " + mainCol + " ]" + " => [ "
                    + c + " " + r + " ]");
        }
        mainCol++;
    }
    main_array = temp_array;

    // Now you can set main_array value then its rotate
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.