散布図とマクロでブロック崩しゲームらしくなってきた。
けど、なんかちょっと足りないよね
そうだね。
今回は、ゲームクリアとゲームオーバーの判定とリセット機能を作って、ブロック崩しゲームを完成させるよ。
前回、前々回の記事で、散布図とマクロを使ったブロック崩しゲームを作りました。
ブロック崩しゲームらしい動きはできましたが、まだゲームとしては足りない要素がいくつかあります。
足りない要素とは↓の4つ
- ゲームクリアの判定
- ゲームオーバーの判定
- スタートボタン
- リセットボタン
今回は、その足りない要素を追加して、エクセルのブロック崩しゲームを完成させます!
この記事の終盤に、完成したマクロを掲載するので、自分でVBAを書くのはしんどいという方は、コピペして使ってください。
この記事は、15年以上MicroOfficeを使っている筆者、きゃんパパが子どもと一緒にパソコンで遊ぶという視点で執筆しています。
完成したマクロは全部公開するので、自分でVBAを書くのがしんどいという方は、コピペしちゃってください。
なお、本記事で紹介しているブロック崩しゲームの作り方はWebサイト「情報授業実践記録」の記事を参考にしています。
あわせて見てみてください。
記事を読んでいただき、ありがとうございます。
しかし、こんなことを思っている方はいませんか?
「ゲームを作るVBAを知りたいんじゃない、仕事でつかえるVBAを知りたいんだ!」
「VBAを基礎から体系的に勉強したい」
「でも、勉強するまとまった時間はないし、お金もない!」
そんな方には、Youtuberとしても有名なUdemy講師のエクセル兄さんが教える
「Excel VBA エキスパート認定への道 ~マクロ初心者から資格試験レベルへ &7つの自動化 マクロ を作る15時間」の講座がおすすめです。
この講座の良いところは4つ。
- 仕事でつかえるVBAを学べる
- スクールに通うより圧倒的に安い
- 買い切り
- 隙間時間で勉強できる
- 一度買えば、何度でも見れる
VBAを仕事で活用できるレベルになりたいという方は↓のボタンから購入し、勉強しましょう。
ボールが動く向きと初期位置を微調整
スタートしたらボールが下に動くように調整
これまで、マクロをスタートさせるとボールがブロックに向かって動き出していました。
これをラケットの方へ移動するように変更します。
ボールの変化量yを「-0.1」にします。
これで、ゲームスタートするとラケットに向かってボールが移動します。
ボールの初期位置をもう少し上にする
ボールの動き出す方向をラケットの方向にすると、今のボールの初期位置ではラケットに近すぎです。
そこで、ボールの初期位置をもう少しブロックに近づけます。
ボールの初期位置yを「5」に修正します。
これで、ちょうどよくなりました。
ゲームフィールドの上に行を挿入&結合
ゲームクリアやゲームオーバーを表示をゲームフィールドの上に表示したいです。
しかし、今の段階では表示するスペースがありません。
そこで、ゲームフィールドの上、6列目~13列目に3行挿入します。
挿入後、上2行のセルを選択して結合します。
ゲームクリアを判定するマクロを作ろう!
ブロックがなくなったかを判定する
ゲームクリアの条件は、「ブロックがなくなること」とします。
今、ブロックが消えたら、ブロックの位置yに「””(空白)」を入れるというマクロにしています。
なので、「全てのブロックの位置yに「””(空白)」が入ったら(値が入っていなかったら)、ゲームクリア」というマクロを作ります。
判定処理は↓のような感じです。
ブロック崩しマクロから呼び出す
ゲームクリア判定のマクロをブロック崩しマクロから呼び出すようにします。
今回は、返ってきた値によってその後の処理が変わるので、少し複雑になります。
書き方は↓のような感じです。
これで、ゲームクリア判定処理は完成です。
ゲームオーバーを判定するマクロを作ろう!
ボールの位置yが「0.8以下」になったらゲームオーバー
続いて、ゲームオーバーの判定です。
「ボールの位置yがラケットの位置yより下になったら、ゲームオーバー」とします。
ラケットの位置yは「1」となっているのですが、ボールの半径などの関係でうまくいかないので、
「ボールの位置yが0.8未満になったらゲームオーバー」というマクロを作ります。
ブロック崩しマクロから呼び出す
ゲームクリア判定のマクロと同じようにブロック崩しマクロから呼び出します。
ゲームクリア判定の下にゲームオーバー判定と記載しましょう。
スタートボタンを作ろう!
ボタンを作ってブロック崩しマクロを割り当てる
今は、マクロの編集画面にあるスタートボタンを押してゲームをスタートさせています。
これだとちょっと不便なので、スタートボタンを作りましょう。
開発メニューの「挿入」からボタンを選びます。
マクロのウィンドウが表示されたら、「ブロック崩し」を選びましょう。
ボタンのテキストを「スタート」に編集して出来上がりです。
ボタンを押して、ボールが動き始めたらOKです。
リセットボタンを作ろう!
ブロックの位置とボールの位置を元に戻すマクロを作る
これまで、ゲームを止めたら手動でボールの位置やブロックの位置に値を入れていました。
ゲームが終わるたびに値を入れなおすのは、とても面倒くさいですよね。。。。。。。
なので、リセットボタンを作ります。
マクロの内容としては2つ。
- ボールの現在位置x,yに初期位置x,yの値をそれぞれ入力する
- ブックの位置yに8または9を入力する
リセットの処理は↓のような感じ。
ボタンを作ってリセットマクロを割り当てる
リセットマクロができたので、ボタンに割り当てます。
作り方は、スタートボタンと同じです。
↓のようなレイアウトになれば完成です。
これが完成したマクロだ!コピペしてもOK
これですべてのマクロが完成しました。
前回作ったマクロも含めて、すべてのマクロはこんな感じです。
コピペして使ってみてください。
'変数の宣言
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 ラケット_ボール判定
'ゲームクリア判定処理
If IsGameClear() Then
Cells(1, 6) = "ゲームクリア"
Exit Sub ' マクロの実行を終了
End If
'ゲームオーバー判定処理
If IsGameOver() Then
Cells(1, 6) = "ゲームオーバー"
Exit Sub ' マクロの実行を終了
End If
'途中で江別のマクロが実行されたら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
Private Function IsGameClear() As Boolean
Dim row As Integer
' ブロックの範囲において値が存在するセルがあるかチェック
For row = 8 To 25
If Not IsEmpty(Range("C" & row)) Then
IsGameClear = False ' 値が存在するセルが見つかった場合はゲームクリアではない
Exit Function
End If
Next row
IsGameClear = True ' 全てのセルが空白の場合はゲームクリア
End Function
Private Function IsGameOver() As Boolean
Dim go As Single
go = Cells(4, 3)
'ボールの位置yが1以上ならゲーム継続
If go >= 0.8 Then
IsGameOver = False
Exit Function
End If
'ボールの位置yが1未満になったらゲームオーバー
IsGameOver = True
End Function
Sub リセット()
'ボールの初期位置x,yを変数に入れる
Dim f_bpx As Single
Dim f_bpy As Single
f_bpx = Cells(2, 2)
f_bpy = Cells(2, 3)
'ボールの現在位置にボールの初期位置の値を入れる
Cells(4, 2) = f_bpx
Cells(4, 3) = f_bpy
'ブロック位置yに9or8を入力する
Dim row_9 As Integer
Dim row_8 As Integer
For row_9 = 8 To 16
Cells(row_9, 3) = 9
Next row_9
For row_8 = 17 To 25
Cells(row_8, 3) = 8
Next row_8
'ゲームクリアorゲームオーバーの表示をクリアする
Cells(1, 6) = ""
End Sub
ついに完成!自作ブロック崩しゲームで遊ぼう!
これでブロック崩しゲームの完成です。
今回やった内容は4つ。
- ゲームクリアの判定
- ゲームオーバーの判定
- スタートボタン
- リセットボタン
今回の記事の内容を実施することで、ゲームとして成立すようになります。
今回紹介した内容を参考に、ブロック崩しゲームを完成させましょう!
記事を読んでいただき、ありがとうございます。
しかし、こんなことを思っている方はいませんか?
「ゲームを作るVBAを知りたいんじゃない、仕事でつかえるVBAを知りたいんだ!」
「VBAを基礎から体系的に勉強したい」
「でも、勉強するまとまった時間はないし、お金もない!」
そんな方には、Youtuberとしても有名なUdemy講師のエクセル兄さんが教える
「Excel VBA エキスパート認定への道 ~マクロ初心者から資格試験レベルへ &7つの自動化 マクロ を作る15時間」の講座がおすすめです。
この講座の良いところは4つ。
- 仕事でつかえるVBAを学べる
- スクールに通うより圧倒的に安い
- 買い切り
- 隙間時間で勉強できる
- 一度買えば、何度でも見れる
VBAを仕事で活用できるレベルになりたいという方は↓のボタンから購入し、勉強しましょう。
コメント
コメント一覧 (2件)
こんな遊び方があるなんてはじめて知りました。
今度やってみたいと思います。
ainさん 記事を読んでいただき、ありがとうございます。ぜひやってみてください!