トップページ > 電子工作インデックス > テトリス > 2. テトリスのアルゴリズム
テトリスというのは、アレです。上からブロックが落ちてきて、コントローラーで 動かしたり回転させたりして積んでいって、うまく横一列並べるとブロックが消えて 点数が入る…というやつですね。私はコレ作るまでテトリスで遊んだことがほとんど なかったので、とりあえずルールの確認です。
ほとんどのテトリスは次に出るブロックの表示があるようですが、今回 のディスプレイは電光掲示板なので表示するスペースがありません。 よって単にゲーム画面だけを表示するものとします。 また、スコアはコントローラーに付いている液晶ディスプレイに 表示し、ハイスコアを記録してスコアとともに表示します。 (電源を切るとハイスコアは消えますが…)
テトリスで必要な処理は、まず画面出力関数は、電光掲示板用として作ったものを流用します。 テトリスの動作としては、まず上から降ってくるブロックをランダムで決定した後、それを 落下させます。落下の1ステップごとにブロックが画面最上部まで積み上がっているか、 1列そろっているかを確認します。 という処理のループです。もし入力が入ればブロックを移動させるなり、回転 させるなりします。
//******************************************************************** //メイン 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(); //-------------------------------------------------------------------- } } //********************************************************************