(JavaFX) - Snakes and Ladders 游戏中的 Snake Iteration 2D Matrix
(JavaFX) - Snake Iteration 2D Matrix at Snakes and Ladders game
我正在创建游戏 "Snakes And Ladders"。我正在使用 GridPane 来表示游戏板,显然我想以 "snake" 的方式在板上移动。就像那样:http://prntscr.com/k5lcaq .
掷骰子时我想'dice_num'移动向前+你现在的位置,所以我在计算使用一维数组的新索引,我将该索引转换为二维坐标(反向行主顺序)。
gameGrid.add(pieceImage, newIndex % ROWS, newIndex / ROWS);
其中 gameGrid 是我的网格窗格的 ID,newIndex % ROWS 表示列坐标,newIndex / ROWS 表示行坐标。
问题 1: 网格窗格以其自己的方式迭代。就像那样:https://prnt.sc/k5lhjx。
显然,当二维数组遇到坐标 [0,9] 时,下一个位置是 [1,0] 但我真正想要的下一个位置是 [1,9] (从 91 到 90)。
问题 2: 我想从网格窗格的底部开始计数(从数字 1 开始,见屏幕截图)然后开始一直到 100。但是我应该如何反向迭代二维数组?
您可以通过以下转换轻松颠倒坐标系:
y' = maxY - y
要获得 "snake order",您只需检查索引差异是奇数还是偶数的行。对于偶数情况,增加索引应该增加 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];
我正在创建游戏 "Snakes And Ladders"。我正在使用 GridPane 来表示游戏板,显然我想以 "snake" 的方式在板上移动。就像那样:http://prntscr.com/k5lcaq .
掷骰子时我想'dice_num'移动向前+你现在的位置,所以我在计算使用一维数组的新索引,我将该索引转换为二维坐标(反向行主顺序)。
gameGrid.add(pieceImage, newIndex % ROWS, newIndex / ROWS);
其中 gameGrid 是我的网格窗格的 ID,newIndex % ROWS 表示列坐标,newIndex / ROWS 表示行坐标。
问题 1: 网格窗格以其自己的方式迭代。就像那样:https://prnt.sc/k5lhjx。 显然,当二维数组遇到坐标 [0,9] 时,下一个位置是 [1,0] 但我真正想要的下一个位置是 [1,9] (从 91 到 90)。
问题 2: 我想从网格窗格的底部开始计数(从数字 1 开始,见屏幕截图)然后开始一直到 100。但是我应该如何反向迭代二维数组?
您可以通过以下转换轻松颠倒坐标系:
y' = maxY - y
要获得 "snake order",您只需检查索引差异是奇数还是偶数的行。对于偶数情况,增加索引应该增加 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];