エクセル VBA excel vba コード 独学 学習 ブロック崩しゲーム プログラム解説 2

breakout プログラミング学習

※本解説では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” の入っているセル一覧です。

右の図を見ると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にする】

クリックにて拡大できます

Cells (3 , 3) = Cells(3 , 7)

Cells (3 ,4) = Cells(3 , 8)

ボールを最初の位置に戻しています

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列のセルにスクロールバーの値をいれます】

以上が ゲームのプログラム解説となります。

コメント

タイトルとURLをコピーしました