トップページ > 電子工作インデックス > テトリス > 6. 回転関数

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();
}


//********************************************************************

前へ   次へ