Как повернуть 2D-массив целых чисел
Я программирую клон Tetris, и в своей игре я храню свои тетроминовые блоки как 4x4 массивы блоков. Теперь я должен иметь возможность поворачивать целые позиции в массивах, чтобы получить вращающийся блок тетриса. Я не могу просто повернуть текстуру, потому что все мое обнаружение столкновения и т.д. Было разработано для работы с 2D-массивом. Игра написана на С# с использованием XNA.
Как я могу повернуть свой 2D-массив из целых чисел на 90 градусов по часовой стрелке/против часовой стрелки.
Вот как мой блок L хранится в качестве примера.
0 1 0 0
0 1 0 0
0 1 1 0
0 0 0 0
Спасибо за вашу помощь.
Ответы
Ответ 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;
}