singlepost

Помогите с Тетрисом. << На главную или назад  

Помогите пожалуйста, этот код из игры тетрис, по идее в конце этого кода создается временная матрица tempShape, для поворота игрового поля, то есть поворачивается не фигура, а игровое поле, я не могу понять каким образом происходит поворот, извините но я чайник. Поворот линий и кубов ясен, а остальных фигур?

class Shape
{
public:
boolcells[4][4]; // 4×4 matrix that conatains the shape
ShapeTypecurType; // current type of shape

voidNewShape( ShapeType );
voidRotate();
voidClearShape( bool c[4][4] ); // clear the 4×4 matrix
};

void Shape::ClearShape( bool c[4][4] )
{

for( int i=0; i<4; i++)
for( int j=0; j<4; j++)
c[i][j]=false;
}

void Shape::NewShape( ShapeType type )
{
ClearShape(cells);
int i;
curType=type;

switch(type)
{
case line:for(i=0; i<4; i++)
cells[0][i]=true;
break;

case square:for(i=0; i<2; i++)
for(int j=0; j<2; j++)
cells[i][j]=true;
break;

case leftL:for(i=0; i<3; i++)
cells[0][i]=true;
cells[1][2]=true;
break;

case rightL:for(i=0; i<3; i++)
cells[0][i]=true;
cells[1][0]=true;
break;

case pyramide:for(i=0; i<3; i++)
cells[1][i]=true;
cells[0][1]=true;
break;

case leftZ:cells[0][0]=true; cells[1][0]=true;
cells[1][1]=true; cells[2][1]=true;
break;

case rightZ:cells[0][1]=true; cells[1][0]=true;
cells[1][1]=true; cells[2][0]=true;
break;
}
}

void Shape::Rotate()
{

switch(curType)
{
case line:
{
int k;
if(cells[0][0]==true)
{
ClearShape(cells);
for(k=0; k<4; k++)
cells[k][1]=true;
}
else
{
ClearShape(cells);
for(k=0; k<4; k++)
cells[0][k]=true;
}
}
case square: return;
}

bool tempShape[4][4];
ClearShape(tempShape);

for(int j=3-1 , c=0; j>=0 ; j– , c++)
for(int i=0; i<3; i++)
tempShape[c][i]=cells[i][j];

ClearShape(cells);

for(int f=0; f<3; f++)
for(int d=0; d<3; d++)
cells[f][d]=tempShape[f][d];
}

8 ответов в теме “Помогите с Тетрисом.”

  1. 8
    Арбалет Арбалетович ответил:

    Большое спасибо, разобрался.

  2. 7
    Кирилл Вишневский ответил:

    Смотри…. Поворот осуществляется следующим образом…

    Вот твои (предположим) исходные матрицы:

    Вначале.
    cells _______tempShape
    123 _______ 000
    456 _______ 000
    789 _______ 000

    Затем вtempShape записываются элементы матрицы cells:

    369
    258
    147

    По след принцыпу: Берется элемент строки и вставляется в элемент столбца ))))

    Все это вцикле

    for(int j=3-1 , c=0; j>=0 ; j– , c++)
    for(int i=0; i<3; i++)
    tempShape[c][i]=cells[i][j];

  3. 6
    Арбалет Арбалетович ответил:

    Что, никто не поможет?

  4. 5
    Арбалет Арбалетович ответил:

    Вот этот код поворачивает матрицу. Я не понимаю как? Вы можете объяснить.

    bool tempShape[4][4];
    ClearShape(tempShape);

    for(int j=3-1 , c=0; j>=0 ; j– , c++)
    for(int i=0; i<3; i++)
    tempShape[c][i]=cells[i][j];

    ClearShape(cells);

    for(int f=0; f<3; f++)
    for(int d=0; d<3; d++)
    cells[f][d]=tempShape[f][d];

  5. 4
    Алексей Авраменко ответил:

    2Иван:
    но все-таки геморно) для каждой фигуры много условий поворота. я так когда-то и писал и все работало, но код – отстой. думаю с поворотом матрицы будет правильнее

  6. 3
    Иван Горбачев ответил:

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

  7. 2
    Олег Савинов ответил:

    Хотя вообще-то… Если хранить фигуру в виде матрицы 4×4 и ее поворачивать и потом проецировать на игровое поле – то наверное неплохо получится. А то хранить все положения фигур наверное не самый быстрый в плане времени реализации способ, нужно писать кучу условий и все такое:)

  8. 1
    Олег Савинов ответил:

    Ты знаешь, мое мнение, что лучше не поворачивать поле или фигуру, а просто хранить все возможные положения каждой фигуры и переключаться между ними. Алгоритм поворота "чего-нибудь" в общем случае вещь нетривиальная, и в случае тетриса имхо нецелесообразно его использовать.

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.