文系人間がプログラミングをはじめてみた。

プログラミング初心者のゼロからの勉強記録。

VBAテトリス 詳細編 テトリミノの落下スピードを変更する

どうもこんにちは。

 

引き続きマクロで作ったテトリスのコード解説をしていきます。

今回はテトリスの操作について触れようと思っていたのですが、

その前にテトリミノの落下スピードを変更する処理について触れたいと思います。

 

テトリスの処理の全体像で触れた通り、テトリミノの落下に関して、

よりテトリスっぽさを再現するため、LEVELに応じて落下スピードを変更する、

という要素を追加しています。

テトリミノの落下についてだけ触れており、こちらについて触れていませんでしたので、

次の処理の解説に入る前にこちらの解説をしたいと思います。

 

 

1.テトリスの挙動

テトリミノの落下スピードに関して、まずはテトリスの挙動を考えてみましょう。

 

テトリスには"LEVEL"という要素が存在しており、この"LEVEL"が上昇するのに応じて、

テトリミノの落下スピードが上昇していきます。

 

では、"LEVEL"は何に応じて上昇していくのかというと、

消去した行が10行に達するのに応じて1ずつ上昇します。

(なお、この仕様はテトリスミニの仕様です)

 

私が作ったテトリスでもこの仕様を採用しました。

 

以上を踏まえると、以下の処理ができればよい、ということになります。

・消去した行が10行に達するごとにLEVELを1増やす

・LEVELの値に応じて落下スピードを変える

 

一点目のLEVELを上昇させる処理については、

「SCORE等を計算する」処理の中で詳しく触れたいと思いますので、

今回は割愛します。

 

ということで、二点目の処理を行うためにどのようなコードを書けばよいかについて、

詳しく触れていきたいと思います。

 

2.LEVELの値に応じて落下スピードを変えるコード

前回触れた内容の中で、テトリミノの落下スピードを調整しているのは、

「Application.Wait」というコードである、と言いました。

(詳細は前回記事の「まとめ」の部分をご参照下さい)

programminghajimetemita.hatenablog.com

 

Application.Waitの待機時間がテトリミノの落下スピードに直結してますので、

これを"LEVEL"の値に応じて変化させてやればよい、ということです。

 

具体的にどのようなコードを書けばよいか、についてですが、

まず、"LEVEL"の値に応じて条件分岐させる必要がありますから、

"Select Case"により条件分岐を行います。

 

それぞれの分岐先でどのような処理をさせればよいか、についてですが、

"LEVEL"の上昇に応じて落下スピードも上昇していきますので、

LEVELが上昇するごとに待機時間を短くしていけばよいです。

 

つまり、

・LEVEL=1、ならば、待機時間1秒

・LEVEL=2、ならば、待機時間0.7秒

・LEVEL=3、ならば、待機時間0.4秒

といった具合です。

 

以上を踏まえて具体的なコードの内容です。

-本体-

・・・

Call clearblock(block, r, c)

Application.Wait[Now() + TimeValue("00:00:00.1")]

Call createblock(block, r + 1, c)

Call downspeed(level)

・・・

-落下スピードを変更するマクロー

Sub downspeed(level As Integer)

  Select Case level

    Case Is <= 1

      Application.Wait[Now() + TimeValue("00:00:01")]

    Case 2

      Application.Wait[Now() + TimeValue("00:00:00.7")]

    ・・・(中略)・・・

    Case Is >= 10

      Application.Wait[Now() + TimeValue("00:00:00.001")]

  End Select

End Sub

 

コードのポイントを解説します。

まず本体の方のコードです。

(ここで"本体"と言っているのは、テトリスを動かすメインの処理を行うマクロを指す、

と思ってください。)

 

前回の記事で触れたコードと違う部分が赤字にしている部分になります。

前回触れたコードでは常に待機時間が一定ということになりますが、

赤字の変更を加えることでLEVELの値に応じて落下スピードが変わるようになるわけです。

 

なお、上段の方のApplication.Waitには変更がありません。

このコードはテトリミノの落下の動きが滑らかに見えるようにするための調整として入れているものですので、

変更をしていません。

(これがないとテトリミノ落下時に残像が発生します、私のPCでは)

 

次に、落下スピードを変更するマクロについてです。

コードの内容は具体的なコード記述をする前に述べた内容の通りです。

(Select Caseで条件分岐、分岐先で待機時間を変更)

 

Select Caseの分岐の条件について、最初と最後のみ特定の値にしていません。

(最初はCase Is <= 1、最後はCase Is >= 10)

最初の方は"1以下"、最後の方は"10以上"という条件になります。

 

なぜそのようにしているかというと、

最初の方に関しては、"LEVEL"の初期値を設定していない(つまり最初は"LEVEL"=0)ためです。

初期値がない状態でもLEVEL=1と同じスピードにしたかったのでこのような条件になっています。

 

最後の方に関してはLEVEL10のスピードが最大スピードである、という仕様にするため、

このような条件にしました。

 

以上で落下スピードを変更する処理についての解説を終わります。

 

3.おわりに

今回は落下スピードを変更する処理について解説しました。

ここまで紹介した内容と比べると割と簡単な内容だったのではないでしょうか。

 

テトリスを作る、と考えるとどうやって作ればよいのかよくわからないと感じると思います。(私自身もそうでした)

ですが、テトリスの動きを分解して一つ一つのパーツを作る、と考えれば、

プログラミングに精通してなくても、意外とこうすればできるんじゃないかとアイデアが出てきて、

実際にパーツを完成させることができます。

 

この内容を見て、自分でもできそうだな、と感じてもらえればとてもうれしいです。

 

次回こそテトリスを操作する部分の処理に入りたいと思います。