Подтвердить что ты не робот

Как повернуть 2D-массив целых чисел

Я программирую клон Tetris, и в своей игре я храню свои тетроминовые блоки как 4x4 массивы блоков. Теперь я должен иметь возможность поворачивать целые позиции в массивах, чтобы получить вращающийся блок тетриса. Я не могу просто повернуть текстуру, потому что все мое обнаружение столкновения и т.д. Было разработано для работы с 2D-массивом. Игра написана на С# с использованием XNA.

Как я могу повернуть свой 2D-массив из целых чисел на 90 градусов по часовой стрелке/против часовой стрелки.

Вот как мой блок L хранится в качестве примера.

0 1 0 0
0 1 0 0
0 1 1 0 
0 0 0 0

Спасибо за вашу помощь.

4b9b3361

Ответ 1

Если они представляют собой 2D-массив, вы можете реализовать поворот путем копирования с разными порядками доступа к массиву.

i.e., для вращения по часовой стрелке, попробуйте:

int [,] newArray = new int[4,4];

for (int i=3;i>=0;--i)
{
    for (int j=0;j<4;++j)
    {
         newArray[j,3-i] = array[i,j];
    }
}

Аналогично против часовой стрелки.

Ответ 2

Не поворачивайте фигуры с кодом. Просто сохраните массив различных ориентаций штук и прокрутите их, когда кусок повернут. Нет необходимости динамически поворачивать их в игре Tetris.

Поскольку проблемной областью является Tetris, вы обнаружите, что алгоритм вращения вызывает нежелательные эффекты, такие как длинный тонкий Tetronimo, не чередующийся между двумя позициями (как это происходит в реальной вещи).

Ответ 3

В классическом тетрисе очень мало перестановок объектов. Я бы просто имел постоянный массив для каждого "тетромино" в каждой из 4-х позиций и простую логику для выбора подходящего на основе ввода.

Зачем тратить процессорные циклы на его вращение?

Ответ 4

Если вы хотите повернуть блок 4 x 4, вы просто перемещаете позиции:

A B C A
C D D B
B D D C
A C B A

Каждый A переходит к следующему A и тот же для B, C и D.

   /-----\
   |     |
   |     V
   A B C A
/->C D>D B--\
|  B D D C  |
|  A C B A  |
|    | ^    |
|    | |    |
\----/ \----/     

Ответ 5

Я бы сохранил (x, y) координаты "ячеек" и использовал вращающуюся матрицу для их вращения. См. Рисование поворотного прямоугольника. Вероятно, вам придется округлить результат до максимального значения 0.5.

Ответ 6

js как по часовой стрелке, так и против часовой стрелки:

function arrRotation90(arr, clockwise) {
            var arr_rotated = [];
            for (var i = 0; i < arr[0].length; i++) {
                arr_rotated[i] = [];
            }
            if (clockwise) {
                for (var i = 0; i < arr.length; i++) {
                    for (var j = 0; j < arr[i].length; j++) {
                        arr_rotated[arr[i].length-1-j][i] = arr[i][j];
                    }
                }
            } else {
                for (var i = 0; i < arr.length; i++) {
                    for (var j = 0; j < arr[i].length; j++) {
                        arr_rotated[j][arr.length - 1 - i] = arr[i][j];
                    }
                }
            }
            return arr_rotated;
        }