
ブロック崩しゲームのフィールドはできた!
でも、ボールを動かすにはどうすればいいんだ?
VBA難しくない?



大丈夫!
コピペでVBAができるように紹介します。
前回の記事でブロック崩しゲームのフィールドをエクセルの散布図で作りました。


しかし、まだボールは動かないですし、ブロックも消えないです。
これからVBAでマクロを作っていきます。
でも、マクロを自分で作るのって難しいですよね。。。。。。。。
なので、マクロの内容を解説しつつ、完成したマクロをコピペできるように紹介します。
この記事は、15年以上MicroOfficeを使っている筆者、きゃんパパが子どもと一緒にパソコンで遊ぶという視点で執筆しています。
パパママがゲームを作って、子どもに見せるでもよし、子どもと一緒にゲームを作るでもよし。
親子でパソコンを楽しむ時間を作り出すのに貢献出来たらいいなと思っています。
この記事では、下記のマクロを作成、解説します。
- ボールを動かすマクロ
- ボールが壁に反射するマクロ
- ボールがブロックにあたったときのマクロ
- ラケットをうごかすとき&ラケットにボールがあたったときのマクロ
今回の記事を実践すると↓のような動きになります。
なお、本記事で紹介しているブロック崩しゲームの作り方はWebサイト「情報授業実践記録」の記事を参考にしています。
あわせてみてみてください。
記事を読んでいただき、ありがとうございます。
しかし、こんなことを思っている方はいませんか?
「ゲームを作るVBAを知りたいんじゃない、仕事でつかえるVBAを知りたいんだ!」
「VBAを基礎から体系的に勉強したい」
「でも、勉強するまとまった時間はないし、お金もない!」
そんな方には、Youtuberとしても有名なUdemy講師のエクセル兄さんが教える
「Excel VBA エキスパート認定への道 ~マクロ初心者から資格試験レベルへ &7つの自動化 マクロ を作る15時間」の講座がおすすめです。
この講座の良いところは4つ。
- 仕事でつかえるVBAを学べる
- スクールに通うより圧倒的に安い
- 買い切り
- 隙間時間で勉強できる
- 一度買えば、何度でも見れる
VBAを仕事で活用できるレベルになりたいという方は↓のボタンから購入し、勉強しましょう。
ボールを動かすマクロを作る


開発メニューのマクロをクリックします。
マクロのウィンドウが開くので、「ブロック崩し」と入力して、作成ボタンを押します。
マクロ「ブロック崩し」の編集画面が開くので、ここにVBAを書いていきます。
必要な変数を宣言する
まずはマクロの中で使う変数を宣言します。
Sub ブロック崩し()の上に変数を書きます。
今の時点で必要な変数は下記の通り。
- vx :ボールのx方向(左右方向)の変化量
- vy :ボールのy方向(上下方向)の変化量
- x :ボールの現在位置
- y :ボールの現在位置y
プログラムはこんな感じ↓





変数が何を意味するのかコメントをつけておくとわかりやすいです。
「’(アポストロフィ)」のあとに文章を書くとコメントになります。
ボールの現在位置を更新する
ボールの動作は「現在位置の値に変化量を足して、現在位置の値を置き換える」という形で実現します。
計算式は↓の通り


繰り返す
更新する処理を1回だけしてもボールはそんなに動かないので、繰り返します。
繰り返す処理はDo~Loopを使います。
↓のようにボールの現在位置を更新する処理を「Do~Loop」で囲いましょう。


その際、「DoEvents」を記載することでキャンセルボタンを押したときなどに処理を途中でやめることができます。
ここまでのマクロは下記の通り↓
'変数の宣言
Dim vx As Single 'ボールのx方向の変化量
Dim vy As Single 'ボールのy方向の変化量
Dim x As Single 'ボールのxの現在位置
Dim y As Single 'ボールのyの現在位置
Sub ブロック崩し()
'変数の値が入っているセルを指定する
vx = Cells(6, 2)
vy = Cells(6, 3)
x = Cells(2, 2) 'X座標の初期位置
y = Cells(2, 3) 'Y座標の初期位置
'ボールの座標を動かす処理
Do
Calculate
'xとyの現在位置に変化量を足す
x = x + vx
y = y + vy
'xとyの現在位置を置き換える
Cells(4, 2) = x
Cells(4, 3) = y
'壁反射の処理を呼び出す
Call 壁反射
Call ブロック消し
Call ラケット_ボール判定
'途中でLoop処理を止める
DoEvents
Loop
End Sub
これでボールが動くようになりました。
マクロを実行するときには編集画面の「▷」を押します。
こんなかんじ↓



元に戻すときはボールの現在位置の値を元に戻せばOKです。
記事を読んでいただき、ありがとうございます。
しかし、こんなことを思っている方はいませんか?
「ゲームを作るVBAを知りたいんじゃない、仕事でつかえるVBAを知りたいんだ!」
「VBAを基礎から体系的に勉強したい」
「でも、勉強するまとまった時間はないし、お金もない!」
そんな方には、Youtuberとしても有名なUdemy講師のエクセル兄さんが教える
「Excel VBA エキスパート認定への道 ~マクロ初心者から資格試験レベルへ &7つの自動化 マクロ を作る15時間」の講座がおすすめです。
この講座の良いところは4つ。
- 仕事でつかえるVBAを学べる
- スクールに通うより圧倒的に安い
- 買い切り
- 隙間時間で勉強できる
- 一度買えば、何度でも見れる
VBAを仕事で活用できるレベルになりたいという方は↓のボタンから購入し、勉強しましょう。
ボールが壁に反射するマクロを作る


今の段階では、ボールがどこまでも進んで行ってしまいます。
なので、壁でボールが反射するようにマクロを書いていきましょう。
ボールと壁の位置を比較する
まずは、新しいマクロ「壁反射」を「ブロック崩し」の下に作ります。
最初の処理は、ボールの現在位置の数値と壁(散布図の最小値、最大値)の比較です。
前回、散布図の最小値は「0」、最大値は「10」で設定しました。
ボールの直径があるので、「0.5」を下回ったときと「9.5」を上回ったとき反射するようにします。


壁に触れていたら動く方向を変える
ボールの現在位置がxもyも9.5を超えた場合と0.5を下回った場合に、動く方向を変えます。
方向の変え方は以下の通りです。
- xの値が9.5を上回った場合→vxに「-1」をかける
- xの値が0.1を下回った場合→vxに「-1」をかける
- yの値が9.5を上回った場合→vyに「-1」をかける
- yの値が0.5を上回った場合→vyに「0」を入れる
yが0.5を下回った場合は、ゲームオーバーになって上に反射しないようにvyを「0」にします。


ボールを動かすマクロから呼び出されるように組み込む
ブロック崩し()のDo~Loopの処理から壁反射の処理を呼び出すように追記します。


これで壁に当たったらボールが反射するようになりました。
ここまでのマクロは↓の通り。
'変数の宣言
Dim vx As Single 'ボールのx方向の変化量
Dim vy As Single 'ボールのy方向の変化量
Dim x As Single 'ボールのxの現在位置
Dim y As Single 'ボールのyの現在位置
Sub ブロック崩し()
'変数の値が入っているセルを指定する
vx = Cells(6, 2)
vy = Cells(6, 3)
x = Cells(2, 2) 'X座標の初期位置
y = Cells(2, 3) 'Y座標の初期位置
'ボールの座標を動かす処理
Do
Calculate
'xとyの現在位置に変化量を足す
x = x + vx
y = y + vy
'xとyの現在位置を置き換える
Cells(4, 2) = x
Cells(4, 3) = y
'壁反射の処理を呼び出す
Call 壁反射
'途中でLoop処理を止める
DoEvents
Loop
End Sub
Private Sub 壁反射()
'ボールの現在位置xの値を取得
Select Case Cells(4, 2).Value
'xの値が9.5以上もしくは0.5以下だったらx方向の変化量に-1をかける
Case Is >= 9.5
vx = -1 * vx
Case Is <= 0.5
vx = -1 * vx
End Select
'ボールの現在位置yの値を取得
Select Case Cells(4, 3).Value
'yの値が9.5以上もしくは0.5以下だったらx方向の変化量に-1をかける
Case Is >= 9.5
vy = -1 * vy
Case Is <= 0.5
vy = 0
End Select
End Sub
動きはこんなかんじ↓
ボールがブロックにあたったときのマクロを作る


続いて、ボールがブロックにあたったときのマクロを作ります。
ボールがあたったときの動作は2つ。
- ボールの動く向きを変える
- ブロックを消す
それぞれ説明します。
ボールの位置とブロックの位置を比較する
ボールがブロックに当たったかどうかを判定するために、ボールの位置とブロックの位置を比較します。
そのためにまず、ブロックの現在位置を表す変数を2つ追加します。
b_px(100):ブロックの現在位置x
b_py(100):ブロックの現在位置y





(100)は配列を意味しますが、説明が複雑になるのでおまじないだと思ってください。
ブロックは全部で18個あるので、18個に対して順番に現在位置を比較していきます。


ボールの進行方向を変える
ボールがブロックにあたったと判定されたら、ボールの進行方向を変えます。
ボールの進行方向の変え方は↓の2種類です。
- ボールがブロックの上からor下から当たった場合
- ボールがブロックの右からor左から当たった場合
それぞれの処理を作ってみましょう。


上下からブロックにあたった場合、ボールのy方向の変化量が反転します。
計算式としては、vyに「-1」をかけます。


左右からブロックにあたった場合、ボールのx方向の変化量が反転します。
そのため、計算式では、vxに「-1」をかけます。
VBAはこんな感じ↓です。


ボールの位置=ブロックの位置ならブロックを消す
最後に、ボールがブロックにあたったときにブロックを消す処理を作りましょう。
ブロックを消す処理では、ブロックの現在位置のyの値を””(空白)を入れます。


ボールを動かすマクロから呼び出されるように組み込む
壁反射のときと同じようにブロック崩しのマクロから呼び出されるように組み込みます。


ここまでの段階でこれくらい↓動きます。
ここまでのVBAは以下の通りです。
'変数の宣言
Dim vx As Single 'ボールのx方向の変化量
Dim vy As Single 'ボールのy方向の変化量
Dim x As Single 'ボールのxの現在位置
Dim y As Single 'ボールのyの現在位置
Dim b_px(100) As Single 'ブロックの現在位置x
Dim b_py(100) As Single 'ブロックの現在位置y
Sub ブロック崩し()
'変数の値が入っているセルを指定する
vx = Cells(6, 2)
vy = Cells(6, 3)
x = Cells(2, 2) 'X座標の初期位置
y = Cells(2, 3) 'Y座標の初期位置
'ボールの座標を動かす処理
Do
Calculate
'xとyの現在位置に変化量を足す
x = x + vx
y = y + vy
'xとyの現在位置を置き換える
Cells(4, 2) = x
Cells(4, 3) = y
'壁反射の処理を呼び出す
Call 壁反射
Call ブロック消し
'途中でLoop処理を止める
DoEvents
Loop
End Sub
Private Sub 壁反射()
'ボールの現在位置xの値を取得
Select Case Cells(4, 2).Value
'xの値が9.5以上もしくは0.5以下だったらx方向の変化量に-1をかける
Case Is >= 9.5
vx = -1 * vx
Case Is <= 0.5
vx = -1 * vx
End Select
'ボールの現在位置yの値を取得
Select Case Cells(4, 3).Value
'yの値が9.5以上もしくは0.5以下だったらx方向の変化量に-1をかける
Case Is >= 9.5
vy = -1 * vy
Case Is <= 0.5
vy = 0
End Select
End Sub
Private Sub ブロック消し()
'ブロック18個に対して位置を確認→ボールに当たったらブロックを消す
For n = 0 To 17
b_px(n) = Cells(8 + n, 2)
b_py(n) = Cells(8 + n, 3)
If y > b_py(n) - 0.45 And y < b_py(n) + 0.45 Then
If x < b_px(n) + 0.45 And x > b_px(n) - 0.45 Then
vy = -1 * vy
Cells(8 + n, 3) = ""
Else
End If
Else
End If
If x > b_px(n) - 0.45 And x < b_px(n) + 0.45 Then
If y < b_py(n) + 0.45 And y > b_py(n) - 0.45 Then
vx = -1 * vx
Cells(8 + n, 3) = ""
Else
End If
Else
End If
Next n
End Sub
ラケットをうごかすとき&ボールがあたったときのマクロを作る


最後にラケットの動きを作っていきます。
ラケットの位置を移動する
ラケットを左右に動かすマクロを作ります。
右に動かすボタンと左に動かすボタンを作るので、それぞれでマクロを作ります。
まず、ラケットの現在位置を入れる変数を追加します。


右に動く場合は、ラケットの現在位置xの値に0.3を足します。
一方で、左に動く場合は、ラケットの現在位置xの値から0.3を引きます。
また、フィールドからはみ出ないようにラケットの現在位置xが「1~9」の間で動くように制限します。


ボタンも作ります。
開発メニューの「挿入」でボタンを選びます。


マクロの登録ウィンドウでは「ラケット左移動」を選びます。


ボタンを右クリックして、「テキストの編集」を左クリック。
テキストを「←左へ」に変えます。


同じ手順で「右へ→」ボタンも作りましょう。


動きはこんな感じになります。
ラケットにボールが当たったら、ボールの方向を変える
ラケットにボールが当たったら、ボールの方向を変える処理を作ります。
まず、ボールの現在位置yとラケットの現在位置yを比較して、ラケットの高さにボールが来ているかを判定します。
ボールがラケットの高さに来ていたら、ボールの現在位置xとラケットの現在位置xを比較して、ボールの現在位置xがラケットの現在位置xと一致しているかを判定します。
このとき、ラケットの現在位置xは「ラケットの現在位置x-0.8<ラケットの現在位置x<ラケットの現在位置x+0.8」の幅を持たせます。
イメージはこんな感じ↓です。


ボールがラケットの横幅の範囲に入っていたら、ボールの変化量vyに「-1」をかけます。
VBAはこんな感じです↓。


ボール移動の処理から呼び出す。
最後に、ブロック崩しの処理からラケットとボールの判定処理を呼び出します。
書き方は、壁反射やブロック消しの処理と同じです。


動きはこんな感じになります。
これで今回のマクロづくりは終わりです。
今回作った全マクロをコピペしても大丈夫


これまで作ってきたマクロを自分で書くのはしんどいという方もいるかと思います。
下にマクロを公開しますので、コピペして使ってください。
'変数の宣言
Dim vx As Single 'ボールのx方向の変化量
Dim vy As Single 'ボールのy方向の変化量
Dim x As Single 'ボールのxの現在位置
Dim y As Single 'ボールのyの現在位置
Dim b_px(100) As Single 'ブロックの現在位置x
Dim b_py(100) As Single 'ブロックの現在位置y
Dim r_px As Single 'ラケットの現在位置x
Dim r_py As Single 'ラケットの現在位置y
Sub ブロック崩し()
'変数の値が入っているセルを指定する
vx = Cells(6, 2)
vy = Cells(6, 3)
x = Cells(2, 2) 'X座標の初期位置
y = Cells(2, 3) 'Y座標の初期位置
'ボールの座標を動かす処理
Do
Calculate
'xとyの現在位置に変化量を足す
x = x + vx
y = y + vy
'xとyの現在位置を置き換える
Cells(4, 2) = x
Cells(4, 3) = y
'壁反射の処理を呼び出す
Call 壁反射
Call ブロック消し
Call ラケット_ボール判定
'途中でLoop処理を止める
DoEvents
Loop
End Sub
Private Sub 壁反射()
'ボールの現在位置xの値を取得
Select Case Cells(4, 2).Value
'xの値が9.5以上もしくは0.5以下だったらx方向の変化量に-1をかける
Case Is >= 9.5
vx = -1 * vx
Case Is <= 0.5
vx = -1 * vx
End Select
'ボールの現在位置yの値を取得
Select Case Cells(4, 3).Value
'yの値が9.5以上もしくは0.5以下だったらx方向の変化量に-1をかける
Case Is >= 9.5
vy = -1 * vy
Case Is <= 0.5
vy = 0
End Select
End Sub
Private Sub ブロック消し()
'ブロック18個に対して位置を確認→ボールに当たったらブロックを消す
For n = 0 To 17
b_px(n) = Cells(8 + n, 2)
b_py(n) = Cells(8 + n, 3)
If y > b_py(n) - 0.45 And y < b_py(n) + 0.45 Then
If x < b_px(n) + 0.45 And x > b_px(n) - 0.45 Then
vy = -1 * vy
Cells(8 + n, 3) = ""
Else
End If
Else
End If
If x > b_px(n) - 0.45 And x < b_px(n) + 0.45 Then
If y < b_py(n) + 0.45 And y > b_py(n) - 0.45 Then
vx = -1 * vx
Cells(8 + n, 3) = ""
Else
End If
Else
End If
Next n
End Sub
Sub ラケット右移動()
r_px = Cells(27, 2)
'ラケットの現在位置が9未満だったら右に0.3動かす
If r_px < 9 Then
r_px = r_px + 0.3
Cells(27, 2) = r_px
End If
End Sub
Sub ラケット左移動()
r_px = Cells(27, 2)
'ラケットの現在位置が1より大きければ右に0.3動かす
If r_px > 1 Then
r_px = r_px - 0.3
Cells(27, 2) = r_px
End If
End Sub
Private Sub ラケット_ボール判定()
r_px = Cells(27, 2) 'ラケットの現在位置x
r_py = Cells(27, 3) 'ラケットの現在位置y
'ラケットの現在位置yとボールの現在位置yを比較
'ラケットよりボールが下に来た場合、次の処理へ
If r_py > y Then
'ラケットの現在位置xとボールの現在位置xを比較
'ラケットの現在位置±0.8の範囲にボールの現在位置xが入っている場合次の処理へ
If r_px + 0.8 > x And r_px - 0.8 < x Then
'ボールが進む方向を変える
vy = -1 * vy
End If
End If
End Sub
ブロック崩しゲームの動作をマクロを組み合わせて実現しよう!


ブロック崩しゲーム用のマクロを作ってきました。
主な処理は↓の5つです。
- ボールの移動
- 壁反射
- ブロックを消す
- ラケットを動かす
- ラケットにボールが当たったかを判定
エクセルでも動きのあるゲームが作れますので、ぜひ挑戦してみてください。
記事を読んでいただき、ありがとうございます。
しかし、こんなことを思っている方はいませんか?
「ゲームを作るVBAを知りたいんじゃない、仕事でつかえるVBAを知りたいんだ!」
「VBAを基礎から体系的に勉強したい」
「でも、勉強するまとまった時間はないし、お金もない!」
そんな方には、Youtuberとしても有名なUdemy講師のエクセル兄さんが教える
「Excel VBA エキスパート認定への道 ~マクロ初心者から資格試験レベルへ &7つの自動化 マクロ を作る15時間」の講座がおすすめです。
この講座の良いところは4つ。
- 仕事でつかえるVBAを学べる
- スクールに通うより圧倒的に安い
- 買い切り
- 隙間時間で勉強できる
- 一度買えば、何度でも見れる
VBAを仕事で活用できるレベルになりたいという方は↓のボタンから購入し、勉強しましょう。
コメント