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