トップページ > 電子工作インデックス > テトリス > 2. テトリスのアルゴリズム

2. テトリスのアルゴリズム

テトリスというのは、アレです。上からブロックが落ちてきて、コントローラーで 動かしたり回転させたりして積んでいって、うまく横一列並べるとブロックが消えて 点数が入る…というやつですね。私はコレ作るまでテトリスで遊んだことがほとんど なかったので、とりあえずルールの確認です。

ほとんどのテトリスは次に出るブロックの表示があるようですが、今回 のディスプレイは電光掲示板なので表示するスペースがありません。 よって単にゲーム画面だけを表示するものとします。 また、スコアはコントローラーに付いている液晶ディスプレイに 表示し、ハイスコアを記録してスコアとともに表示します。 (電源を切るとハイスコアは消えますが…)

テトリスで必要な処理は、
  1. 画面出力関数
  2. ランダムブロック生成関数
  3. 落下関数
  4. コントローラー入力処理関数
  5. ブロック移動関数
  6. ブロック回転関数
  7. ブロック1列消去関数

まず画面出力関数は、電光掲示板用として作ったものを流用します。 テトリスの動作としては、まず上から降ってくるブロックをランダムで決定した後、それを 落下させます。落下の1ステップごとにブロックが画面最上部まで積み上がっているか、 1列そろっているかを確認します。 という処理のループです。もし入力が入ればブロックを移動させるなり、回転 させるなりします。

main関数

//********************************************************************
//メイン

void main(void)
{
 ini(); //ポートの入出力設定です。

 //変数eは、ゲームの1画面あたりの時間を決めます。
 //これを小さくするとブロックが速く落ちます。
 //最初はeの値を8にします。(だいたい並の速さ…) 

 e=8;

 //ここを無限ループ
 while(1);
 {

  //--------------------------------------------------------------------
 
 //ポートBはコントローラー入力用につかっています。
 //何かしら入力があれば処理関数を呼びます。(割り込み使ってない… 汗)
 
 if(PB.DR.BYTE != 0x1f) controlblock();

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

  //gameover変数は、ブロックが積み上がった場合に別な関数によって1にされます。
  //show_game_over()関数はゲームオーバー画面を出す関数…そのまま

  if(gameover == 1) show_game_over();

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

  //カウントダウン
  e--;

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


  //時間経過していればブロックを落とす。
  if(e==0) dropblock();

  //まだ時間経過していなければ、画面を出して時間かせぎ。
  else putout();

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


 }
}

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

前へ   次へ