トップページ > 電子工作インデックス > テトリス > 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(); } //********************************************************************