VBAアクションゲーム?Excelで動かそう!世留と仙人第2章

   


第2章 3箇条その2 恒常ループ


第2章で作成されるxlsファイル

昼食を食べる間も世留君は残りの2箇条が気になる様子。

世留 ごちそうさまでした。仙人、さっそく残りの2箇条を教えて下さい。

仙人 まずは「恒常ループ」からいこうかのう。これはアクションゲームのメインルーチン
   となる部分で、骨格で言えば背骨に相当する大切な部分じゃ。

   

世留 骨格ですか。それだけ重要ということですね。

仙人 そうじゃ。お前さんの作ったプログラムのメインルーチンはどこじゃろ。

世留 メインというか一つしかないんですけど。この部分ですよね。

Sub strat()
  Dim i As Integer
  For i = 1 To 1000
  
  ・・・・・・・・・

  Next i
End Sub

仙人 その通り、このFor〜Next文がメインルーチンじゃ。ここをアクションゲーム用に
   改造する必要があるのう。世留君、このループの悪いところはどこじゃな?

世留 うーん。1000回繰り返したら終わってしまうところでしょうか。 

仙人 (少しきつい口調で)
   アクションゲームが勝手にゲームオーバーになってしまってはゲームとは呼べまい。
   お前さんの言うとおり、これは問題じゃな。だがFor〜Next文でループさせる限り
   いつかはこのループ、終わってしまうぞ。なぜFor〜Next文を使用したのじゃろ?

世留 ・・・深い意味はないです。繰り返しで数字を書き換えたくて・・・。他にループ
   させる方法も思いつかなくて・・・
   (涙ぐむ)

仙人 わかったわかった。お前さんは間違ってはいないから泣くでない。途中でゲームを
   終了させるときはどうするつもりたったんじゃ?

世留 (涙を拭く)
   当たりの時は、if判定を使ってExitForでループから抜ければいいやって思って。

仙人 そこじゃ!そこに恒常ループの答えがある。

世留 え?

仙人 恒常ループとはまさに恒常的にループさせることじゃ。よいか世留君。ループの中
   
でif文を使って判定させてループを抜ける、これはつまり、ある条件になるまでル
   ープさせることと同じじゃ。ほれ、お前さんの知っているVBA構文で、そのような
   
処理をするモノがあるじゃろ。

世留 (しばらく無言で考え込む)
   ・・・・そうか!Do〜Loop文だあ!

仙人 ほっほっほ。わかったようじゃの。その通りじゃ。よいか世留君、アクションゲー
   
ムは常に動きっぱなしじゃ。つまりはループしっぱなしなのじゃ。ゲームが終了す
   るまでの間、ずーとループさせねばならん。・・・その顔はわかってきたようじゃの。
   
どうじゃ。少し時間をあげるから自分で書き直してみなされ。

世留 (返事もしないで既にコーディングを始めている)。


あっという間に世留君はコードを書き終えました。

世留 仙人、仙人!見てください。

  Do While Range("A1").Value <>7
    Range("A1").Value = Int(Rnd * 10)
    ’if キーが押された then
    If GetAsyncKeyState(16) <> 0 Then
      If Range("A1").Value = 7 Then
        MsgBox "大当たり!"
  Loop

仙人 なるほど、ループの条件に大当たりをもってきたか。良くできた方じゃ。それじゃ
   
お前さん、動かしてみなされ。
  

世留 はい!

   あはは。動いた動いた。ボタンを押してみようっと。

   止まった止まった。大成功!

仙人 よかったのお。一発で大当たり出すなんぞ大したもんじゃ。さあもう一度押しなされ。

世留 (ボタン1を押す)

   あれ?動かない。もう一度・・・あれ?

仙人 そうじゃのう、お前さんもう一息じゃ。なぜ動かないんじゃろ?

世留 なぜって・・・・

   (コードをじっくり見る)

   ・・・そうか。ループの条件はセルの値<>7だから、ボタンを押した時点でセルの
   
値=7だったらループが開始されない。

仙人 どうもそのようじゃな。セルの値に関わりなくループを開始するにはどうすればよ
   
いじゃろう。

世留 わかった!ループの前にセルの値を消しちゃおう!

仙人 ははは。これまた強引じゃな、それもよかろう。じゃがな世留君、恒常ループには
   「定石」があるのじゃ。その「定石」を覚えれば、あらゆるアクションゲームを作
   
ることが出来る。今回はそれをお前さんに教えよう。

世留 「定石」ですか?

仙人 そう「定石」じゃ。常套手段のようなもんじゃのう。近田の作品なぞ全て同じ「定
   
石」を使っておる。まあ近田の場合、他にやり方を知らんのじゃろう、手抜きして
   おるのが見え見え。じゃがそれで十分じゃからええのじゃ。

世留 へえ、手抜きねえ。近田さんは一から作っているのかと思いましたよ。仙人仙人!
   
僕にも早く手抜きできる「定石」を教えて下さいよ。

仙人 これこれ、手抜きするために覚えるのではないぞ。まさに背骨となる部分、大事な
   ことじゃからな。どれっと。

   (ぼつぼつとタイピング)

Public GameFlag as Boolean

Sub strat()
 GameFlag=True
 Do While GameFlag=True
  ・・・・・・・・・・・・・・・・  
 Loop
End sub

   できたぞ。

世留 ・・・・これだけ?こんなのが「定石」ですか。

仙人 ほっほっほ、GameFlagという変数が「定石」なのじゃ。Boolean型で宣言しておるので
   値はTrueがFalseのどちらかが入る。このループの中でのう、ゲームが終了した際に
   
GameFlagをFalseとすれば簡単にループから抜けられる。Public型で宣言したのは、
   どこからでも変数の値を変えられるようにしたいからじゃ。ゲームが複雑になっていけば、
   メインルーチンやモジュールの外でGameFlagの値を変えることもあり得るからのう。
   さあ世留君、お前さんの書いたコードとの違いはなんじゃろう。

世留 そうかあ、わかってきたぞ。GameFlagを条件にループさせておけば、応用が利きますね。  

仙人 その通り。ゲーム終了条件は一つとは限らんからじゃ。ゲームクリアー、ゲームオー
   
バー・・・この場合だって、例えば「3」を小当たりにすることも、GameFlagでループ
   
させておけば簡単にできる。ループ中に判定を入れてGameFlag=Falseにすればいいだけ
   
じゃからのう。

世留 なるほどお。すごいや。定石定石♪

仙人 ほれ、世留君、忘れんうちにコードを完成させたほうがよいぞ。お前さんはあわてんぼ
   うの上に忘れっぽいからのう。
   

世留 ひどいなあ。Excelのことなら忘れませんよ!動かすメモも書いてるし。

   (すらすらとコーディング)

Sub strat()
 Dim i As Integer
 GameFlag = True
 Do While GameFlag = True
  Range("A1").Value = Int(Rnd * 10)
  If GetAsyncKeyState(16) <> 0 Then
   If Range("A1").Value = 7 Then
    MsgBox "大当たり!"
    GameFlag = False  
   ElseIf Range("A1").Value = 3 Then
    MsgBox "当たり!"
    GameFlag = False
   Else: MsgBox "はずれ!"
   End If
  End If
 Loop
End Sub

仙人 早速「3」の小当たりを組み込んでおるのお。このコードだと、「3」と「7」
   以外のときは「はずれ」は表示するもののGameFlagはそのまま、当たりになるまで
   ループは続行するというわけか。ほっほっほ。上出来じゃ。お前さんにも理解でき
   たようじゃのう。

世留 (照れながら)
   へへっ。すごいでしょ。

   (しばらく遊んでみる)
   うんうん、ゲームらしくなってきたなあ。7か3が出るまで終わらないから面白いや。

   
意地でも当たりを出したくなっちゃう。でも当たりを狙えないなあ。表示が速すぎて
   運頼りですよ。

仙人 そうじゃのう。まあこれはこれで面白いが狙えたほうがいいかもしれん。どうじゃ
   
世留君、アクションゲーム3箇条ヶ条目にいってみようかの。

世留 3箇条目?なんでしたっけ、あっ、同期Wait処理ですね!

仙人 (苦笑しながら)
   ほれ、もう忘れとる。3箇条そろって初めてアクションゲームといえるのじゃ。

世留 そうでしたそうでした。3箇条目をマスターすれば、「7」が狙えるようになるんで
   すね。楽しみだなあ。早く教えてくださいよ。仙人、「まずは書いてみなされ」とい
   うのはナシですよ。全然わからないんですから。

仙人 これこれ、威張ってどうする。まあ3箇条目も「定石」みたいなもじゃ。難しく考える
   ことはないぞ。またAPIが出てくるがのう。      

世留 げっ、API・・・。大丈夫、第1章で完璧にマスターしましたから。

仙人 あはは、それは頼もしい。3箇条目はちょっと長くなりそうじゃ。その前におやつでも
   いただこうかの。おーいばあさん、とっておきのカステラ、世留君に出してやってくれ。


動かすメモ3 ※メインルーチンの定石、恒常ループ

※ゲーム中のメインルーチンはDo〜Loopで
※ループの条件はBoolean型変数GameFlagを使用する

Sub strat()
 GameFlag=True
 Do While GameFlag=True
  ・・・・・・・・・・・・・・・・ 
   'ここには処理コードが入る
   'ゲーム終了時に、
GameFlag=False
  ・・・・・・・・・・・・・・・・ 
 Loop
End sub


VBAアクションゲーム?Excelで動かそう!世留と仙人第2章