Как повернуть фигуру тетриса?

107
14 марта 2021, 09:20

Есть фигура из тетриса (любая из 7), а в коде прописан массив из Point. Этот массив состоит из 4 элементов, так как в тетрисе каждая фигура — это 4 квадрата.

Point[] cord = new Point[4] { new Point(0,4), new Point(0,5), 
                              new Point(0,6), new Point(0,6) } 

И есть игровое поле:

int[] field = new int[10, 20];

Оно заполнено нулями, кроме координат из cord (они заполнены единицами).

Так вот, как поворачивать эту фигуру на 90? Может есть какая-нибудь формула, а то прописывать в коде 4 положения каждой фигуры это не очень.

Answer 1

Если исходный массив [0 1 2 3] выглядит как

0 1
2 3

То его ротация будет выглядеть как

1 3
0 2

То есть массив превращается в [1 3 0 2]

Чтобы это сделать для 4 элементов, не надо ни цмклов, ничего, например

public void Rotate<T>(T[] input)
{
    T i00 = input[0];
    T i01 = input[1];
    T i10 = input[2];
    T i11 = input[3];
    input[0] = i01;
    input[1] = i11;
    input[2] = i00;
    input[3] = i10;
}

Проверка

Для общего случая я позаимствовал и немного допилил реализацию отсюда

static void Rotate<T>(int width, T[] mat)
{   
    for (int x = 0; x < width / 2; x++)
    {       
        for (int y = x; y < width - x - 1; y++)
        {           
            T temp = mat[GetIndex(x, y, width)];            
            mat[GetIndex(x, y, width)] = 
                mat[GetIndex(y, width - 1 - x, width)];         
            mat[GetIndex(y, width - 1 - x, width)] = 
                mat[GetIndex(width - 1 - x, width - 1 - y, width)];         
            mat[GetIndex(width - 1 - x, width - 1 - y, width)] = 
                mat[GetIndex(width - 1 - y, x, width)];         
            mat[GetIndex(width - 1 - y, x, width)] = temp;
        }
    }
}
static int GetIndex(int i, int j, int width)
{
    return i*width+j;
}

Проверка

Answer 2

Сделал по простой формуле, все заработало:

x2 = px + py - y1
y2 = x1 + py - px

Где px и py это координаты квадрата, вокруг которого крутятся все остальные, а x1 и y1 это текущие координаты.

READ ALSO
Подключение к WCF сервису через прокси

Подключение к WCF сервису через прокси

Пытаюсь выполнить подключение к WCF сервису через проксиНа прокси настроена авторизация по логину-паролю

98
Создание сложного заголовка в C# WPF DataGrid

Создание сложного заголовка в C# WPF DataGrid

Необходимо создать таблицу, которая будет иметь следующую шапку, желательно использовать MVVM

101
Перехват исключений в службе Windows

Перехват исключений в службе Windows

Есть служба Windows, которая является хостом для WCF-службыПри инициализации службы Windows подписываюсь на событие

109