(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];
Другие вопросы по тегам