Помогите пожалуйста, этот код из игры тетрис, по идее в конце этого кода создается временная матрица 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];
}
6 апреля 2009 в 12:04
Большое спасибо, разобрался.
6 апреля 2009 в 2:04
Смотри…. Поворот осуществляется следующим образом…
Вот твои (предположим) исходные матрицы:
Вначале.
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];
6 апреля 2009 в 0:03
Что, никто не поможет?
5 апреля 2009 в 15:05
Вот этот код поворачивает матрицу. Я не понимаю как? Вы можете объяснить.
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 апреля 2009 в 15:01
2Иван:
но все-таки геморно) для каждой фигуры много условий поворота. я так когда-то и писал и все работало, но код – отстой. думаю с поворотом матрицы будет правильнее
5 апреля 2009 в 14:04
все же менее геморно думаю именно хранить 4 положения для фигуры. это не так уж и сложно забить массивами. Прописать это на порядок проще, чем моделировать поворот.
5 апреля 2009 в 9:02
Хотя вообще-то… Если хранить фигуру в виде матрицы 4×4 и ее поворачивать и потом проецировать на игровое поле – то наверное неплохо получится. А то хранить все положения фигур наверное не самый быстрый в плане времени реализации способ, нужно писать кучу условий и все такое:)
5 апреля 2009 в 8:05
Ты знаешь, мое мнение, что лучше не поворачивать поле или фигуру, а просто хранить все возможные положения каждой фигуры и переключаться между ними. Алгоритм поворота "чего-нибудь" в общем случае вещь нетривиальная, и в случае тетриса имхо нецелесообразно его использовать.