エクセルで遊べるテトリスの作り方【Vba ゲーム】

はじめに

エクセルでテトリスを作りました!!

前からつくってみたいなあと思っていたゲームの一つで、これもなかなか時間がかかりました。

仕事終わってからだらだら作っていたら一週間くらいかかりました(工数はだいたい1人日~2人日くらい)。

ですが、思ったより簡単に作れました。エクセルで過去にオセロや将棋などつくりましたが、毎回思うことがゲーム作りに必要なものは根気気合です。

この記事では、作成したテトリスについて、その操作方法と作成方法についてご紹介します。

※ 作成方法したエクセルのテトリスについては下記からダウンロード可能ですので、ぜひ遊んでみてください。

スポンサーリンク

操作方法

作成したテトリスの操作方法について説明します。

ゲームの開始と終了

テトリスを開始するときは「START」ボタンをクリックしますが、ゲームを終了する場合はキーボードの「Home」キーを押下します。

ゲームの開始と終了
  1. 「Start」ボタン : テトリスの開始
  2. キーボードの「Home」 : テトリスの終了

キーボード操作

操作方法
  1. 「←」「↑」「↓」「→」キー : ブロックの移動
  2. 「Ctrl」キー : ブロックの回転
  3. 「Home」キー : テトリスの終了

後は、いつものテトリスです。ブロックを一行そろえて消すだけです。

またテトリスには、一行ずつ消すよりもまとめて消したほうがお得というルールがありますね。今回それを下記式で表しています。

Score = Score + 100 + [消した行の数] * 300

テトリスを作った割にテトリスのポイントのつけ方がよくわからなかったので、こんな感じで付けました。

Score とは点数のことで、「Score = Score + ~ 」とは、もともとの Score の値にどんどん足していきますよということです。

例えば削除した行が1行なら Score = 400点、2行なら700点つきます(答えを知っている人は教えてほしいです)。

終了条件

前述しましたがゲームを終了する場合はキーボードの「Home」キーを押下しますが、それ以外にもテトリスが続行できない場合も終了するようにしています。

要はブロックが天井を突き抜けた状態です。このときは強制的にテトリスが終了します。

作成方法

Excel vba で作成しています。要はプログラミングして作成しました。

実際のテトリスの作成手順は下記の5つになります。この5つができればテトリスは作れます。

作成手順
  1. 下準備(定数と変数の定義 & レイアウトの作成)
  2. ブロックを描く
  3. ブロックの移動、回転
  4. ブロックが一行並べば消す
  5. テトリスの終了条件をつける

これだけみれば、「案外簡単そうだなあ」と思われる人もいるかもしれませんが、案外めんどくさいです。

特にめんどくさいのが、ブロックの移動、回転の処理です。では順をおって説明します。

メイン関数

作成したテトリスのメイン関数です。

処理概要を説明しますと、まず定数、変数の定義とレイアウト作成などの下準備を行います。

その後 Do While True ~ をつかって無限ループさせ、ブロックを落とすようにします。

その無限ループの処理の中で下記の処理を行います。

無限ループ内処理
  1. 0.3 秒ごとに一行したにブロックが移動
  2. その0.3秒のうちの0.1秒ごとにキーボードのイベントを取得
  3. ブロックが一番下までいけば、一行そろっているブロックがあるか確認し、あれば消してスコアをつける
  4. その後、ブロックが天井より上かどうか確認(ゲームオーバーであるか)

これだけです。天井という言い方が正しいかはわかりませんが、ブロックが指定したセルの行よりあれば終了するようにしています(先ほど貼ったやつです)。

ソースコード
次にメイン関数の処理をプロシージャにわけて説明します。

下準備(定数と変数の定義 & レイアウトの作成)

定数と変数の定義

まず初めに定数と変数の定義します。

記事作成での都合上、最初に定数と変数の定義を最初にきていますが、プログラミングをしている段階では、必要なたびにどんどん定義しています(当たり前ですが、)。

定数については、レイアウトの位置情報(何行何列目のセルに描くか)とブロックの色について定義づけしています(固定なので)。

また、変数については、ブロックの先頭セルと、テトリスのスコア、ブロックの回転数について定義しています。これらは後で説明しますのでいまは適当に流していただいて問題ありません。

ソースコード

テトリスのレイアウト

テトリスの枠のレイアウトを vba で書くようにします。これはもし間違えてシート上のセルを消してしまった場合も問題ないようにするためです。

作成するレイアウトは、下記画像の青矢印の箇所(テトリスの周りのブロックと、次のテトリスを表示させる黒枠の箇所)です。

また、もともとブロックが描いてある場合もいったん消してきれいにするようにしています。

下記はソースコードですが、setting プロシージャがメイン関数で、その中に ①テトリスの周りのブロックと、②次のテトリスを表示させる黒枠の箇所のレイアウトの設定を行っています。

ソースコード

ブロックを描く

テトリスのブロックは下記の7種類あるそうです。なので、これを描くようにします。

今回これらのブロックに名前をつけています。左から1、2 .... 7という数値をつけそれを Block という変数にもたせるようにしています。

ブロックの描き方についてはただセルに色と枠線をつけるだけです。

また、セルに入れる処理を毎回書くのが面倒だったので、paintColor プロシージャにまとめ、座標情報(何行何列目に入力するか)のみで描けるようにしてあります。

ソースコード
そしてブロックを描く機能をつくれば、今度はそのブロックをランダムに取得するようにします。

具体的には 1 ~ 7 のうちのランダムな数値を取得し、取得した値からブロックを生成するようにします。

例えば 3 という数値が取得したらブロック3を出力するようにします。

ソースコード
またブロックの削除処理もつくっています。

これはブロックを移動させるときに必要な処理です(後で説明します)。

ブロックの削除の仕方ですが、簡単に指定した行と列の書式を削除しているだけです。

ソースコード

ブロックの移動、回転

ブロックの移動は「←」「↑」「↓」「→」のキーボード入力で行っています。

「←」「↑」「↓」「→」のキーボード入力のイベントを検知したときに、下記プロシージャが呼び出されるようにしてあります。

ブロックの移動についてですが、移動前のブロックの書式を削除→次のブロックに色をつけるというふたつの処理を行っています。

前章「ブロックを描く」で説明しました、「ブロックを描く」処理と「ブロックを削除」処理の二つを呼び出して処理させています。

またブロックを移動させるときの注意点は移動範囲です。

当然ですがブロックが壁を貫いたり、底を突き抜けて動いていたらテトリスになりません。

ですので今回はブロックごとに先頭セルをもたせてあり、先頭セルの次の行ももしくは列のセルの色が白色(背景色)でならブロックが移動できるようにしています。

つぎにブロックの回転ですが(これ結構悩んだんですが)一番早いのがブロックごとにパターンをつくってセルに描くことです。

順に説明しますと、ブロックの回転は「Ctrl」キーで回転するようにしていますが、

その「Ctrl」キーの入力イベントを検知した後、「Ctrl」キーが押された回数を変数 ROTATE_NUM にもたせます。

例えば「Ctrl」キーが2回入力されれば ROTATE_NUM = 2となります。そして、ブロック名が「2」で ROTATE_NUM = 2 なら「こう描く!」と決めておきます。

※具体的には下記表のようにパターン化します。

あとは上記表の組み合わせをガリガリ書くだけです(これが書き間違えなどあって大変でしたね、、、)。

ソースコード