VBAテトリス 詳細編 テトリミノを画面に表示する2
どうもこんにちは。
今回は前回に引き続き、テトリミノを画面に表示する方法について解説します。
前回の内容はこちらからどうぞ。
programminghajimetemita.hatenablog.com
今回の内容は”NEXT”の欄にテトリミノを表示する方法です。
以下の画像の画面真ん中上の部分です。
1.NEXTにテトリミノを表示する方法
NEXTの画面にテトリミノを表示する方法ですが、やることは以下の2つです。
① 1~7のランダムな整数値を発生させる
② ①の整数値に対応するテトリミノをNEXTの画面の位置に呼び出す
①は前回紹介した内容と同じようにRnd関数を使って行えばOKです。
(前回の内容は上部リンクからご確認ください)
②も1~7の値に対応するテトリミノの形のセル範囲を呼び出す部分は前回紹介した内容と同じです。
ランダム整数値の値ごとに条件分岐させる方法です(Select Caseを使う)。
前回紹介した通り、テトリミノの形のセル範囲は、位置を自由に変えられるように変数で表現しています。
なので、NEXTの位置に表示させるにはNEXTの位置の座標を代入してやればOKです。
セルの位置を表す座標は"( r, c )"と表現していますので、
rにNEXTの位置の行番号を、cにNEXTの位置の列番号を代入する、ということです。
以上でNEXTの画面にテトリミノを表示させることができます。
2.テトリミノをゲーム画面とNEXT画面に同時に表示する
ここからはこれまで紹介した内容を組み合わせて行う方法について触れていきます。
この方法によって、テトリミノをゲーム画面とNEXT画面に同時に表示することが可能になります。少しテトリスっぽくなってきましたね。
なお、ゲーム画面とは以下の画像の左の黒枠内の部分、
NEXT画面とは真ん中上部の黒枠部分を指しています。
では内容に入ります。
プログラムの内容に触れる前にテトリミノの表示に関してのテトリスの挙動について改めて触れたいと思います。
テトリスの挙動は以下のようなものになっているかと思います。
ゲーム開始直後(1巡目)
・テトリミノがランダムに選ばれてゲーム画面に表示される
・上記と同様、テトリミノがランダムに選ばれてNEXT画面に表示される
2巡目以降
・NEXT画面に表示されていたテトリミノがゲーム画面に表示される
・テトリミノがランダムに選ばれてNEXT画面に表示される
※テトリミノがゲーム画面に表示され、ゲーム画面の底orブロックに接地するまでの動きを1巡目、2巡目、、、と表現しています。
これを踏まえて、どういうプログラムを組めば上記挙動を実現できるか考えます。
実際に書いたコードは以下の通りです(一部割愛して記載してます)。
block = 0
Do
If block = 0 Then
block = Int(Rnd * 7) + 1
Else
block = next_block
End If
Select Case block
・・・
End Select
next_block = Int(Rnd * 7) + 1
Select Case next_block
・・・
End Select
・・・
Loop
では記載したコードを解説していきます。
・使用している変数
blockとnext_blockという変数を使っています。
blockの方はゲーム画面に表示するテトリミノを決定する変数、
next_blockの方はNEXT画面に表示するテトリミノを決定する変数です。
・1巡目と2巡目以降で処理内容を変える
テトリスの挙動で触れたとおり、ゲーム画面に表示するテトリミノの決定方法は1巡目と2巡目以降で異なります(1巡目はランダム、2巡目以降はNEXTに表示されていたもの)。
これは変数blockの値で条件分岐させることで実現しました。
繰り返し処理(Do~Loop)に入る前に"block=0"と処理しておくことで、
1巡目はblockが0、2巡目以降はblockが0以外の値になります。
その上で、blockが0であればランダム整数値になるように、
blockが0以外であればNEXT画面に表示されるもの(つまり、block=next_block)になるように分岐させれば、
1巡目と2巡目以降の処理を変えられるというわけです。
なお、2巡目以降、NEXT画面に表示されたものをゲーム画面に表示させるために、
"block=next_block"という処理を入れています。
辻褄があっているか確認するには具体的に考えるのがわかりやすいかと思いますので、
以下の単純化した具体例を見て確認してみてください。
①1巡目
繰り返し処理に入る前
block = 0
繰り返し処理
・最初の条件分岐:block = 0 なので、blockは以下の値になる
block = Int(Rnd * 7) + 1・・・結果、blockは1になったとする
・next_blockの値の決定:
next_block = Int(Rnd * 7) + 1・・・結果、next_blockは4になったとする
以上より、ゲーム画面には"1"に対応するテトリミノが表示され、
NEXT画面には"4"に対応するテトリミノが表示される
②2巡目
繰り返し処理
・最初の条件分岐:block = 1であり、0ではないのでblockは以下の値になる
block = next_block・・・結果、next_blockは4になる
・next_blockの値の決定:
next_block = Int(Rnd * 7) + 1・・・結果、next_blockは6になったとする
以上より、ゲーム画面には"4"に対応するテトリミノが表示され、
(⇒前の周回でNEXT画面に表示されていたテトリミノが表示された)
NEXT画面には"6"に対応するテトリミノが表示される
・その他コードの補足
Int(Rnd * 7) + 1:ランダムな1~7の整数値を発生させるためのコードです。
Select Case block(next_block):
block(next_block)に対応するテトリミノを表示させるためのコードです。
変数をランダム整数値にすることでテトリミノがランダムに選ばれる挙動を再現しています。
いずれも前回の内容で詳しく解説していますので、詳細はそちらをご確認下さい。
3.おわりに
今回はNEXT画面にテトリミノを表示する方法、またそれと前回の内容を組み合わせて、
ゲーム画面とNEXT画面に同時に表示する方法について解説しました。
これだけではテトリミノが動かないのでまだゲームになりませんが、
少しはテトリスっぽくなったのではないかと思います。
次回以降、いよいよテトリミノを動かす処理について触れていきたいと思います。
ではまた。