トップページ > 電子工作インデックス > テトリス > 6. 回転関数
blockは操作中のブロックを扱うグローバル変数の2次元配列です。 このblockに保存されている形を90度だけ回転させる関数です。 blockは8×8の配列ですが、簡潔にするために3×3行列でアルゴリズムを 考えることにします。
難しいリクツだと、線形代数で習った(気がする)回転行列というやつを作用させるわけですが、 実際の処理では「転置させて、行の順番をひっくりかえす」 ことで右90度回転が実現できます。実際に自分の手で試してみると面白いです。
左90度回転は、「転置して、列の順番をひっくりかえす」ことで実現します。
//********************************************************************
//ブロック回転
//右回り
void turn_block1(void)
{
//一時的なデータ置場
int temp[8][8]={0};
//例のごとく、for文用変数です。
int i,j;
//まず、回転させるブロックのデータをtempにコピー。
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
{
temp[i][j]=block[i][j];
}
}
//--------------------------------------------------------------------
//転置して、さらに行を逆順に入れ替えることで90度右回りに回転させる。
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
{
block[i][j]=temp[j][7-i];
}
}
//--------------------------------------------------------------------
//もし回転後のブロックが回りと干渉するようだったら、
//もとのブロックデータをもう一度書き直す。
if(checkoverlap(x,y)==1)
{
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
{
block[i][j]=temp[i][j];
}
}
}
//実際のゲーム画面を変更する。
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
{
//まず元のブロックデータを消す
display[y+i][x+j] -= temp[i][j];
//新しくブロックデータを上書き
display[y+i][x+j] += block[i][j];
}
}
//回転音
voice1();
//画面に出力
putout();
}
//********************************************************************
//ブロック回転
//左回り
void turn_block2(void)
{
//一時的なデータ置場
int temp[8][8]={0};
//for文用変数です。
int i,j;
//まず、回転させるブロックのデータをtempにコピー。
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
{
temp[i][j]=block[i][j];
}
}
//--------------------------------------------------------------------
//転置して、列を逆順にすることで90度左回りに回転させる。
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
{
block[i][j]=temp[7-j][i];
}
}
//--------------------------------------------------------------------
//もし回転後のブロックが回りと干渉するようだったら、
//もとのブロックデータをもう一度書き直す。
if(checkoverlap(x,y)==1)
{
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
{
block[i][j]=temp[i][j];
}
}
}
//実際のゲーム画面を変更する。
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
{
//まず元のブロックデータを消す
display[y+i][x+j] -= temp[i][j];
//新しくブロックデータを上書き
display[y+i][x+j] += block[i][j];
}
}
//回転音
voice1();
//画面に出力
putout();
}
//********************************************************************