トップページ > 電子工作インデックス > テトリス > 4. ランダムブロック生成関数
テトリスは上からどんどん落ちてくるブロックをうまく並べるゲームですが、 毎回落ちてくるブロックはランダムに選ばなければなりません。 今回はH8の内蔵タイマーモジュールを利用して、タイマーカウンタの値をもとに ブロックを選ぶことにします。これで乱数が生成できるのかは微妙なところなのですが、 とりあえず遊んでみると違和感ないので、これでよしとします(笑)
テトリスの制御につかっているマイコンはH8-3052ですが、3052には5チャンネルのタイマーが 用意されています。今回はタイマー0を利用します。 H8のタイマーモジュールはITU(Integrated Timer Unit)と呼ばれ、設定するレジスタは いくつかありますが今回は、タイマーの実際のカウント値を保存するTCNT (タイマーカウンター)レジスタ・タイマーの動作に関する設定をするTCR (タイマーコントロールレジスタ) レジスタ・タイマー割り込みについて設定をするTIER (タイマーインタラプトイネーブルレジスタ) レジスタ・タイマーのスタート/ストップを制御する TSTR(タイマースタート)レジスタ …の4つだけを見ていくことにします。
bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 |
ナシ | CCLR1 | CCLR0 | CKEG1 | CKEG0 | TPSC2 | TPSC1 | TPSC0 |
bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 |
ナシ | ナシ | ナシ | ナシ | ナシ | OVIE | IMIEB | IMIEA |
bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 |
ナシ | ナシ | ナシ | STR4 | STR3 | STR2 | STR1 | STR0 |
//******************************************************************** //タイマーの設定 ITU0.TCR.BYTE=0; ITU0.TIER.BYTE=0; ITU.TSTR.BIT.STR0=1; //タイマースタート //********************************************************************
まず、前述の通りブロックの形を決めるための const型の配列、blocksを用意しておきます。処理内容は非常に単純で、 ただグローバル変数の2次元配列blockに、雛型をコピーするだけです。 あとはblockを他の関数で使いまわせばいい…と。もう一つ、ブロック生成の 時点でゲームオーバーになっているかもしれないので、それだけチェックして おくことにします。 グローバル変数はお行儀悪い(?)らしいのですが、 このテトリスはC言語の習作として作ったものなので、ご容赦ください。
//********************************************************************* //グローバル変数 //操作中のブロック用配列 char block[8][8]; //操作中のブロックの位置を表す変数 char x; char yl //********************************************************************* //ブロック生成 void make_block(void) { int i,j; //forループ用 int block_type; //ブロックの種類 //乱数を発生させ、ブロックの種類を決定 block_type = ITU0.TCNT % 7; //新しいブロックを作ったので、座標は初期位置(中央の一番上)にセット。 x=8; y=0; //グローバル変数のblockに、選ばれたブロックの形をコピーする(他の関数でも扱えるように)。 for(i=0;i<8;i++) { for(j=0;j<8;j++) { block[i][j]=0; block[i][j]=blocks[block_type][i][j]; } } //ブロック生成の段階で、一番上までつみ上がっていればgameoverのフラグを立てる。 for(i=0;i<8;i++) { for(j=0;j<8;j++) { if(field[i][j+8]==1) gameover=1; field[i][j+8]=stage[i][j+8]+block[i][j]; } } } //*********************************************************************