(JavaFX)-Snakes and Ladders游戏中的Snake Iteration 2D矩阵

时间:2018-07-12 12:11:54

标签: javafx row-major-order

我正在创建游戏“蛇和梯子”。我正在使用GridPane表示游戏板,显然我想以“蛇形”方式遍历游戏板。就像这样:http://prntscr.com/k5lcaq

掷骰子时,我想向前移动 'dice_num' +您当前的位置,所以我正在使用一维数组计算新索引并转换此索引为2D坐标(反向行优先)。

gameGrid.add(pieceImage, newIndex % ROWS, newIndex / ROWS);

其中 gameGrid 是我的网格窗格的ID,其中newIndex%ROWS代表列坐标,而newIndex / ROWS是行坐标。

问题1: 网格窗格以自己的方式进行迭代。就是这样:https://prnt.sc/k5lhjx。 显然,当2D数组遇到坐标[0,9]时,下一个位置是[1,0],但是我实际想要的下一个位置是[1,9](从91到90)。

问题2: 我想从网格窗格的底部开始计数(从数字1开始,请参见屏幕截图),一直到100。我应该如何反向遍历2D数组?

1 个答案:

答案 0 :(得分:2)

您可以通过以下转换轻松地将坐标系上下颠倒:

y' = maxY - y

要获取“蛇序”,您只需要检查索引差值是否为奇数或偶数行。甚至在增加索引的情况下,也应该增加x坐标

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];