Как повернуть 2D массив целых чисел - PullRequest
17 голосов
/ 14 марта 2009

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

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

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

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

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

Ответы [ 6 ]

29 голосов
/ 14 марта 2009

Если это двумерный массив, вы можете осуществлять ротацию, копируя с разными порядками доступа к массиву.

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

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

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

11 голосов
/ 14 марта 2009

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

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

6 голосов
/ 14 марта 2009

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

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

4 голосов
/ 14 марта 2009

Если вы хотите повернуть блок 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  |
|    | ^    |
|    | |    |
\----/ \----/     
1 голос
/ 14 марта 2009

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

0 голосов
/ 15 марта 2017

код 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;
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...