A.Tressos
A.Tressos

Reputation: 35

(JavaFX) - Snake Iteration 2D Matrix at Snakes and Ladders game

I am creating the game "Snakes And Ladders". I am using a GridPane to represent the game board and obviously I want to move through the board in a "snake" way. Just like that: http://prntscr.com/k5lcaq .

When the dice is rolled I want to move 'dice_num' moves forward + your current position, so I am calculating the new index using an 1D array and I convert this index to 2D coordinates (Reverse Row-Major Order).

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

Where gameGrid is the ID of my grid pane, newIndex % ROWS represents the column coordinate and newIndex / ROWS the row coordinate.

PROBLEM 1: The grid pane is iterating in its own way. Just like that: https://prnt.sc/k5lhjx. Obviously when the 2D array meets coordinates [0,9] , next position is [1,0] but what I actually want as next position is [1,9] (going from 91 to 90).

PROBLEM 2: I want to start counting from the bottom of the grid pane (from number 1, see screenshots) and go all the way up till 100. But how am I supposed to reverse iterate through a 2D array?

Upvotes: 1

Views: 732

Answers (1)

fabian
fabian

Reputation: 82461

You can easily turn the coordinate system upside down with the following conversion:

y' = maxY - y

To get the "snake order", you simply need to check, if the row the index difference is odd or even. For even cases increasing the index should increase the x coordinate

x' = x

for odd cases you need to apply a transformation similar to the y transformation above

x' = xMax - x

The following methods allow you to convert between (x, y) and 1D-index. Note that the index is 0-based:

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

This should allow you to easily modify the position:

int[] nextPos = getPosition(steps + getIndex(currentX, currentY));
int nextX = nextPos[0];
int nextY = nextPos[1];

Upvotes: 2

Related Questions