※本解説ではMicrosoft 365のバージョンにて解説しており、別バージョンをお使いの場合
アイコンの配置が本解説と相違があることがあります。
エクセル VBAでブロック崩しゲーム
※本ソースコードは、教科学習情報ページの宮崎県立宮崎西高等学校 溝上 俊彦教諭が作成
されたブロック崩しゲームを参考としてバージョンアップしています。
情報授業実践記録
https://www.shinko-keirin.co.jp/keirinkan/kojoho/infomation/jissen/26.html
ブロック崩しゲームを創る
エクセル VBA はじめかた
エクセルでのVBAプログラミングがはじめての方は、はじめ方の記事をご参考にされてください。
sub ブロック崩し 解説
ブロックを崩す処理で、For文が使われています。
For文は左記の赤部が繰り返す範囲(回数)を指定しています。
変数 nが 0から始めて、17になるまでくりかえしなさいという命令です。
Next n とは +1ずつ増やす そして先頭の
Forの行まで戻るという命令です。
一次元配列
b_px(n) に Cells(6+n , 7)を入れ b_py(n) にに Cells(6+n , 8) の値を入れています。
b_px(n)とb_py(n)は 以前 変数宣言でご説明したように 『一次元配列』とよばれる箱です。
“n”は一次元配列の場所を示しており、”添え字(要素番号)” ともよばれます。
b_pxという配列 for文で、『n』という箱の中の数字を 0~17 まで増やしながら
値を入れていくので 初めてfor文に入った時には n = 0 で
b_px(0) の場所に、Cells(6 + 0 , 7) つまり Cells(6 , 7) 6行目、7列目のセルの場所の値が入る
という処理になります。
画面を確認すると セルの6行目、7列目は ”1″ ですので b_px(0)には ”1″が入ります。
If文 ブロック当たり判定
If文 y軸ブロック当たり判定(上からのブロック当たり)
条件をクリアしているかで、処理を行うか 行わないかを設定していきます。
If(もし) y > b_py(n) – 0.75 And(かつ) y < b_py(n) + 0.75 then (のとき)
※And(かつ)とは 両方の条件をクリアしているという意味です。
上記エクセルのシートと n を 1ずつ増やした対応表をまとめてのでみてみましょう
ここで比較している “y” は
y = y + Vy × dt です。
ボールの位置のことですね。
その “y”が b_py(0) Cell(6 , 8 )は ”9″なので
9 – 0.75 = 8.25 であり 9 + 0.75 = 9.75
のときとは、どのような状態でしょうか
右の図を見るとy軸の8.25を越えて、9.75未満の部分に線を引き薄くオレンジで囲んでいます。
そのy軸の範囲にボールの中心の位置(ボールの
y位置が入ると という条件になります。
If文 X軸ブロック当たり判定(上からのブロック当たり)
If(もし) x < b_px(n) + 0.45 And(かつ) x < b_px(n) – 0.45 then (のとき)
エクセルのシートに n が ”0″ から “17” に変わった時をまとめました。
右の図を見るとx軸の0.55を越えて、1.45未満の部分に線を引き薄く緑で囲んでいます。
そのx軸の範囲にボールの中心の位置(ボールの
x位置が入ると という条件になります。
1つ目のIf文で、
y軸の9のブロックの位置にボールがあるか
y軸の8のブロックの位置にボールがあるかを
判定し
さらに、中のIf文で
x軸の1から9までのどの位置にボールがあるかを
判定し
ボールがブロックに当たったということを条件としています。
ボールが当たった時
ボールが当たったとき vy = -1 * vy という処理つまり 進む方向を逆にし跳ね返ったように
ボールを移動させます。
また Cells(6 + n , 8) = 12 ブロックのy軸の位置を グラフの範囲外である ”12″ に変えています。
ここに、気づけるかがこのプログムの発想脳、地頭の良さとなります!
ボールが当たると、ブロックを消さなければゲームが成立しません。『消す』ことを『見えなくする』
ことで解決しています。
ここでグラフの設定で、
境界線の最大値が 『自動』になっていると
ブロックのy軸が “12” へ移動すると
グラフが広がってしまいますので固定で
“10”にして、ブロックが移動しても 見えなくなるよう設定します。
この一工夫で、ブロックが消えたように見えます。
Else文は、条件に当てはまらなければ…となります。
今回はボールが当たっている条件以外の時は なにも起こらないので Else文の後には何も書いていません
一度 If文を『終わり』としています。
If文 X軸ブロック当たり判定(横からのブロック当たり)
If(もし) x > b_px(n) – 0.75 And(かつ) x < b_px(n) + 0.75 then (のとき)
エクセルのシートに nが ”0″ から “17” に変わった時をまとめました。
ここで比較している “x” は
x = x + Vx × dt です。
ボールの位置のことですね。
その “x”が b_py(0) Cell(6 , 7 )は ”1″なので
1 – 0.75 = 0.25 であり 1 + 0.75 = 1.75
のときとは、どのような状態でしょうか
右の図を見るとx軸の0.25を越えて、1.75未満の部分に線を引き薄く緑色で囲んでいます。
そのx軸の範囲にボールの中心の位置(ボールの
x位置が入ると という条件になります
If文 y軸ブロック当たり判定(横からのブロック当たり)
If【もし】 y < b_py(n) + 0.45 And【かつ】 y < b_py(n) – 0.45 then 【のとき】
エクセルのシートに nが ”0″ から “17” に変わった時をまとめました。
ここで比較している “y” は
y = y + Vy × dt です。
ボールの位置のことですね。
その “y”が b_py(0) のとき
Cell(6 , 8 )は ”9″ なので
9 + 0.45 = 9.45 であり 9 – 0.45 = 8.55
のときとは、どのような状態でしょうか
右の図を見るとy軸の8.55を越えて、9.45未満の部分に線を引き薄くオレンジで囲んでいます。
そのy軸の範囲にボールの中心の位置(ボールの
y位置が入ると という条件になります。
1つ目のIf文で、
x軸の1から9までのどの位置にボールがあるかを
判定し
さらに、中のIf文で
y軸の9のブロックの位置にボールがあるか
y軸の8のブロックの位置にボールがあるかを
判定し
ボールがブロックに当たったということを条件としています。
当たった際の処理は上記とおなじです。
Private Sub ラケット
入力したキーを 判断する
If GetAnyKeyState(”数字”) 今回は ”70” と ”74″ を設定しています。
GetAnyKeyState(”数字”)はキーボードの指定されたキーが押されたとき、”1″と返してくれます。
GetAnyKeyState(”70″)は ”F”ボタン GetAnyKeyState(”74″)は ”J”ボタン です。
”Rk”は Rk = Cells (3 , 11 ) と設定していましたので
ラケット位置 の “x” の部分になります。
Fが押されると x軸方向に -0.3
Jが押されると x軸方向に +0.3
その 変わったRkの値を Cells(3 , 11)で セルの中に書き込みます。
ラケットの当たり判定
If Cells(3 , 4) 【3行目、4列目 ボールのy軸の位置】 が >1.5【1.5より大きいとき】
ElseIf【ではなく、もし】←ElseのIfなので、1.5より大きくない※1.5より小さくとなります
Cells(3 , 3 )【ボールのX軸の位置が】>Rk + 1 【ラケットの位置+1より大きいとき】
Cells(3 , 3 )【ボールのX軸の位置が】>Rk – 1 【ラケットの位置-1より小さいとき】
Else【ではない(上の条件にどれも当てはまらないとき】
vy = -1 * vy 【ボールの進む方向を反対方向へ】 となります。
Private Sub CommandButton1_Click()
実際にはCommandButton1がクリックされないと ゲームがスタートしません。
If【もし】 bConteinue = True【 bConteinueにTrueが入っていたら】
bConteinue = False【 bConteinueにFalseを入れる】
CommandButton1.Caption =”START”【 CommandButton1の文字をSTARTにする】
Else【 条件に合わなければ】
Call Ball【Sub Ballを呼び実行する】
Private Sub CommandButton2_Click()
CommandButton2は、ボールが下に落ちてしまった場合 ブロックとボールを最初の位置へ戻すボタンです。
CommandButton2.Caption =”RESET”【 CommandButton2の文字をRESETにする】
For n = 0 To 8 【nを0から8まで】
Cells (6 + n, 8) = 9 【6行目8列から行にnを足しながら、ブロックのy軸の位置を9にもどしていくFor文です。】
Cells (15 + n, 8) = 8 【15行目からnを足しながら、ブロックのy軸の位置を8にもどしていくFor文です。】
Private Sub ScrollBar1_Change()
ボールの進む速さを変えることにより難易度が変わります。
Cells (6 , 3) = ScrollBar1.Value
【6行目3列のセルにスクロールバーの値をいれます】
Cells (6 , 4) = ScrollBar1.Value
【6行目4列のセルにスクロールバーの値をいれます】
以上が ゲームのプログラム解説となります。
コメント