Генерация координат для карты памяти

66
5

Как я могу сгенерировать (x, y) координаты для игры с карточкой памяти? Скажем, я могу установить количество карточек, строк и столбцов. Как будет выглядеть мой цикл for?

Моя общая идея такова:

final int ROWS = 4;
final int COLUMNS = 5;

for(int i = 0; i<ROWS; i++){

for(int j = 0; j<COLUMNS; j++){
//calculate X coordinate
int index = some_calculation
MemoryCard memoryCard = new MemoryCard(x, y, index);
}
//calculate y coordinate
}

Однако у меня возникла проблема с созданием моих объектов здесь. Вышеуказанный цикл будет идти 4 раза для я и 5 раз для j. Итак, в общей сложности у меня есть 20 объектов. Но как мне добраться до индекса объекта? Скажем, у меня есть список массивов моих объектов:

private ArrayList<MemoryCard> objects = new ArrayList<MemoryCard>();
//parameters for MemoryCard object are (float x, float y, Texture frontImage)

Есть ли способ сделать эту динамику? Чтобы программа сгенерировала правильные позиции, если я установил число ROWS равным 3, а COLUMS - 6? Или любая другая четная пара.

спросил(а) 2014-09-10T13:49:00+04:00 5 лет, 9 месяцев назад
1
Решение
68

вы можете легко перевести...

public int getIndexOf(int x, int y){
return x + y * ROWS;
}

и снова вернется...

public int getXFromIndex(int index){
return index%ROWS;
}

public int getYFromIndex(int index){
return index/ROWS;
}

ответил(а) 2014-09-10T13:52:00+04:00 5 лет, 9 месяцев назад
66

Мартин Фрэнк уже дал правильный ответ на ваш вопрос, но я хотел бы представить альтернативное решение. Вместо того, чтобы сериализовать ваши строки и столбцы в списке массивов 1D, почему бы не использовать 2D-массив?

MemoryCard[][] cards = new MemoryCard[ROWS][COLUMNS];

Затем вы можете получить доступ к своей карте в строке x и столбце y так:

MemoryCard card = cards[x][y];

ответил(а) 2014-09-10T13:56:00+04:00 5 лет, 9 месяцев назад
56

Похоже, было бы лучше использовать 2D-массив, который будет легче поддерживать и визуализировать позиции, что-то вроде

Objects[][] memoryCards;

Затем, чтобы заполнить его, вы просто используете свой цикл.

ответил(а) 2014-09-10T13:56:00+04:00 5 лет, 9 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема