トップページ > 電子工作インデックス > テトリス > 7. 一列判定消し関数

7. 一列判定消し関数

ブロックが横一列そろっているか確認し、そろっている場合はその列を消去、 上の段を1段下げて表示、得点を加算します。 連鎖に対応するために、ブロックの切れ目が見つかるまで永久ループ→切れ目が 見つかったらbreak…という構造になっています。

このテトリスのハードの仕様上、ブロックは1行分でも、配列としては2行分のLEDを 使っているので、列の消去&得点のカウントは2行単位で行います。また、壁の厚さは LED2つ分なので、そのことも考慮します。

液晶用表示機にスコアを出すsocore_out()関数は後述です。

//********************************************************************
//グローバル変数

//得点用の変数
unsigned long int score;


//********************************************************************
//一列消し関数

void check_lines(void)
{

 //for文用変数
 int i,j,k;
 
 //1列埋まっているかを確認するための変数
 char flag;
 
 //連鎖のカウント用
 int lines=0;
  
 while(1)
 {

  //y方向の、タテの行をまず指定します。
  for(i=2;i<36;i++) 
  {
  
   //最初にflagを1にしておきます。
   flag = 1;

   //各行において、x方向に動いて、ブロックで埋まっているかチェック。  
   for(j=2;j<22;j++) 
   {
    //背景の配列backを対象に、調査します。
    if(back[i][j] == 0)
    {
     //もしブロックの切れ目があれば、flagを"0"にします。
     flag = 0;
    }
   }

   //1列すべてブロックで埋まっていれば、for文を抜けて、その列を消去しに行く。
   //この時、変数iは消去する行の番号を保持してます。

   if(flag == 1) break;  

  }

  //for文を最後までまわしきって、ブロックで埋まった行が無い場合(flagが"0")は、
  //whileループを抜けて得点の清算に行きます。
  
  if(flag == 0) break;
  

  //連鎖用変数をインクリメント
  lines++;
    
  
  //消した列の分だけ、下にずらします。
  //変数iは消去する列の番号です。(上のfor文から持ってきた)

  for(k=i;k>0;k--)
  {
   for(j=1;j<22;j++)
   {
    back[k][j] = back[k-1][j];
   }
  }
  
  
 }

//↑ここまでがwhile(1)ループです。

//--------------------------------------------------------------------  

//↓while(1)をbreak後の処理


//消したラインの数によって、スコアを加算。
//さらにブロック破壊音を出し、液晶に得点を表示し、終了します。
//2行単位でカウントする点に注意…。

 switch(lines)
 {
  case 2:
   score+=100;
   voice2();
   socre_out();
   break;
      
  case 4:   
   score+=300;     
   voice2();    
   socre_out();    
   break;

  case 6:     
   score+=500;
   voice2();
   socre_out();
   break;

  case 8:
  
   score+=1000;
   voice2();
   socre_out();
   break;

 }
}


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

前へ   次へ