(JavaFX) - 2D-матрица итерации змей в игре "Змеи и лестницы"
Я создаю игру "Змеи и лестницы". Я использую GridPane для представления игровой доски, и, очевидно, я хочу перемещаться по доске "змеей". Просто так: http://prntscr.com/k5lcaq.
Когда игральные кости брошены, я хочу переместить 'dice_num', двигаясь вперед + ваша текущая позиция, поэтому я рассчитываю новый индекс, используя массив 1D, и я конвертирую этот индекс в 2D координаты (обратный порядок строк-старших).
gameGrid.add(pieceImage, newIndex % ROWS, newIndex / ROWS);
Где gameGrid - это идентификатор моей панели сетки, newIndex % ROWS представляет координату столбца, а newIndex / ROWS - координату строки.
ПРОБЛЕМА 1: Панель сетки повторяется по-своему. Просто так: https://prnt.sc/k5lhjx. Очевидно, что когда 2D-массив встречает координаты [0,9], следующая позиция - [1,0], но я действительно хочу, чтобы следующая позиция была [1,9] (переход от 91 до 90).
ПРОБЛЕМА 2: Я хочу начать отсчет с нижней части панели сетки (от номера 1, см. Скриншоты) и пройти весь путь до 100. Но как я должен повернуть итерацию в двумерном массиве?
1 ответ
Вы можете легко перевернуть систему координат с помощью следующего преобразования:
y' = maxY - y
Чтобы получить "порядок змей", вам просто нужно проверить, является ли в строке разность индексов нечетной или четной. Для четных случаев увеличение индекса должно увеличить координату х
x' = x
для нечетных случаев необходимо применить преобразование, аналогичное приведенному выше преобразованию y
x' = xMax - x
Следующие методы позволяют конвертировать между (x, y)
и 1D-index
, Обратите внимание, что index
основано на 0:
private static final int ROWS = 10;
private static final int COLUMNS = 10;
public static int getIndex(int column, int row) {
int offsetY = ROWS - 1 - row;
int offsetX = ((offsetY & 1) == 0) ? column : COLUMNS - 1 - column;
return offsetY * COLUMNS + offsetX;
}
public static int[] getPosition(int index) {
int offsetY = index / COLUMNS;
int dx = index % COLUMNS;
int offsetX = ((offsetY & 1) == 0) ? dx : COLUMNS - 1 - dx;
return new int[] { offsetX, ROWS - 1 - offsetY };
}
for (int y = 0; y < ROWS; y++) {
for (int x = 0; x < COLUMNS; x++, i++) {
System.out.print('\t' + Integer.toString(getIndex(x, y)));
}
System.out.println();
}
System.out.println();
for (int j = 0; j < COLUMNS * ROWS; j++) {
int[] pos = getPosition(j);
System.out.format("%d: (%d, %d)\n", j, pos[0], pos[1]);
}
Это должно позволить вам легко изменить позицию:
int[] nextPos = getPosition(steps + getIndex(currentX, currentY));
int nextX = nextPos[0];
int nextY = nextPos[1];