Алгоритм вращения фигуры тетриса - PullRequest
45 голосов
/ 24 октября 2008

Каковы лучшие алгоритмы (и объяснения) для представления и вращения частей игры тетрис? Я всегда нахожу схемы вращения и представления фигуры запутанными.

Кажется, что в большинстве игр с тетрисом на каждом обороте используется наивная «переделка массива блоков»:

http://www.codeplex.com/Project/ProjectDirectory.aspx?ProjectSearchText=tetris

Однако некоторые используют предварительно созданные кодированные числа и сдвиг битов для представления каждого фрагмента:

http://www.codeplex.com/wintris

Есть ли способ сделать это с использованием математики (не уверен, что он будет работать на доске на основе ячеек)?

Ответы [ 15 ]

1 голос
/ 06 января 2011

для кусков тетриса размером 3х3 переверните x и y вашего произведения затем поменяйте местами внешние столбцы это то, что я понял некоторое время

0 голосов
/ 30 октября 2017

Python:

pieces = [
    [(0,0),(0,1),(0,2),(0,3)],
    [(0,0),(0,1),(1,0),(1,1)],
    [(1,0),(0,1),(1,1),(1,2)],
    [(0,0),(0,1),(1,0),(2,0)],
    [(0,0),(0,1),(1,1),(2,1)],
    [(0,1),(1,0),(1,1),(2,0)]
]

def get_piece_dimensions(piece):
    max_r = max_c = 0
    for point in piece:
        max_r = max(max_r, point[0])
        max_c = max(max_c, point[1])
    return max_r, max_c

def rotate_piece(piece):
    max_r, max_c = get_piece_dimensions(piece)
    new_piece = []
    for r in range(max_r+1):
        for c in range(max_c+1):
            if (r,c) in piece:
                new_piece.append((c, max_r-r))
    return new_piece
0 голосов
/ 18 февраля 2013

В Ruby, по крайней мере, вы можете использовать матрицы. Представьте фигуры фигуры в виде вложенных массивов массивов, таких как [[0,1], [0,2], [0,3]]

require 'matrix'
shape = shape.map{|arr|(Matrix[arr] * Matrix[[0,-1],[1,0]]).to_a.flatten}

Однако я согласен с тем, что жесткое кодирование форм осуществимо, поскольку для каждой из 28 линий имеется 7 фигур и 4 состояния, и никогда больше этого не будет.

Подробнее об этом см. В моем блоге на http://pivotallabs.com/the-simplest-thing-that-could-possibly-work-in-tetris/ и полностью рабочая реализация (с небольшими ошибками) на https://github.com/andrewfader/Tetronimo

0 голосов
/ 07 октября 2012

Если размер массива равен 3 * 3, то самый простой способ повернуть его, например, против часовой стрелки, это:

oldShapeMap[3][3] = {{1,1,0},
                     {0,1,0},
                     {0,1,1}};

bool newShapeMap[3][3] = {0};
int gridSize = 3;

for(int i=0;i<gridSize;i++)
    for(int j=0;j<gridSize;j++)
        newShapeMap[i][j] = oldShapeMap[j][(gridSize-1) - i];
/*newShapeMap now contain:    
                               {{0,0,1},
                                {1,1,1},
                                {1,0,0}};

*/ 
0 голосов
/ 24 октября 2008

Я использовал положение фигуры и набор из четырех координат для четырех точек во всех фигурах. Поскольку он находится в 2D-пространстве, вы можете легко применить 2D-матрицу вращения к точкам.

Точки - это div'ы, поэтому их класс css выключен. (это после очистки класса css от того, где они были в последний ход.)

...