Вращающиеся блоки в 2D-массиве - PullRequest
1 голос
/ 23 февраля 2012

Я делаю программу, похожую на знаменитую игру Tetris, и у меня возникли некоторые проблемы, связанные с вращением блока.

Я знаю, что вы можете вращать фигуры в системе координат, используя "x = -y" и "y = x", но проблема в том, что, поскольку я использую массив целых чисел для представления блока, он делает вещи так гораздо сложнее.

Мой массив выглядит так:

int[][] space = new int[20][10];

И если координата содержит блок, значение равно 1, иначе это 0.

Так, как я могу вращать блок в этом месте, не получая проблем с отрицательными числами?

Ответы [ 2 ]

2 голосов
/ 23 февраля 2012

Вот пример (повторное использование int [] [] с использованием 0 и 1, что также можно сделать с использованием логического массива):

private static final int[][] piece = new int[][] {
        { 0, 1, 0, },
        { 1, 1, 1, },
};

Вы можете вращатьчасть, которая делает это:

private static int[][] rotate( final int[][] piece ) {
    final int[][] res = new int[piece[0].length][piece.length];
    for (int x = 0; x < piece.length; x++) {
        for (int y = 0; y < piece[0].length; y++) {
            res[(res.length-1)-y][x] = piece[x][y];
        }
    }
    return res;
}

Начальная часть:

010
111

Здесь поворот (кусок) :

01
11
01

Вот поворот (поворот (кусок)) :

111
010

А вот поворот (поворот (поворот (кусок))) :

10
11
10
0 голосов
/ 23 февраля 2012

Если я правильно понял, вы можете сделать это, применяя фиксированное смещение к координатам.Смещение - это центр, вокруг которого вы хотите повернуть.

int oldSpace[][] = new int[20][10];
int newSpace[][] = new int[20][10];
int offX = 10;
int offY = 5;
for(int x = -5; x < 5; x++) {
  for(int y = -5; y < 5; y++) {
    newSpace[offX+x][offY+y] = oldSpace[offX-y][offY+x];
  }
}

Я предположил, что 20 - это измерение X, а 10 - измерение Y.Это вращает блок 10x10 вокруг координаты (10,5).Обратите внимание, что я только повернул блок 10x10 в середине, так как это пересечение двух пространств.Возможно, вы копируете массив [20] [10] в массив [10] [20], и в этом случае вы можете увеличить диапазон y, чтобы он работал от -10 до 9.

EDIT:Извините, вам также нужен другой набор смещений, если у вас есть выходной массив другой формы, так как (10,5) больше не будет в центре.Но вы должны быть в состоянии понять это.

...