ExcelVBAゲームプログラミング?

初心者でもきっとできる!
Excelさえ持っていれば特別なソフトは不要!
すぐにでも始められる簡単ゲームプログラミング!
今すぐ始めよう!

サンプルやゲームのダウンロードができる別館も好評運営中です。
ご意見やご質問、ゲームの感想等は掲示板までお気軽に。是非、皆さんの声を聞かせてください。運営、開発の励みになります。



各種ダウンロードはコチラ ↓ 意見・感想・質問はコチラ ↓
影倉庫 Shadow warehouse サポート掲示板
ブログの全体像はコチラ ↓ リンクのページはコチラ ↓
サイトマップ 自分本位なリンク


スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。






Chapter.27 [ 繰り返し処理 Do~Loop文 ]

For文以外の繰り返し処理

前回は、For文を利用した繰り返し処理を解説しました。
何回繰り返したかを記憶する変数を用意し、最初の数と、最後の数を指定するのでしたね。

For文を用いて繰り返し処理を行う場合には、指定した数から指定した分だけ、一定の回数繰り返し処理を行います。例えば、10回繰り返し処理を行いたい場合には、最初の数に1を、最後の数に10を指定すればよいのです(別に10から20でもいいんですけど、場合によります)。最初の数と、最後の数との差が大きければ大きいほど、たくさんの繰り返しを行うことができます。
しかし、考えてみてください。
例えばババ抜きなどのカードゲーム。
大抵の場合、カードゲームでは自分のターン⇒相手のターンと、規則的に何度も同じ手順を繰り返します。一見すると、For文を用いた繰り返し処理を活用できそうな気がしますよね。
でも、その繰り返す回数は、毎回規則的とは限りません。ババ抜きの場合には、お互いにババを引き続ければ、下手をすると最後の最後で何回もターンが切り替わり、ずーっと終わらない、なんてこともあるかもしれません。
要するに、繰り返す回数が一定ではないケース、というのがゲームにおいては多々あるのです。

こういったケースでは、繰り返しにFor文を用いるべきではありません。というか回数が決まってないわけですから、最初の数と最後の数の指定に問題が出てきます。そんなときは、もうひとつの繰り返し処理法を用いるべきなのです。その方法こそ、今回解説する『Do~Loop』を用いたやりかたです。

そんなわけで、今回はDo~Loopを解説します。
ただし、先に言っておきますが、ひとつ注意点があります。

Do~Loop文は、For文に比べると、若干扱いが難しいです。というのは、For文が、最初から最後までの決められた回数繰り返す、のに対し、Do~Loop文は、一定の条件を満たすまで何回でも無限に繰り返す、という特性を持っているからです。
これは言い換えると、キチンとした終了条件を指定せずに実行すると、プログラムは永遠に止まらなくなる、という事でもあります。なんだか響きからして恐くないですか? 恐いですよ……。永遠に止まらないなんて。

ですから、今回の解説をキチンと理解し、正しい方法を学んだ上で、使用するようにしてください。ちょっと大袈裟に書いてますが、やっちゃった~! って時に、途中で止める方法はちゃんとあるのでご安心下さい。それは順を追って解説しますのでね。


■いろんな繰り返し方

さて、それでは実際にDo~Loopについて見ていきましょう。

先にも言いましたが、Do~Loopは一定の条件を満たすまで、ずっと繰り返し処理を継続します。ロールプレイングゲームで例えると、敵が全滅するか、パーティが全滅するまで戦闘は終わらないですよね。『敵が全滅』と『パーティの全滅』が、繰り返しを終了する条件というわけです。

Do~Loop文では、この終了条件を指定する方法が、実に多彩なバリエーションで用意されています。これによってプログラマーは、様々なケースに応じて柔軟に対応することが可能になります。しかしこれは逆の効果も生み出します。やり方が色々あるので、ちょっととっつきにくいというか、難解な部分があるのです。
ですから、今回は私にとってのスタンダードな方法に絞って解説することにします。
Do~Loopの仕組みがよくわからないという人や、プログラム初心者の方は、とりあえず今回のやり方をマスターしてみてください。そして、興味が湧いてきたら、その他の方法についても勉強してみるといいでしょう。この講座でも、そのうちやるかもしれませんしね。

まずはDo~Loopの最も基本的な構文です。

Do
    繰り返したい処理
Loop


字数が少ないせいか、どこか単純な感じがしますね。うどんで例えるなら、つゆに麺だけ……みたいな感じでしょうか。
Doと表記したところから、Loopと表記した部分の間に、繰り返したい処理を記述します。For文とは違い、無制限に繰り返し処理が行われます。
しかしこのままでは、さっきも書いたとおり、永遠に処理が止まりません。ですので、繰り返し処理を抜けるための、終了条件を追加しなくてはなりません。この終了条件の記述の仕方が、実に様々なのですが、今回は『Until』を例に挙げて見ていくことにします。


Do~LoopUntil

Until』は、直訳すると『~するまで』とか『~となって初めて』とか、そんな意味だったと思います。
つまり、Do~Loop + Until の場合には、終了条件を『~になるまで繰り返す』という具合に指定します。ある条件が満たされるまで、ひたすら繰り返しを続けるのです。ロールプレイングゲームに例えるなら、『敵の数が0になるまで繰り返す』とかですね。

それを踏まえて、以下のコードを見てください。

Sub Loop_Test()
    Dim L As Long
    Do Until L = 10
        L = L + 1
    Loop
    MsgBox L
End Sub


このコードを実行すると、『10』と表示されたメッセージが出ます。
順を追って見ていきましょう。

まず、このLoop_Testというプロシージャでは、冒頭でLong型の変数を宣言しています。
そして、『Do Until L = 10』というふうに、Untilを使って終了条件を指定しています。
Untilは、~になるまで繰り返す、という条件指定をしますから、これを訳すと『変数Lが10になるまで繰り返す』となりますね。

そして、DoLoopの間(繰り返す処理の部分)で、変数Lを毎回プラス1ずつ増やしていくようにしています。

プロシージャの内部でDimによって宣言された変数は、実行時には各データ型の規定値があらかじめ入っています。Long型の場合には、規定値は『0』です。
ですから、プロシージャを実行するたびに、変数Lの値は0~10までの範囲で繰り返し処理されることになります。
変数Lが10になった時点で、終了条件である『Until L = 10』が満たされます。そうすると、Untilが終了を検知して、繰り返し処理を終了させます。最後にメッセージとして変数Lを表示するようになっているので、『10』というメッセージが出て、プロシージャが終わります。

ちょっと駆け足で説明しましたが、理解できたでしょうか。


■終了条件のタイミングを知る

Do~Loop文でポイントとなるのは、終了を検知する場所を正しく把握しておくことです。
もう少し具体的に言うと、一体どのタイミングで、繰り返し処理の終了が検知されるか、ということですね。

VBAのコードというのは、原則上から下に向かって実行されていきます。
先ほどの例で言えば下のようになります。

Sub Loop_Test()

Dim L As Long

Do Until L = 10

L = L + 1

Loop
↓ :ここは繰り返しなので戻る
Do Until L = 10

L = L + 1

Loop
↓ :以下終了条件になるまで繰り返して……
Do Until L = 10
↓ :変数Lが10になっていたら(条件を満たしていたら)抜ける
MsgBox L

End Sub


先ほど挙げた例の場合には、『Do Until L = 10』という具合に、終了条件を指定していましたよね。ですから、終了条件を判断しているのは『Until』が記述されている行のところだけです。
L = L + 1』のところや『Loop』のところでは、例え、終了条件である『L = 10』が満たされていたとしても、繰り返しから抜けることはありません。あくまでも『Until』の部分が判断をし、繰り返し処理から抜けさせるのです。

この、終了させるタイミングを知っておくことは、繰り返し処理において非常に重要です。
このことを正しく理解していないと、意図しない結果を招き、頭を抱えることになることもあります。
たとえば、以下のようなコードはどうでしょうか。

Sub Loop_Test()
    Dim L As Long
    L = 0
    Do Until L < 10
        L = L + 1
        MsgBox L
    Loop
End Sub


これを実行すると、実際には何も起きません。繰り返し処理の中にMsgBoxが含まれているにも関わらず、メッセージが表示されることは決してありません。
なぜだか理由は簡単ですね。
一番最初の部分で、変数Lに0を代入しているため、終了条件である『Until L < 10』を始めから満たしてしまっているからです。中の処理を1度も通ることなく、いきなり終了してしまっているわけです。

しかし、ゲームのプログラミングをしていると、いろいろなケースに出くわします。もしかしたら最低でも1回は、繰り返し処理の中を実行してくれないと、困る場面が無いとも限りません。
それでは、最低1回は繰り返し処理の中を通らせたい、という場合にはどうしたらいいのでしょうか。
これには『Untilだけが終了を検知する』という仕組みを、うまく応用すれば対応できます。
つまり、終了の判断を、『Do』のところではなく、『Loop』のところでするようにすればいいのです。これを踏まえて先ほどのコードを書くと、こうなります。

Sub Loop_Test()
    Dim L As Long
    L = 0
    Do
        L = L + 1
        MsgBox L
    Loop Until L < 10
End Sub


この場合には、終了条件を判断しているのが『Loop』がある行の部分ですので、1回だけDoからLoopまでの間を通ります。ですから、『1』というメッセージが表示されます。
一番最初に『Loop』の部分を通ったときに、終了条件の判断が行われるので、変数Lは一度だけプラス1されるというわけですね。


Do~Loopを使うときの注意点

上で書いたように、Untilを記述する場所を変えることで、終了を判断するタイミングを変えることができます。
ただし、Untilが記述できるのは、『Doの後ろ』か、『Loopの後ろ』だけです。繰り返し行われる処理の中で、ダイレクトにUntilを使うことはできません。必ずDoLoopのどちらかとセットで使う必要がありますので、覚えておきましょう。

また、何度も言いますが、Do~Loopの場合には正しく終了条件を記述しないと、永遠に処理が止まらなくなります。こういう状態を、よく『無限ループ』なんて呼んだりします。
この状態になると、ハッキリ言ってかなり危険です。ほったらかしにしておくと、きっとパソコンが壊れるんでしょうね……。多分。
ですから、終了条件の記述には、充分注意しましょう。

しかし、それでも意図しない結果として、無限ループに陥ってしまうことはあります。特にDo~Loopの扱いに不慣れなうちはよくあることだと思います。
ヤバイ! 無限ループになってる! と気がついても、そこで焦ってはいけません。キチンとこれを止める方法があるからです。先に言え! っていう感じですか。すいません。

無限ループに陥ってしまったり、あえて繰り返し処理を中断したい場合など、それを止める手段として『コードの中断』があります。そしてその方法は非常に簡単。

Escキーを押す』、だけです。

これは、繰り返し処理に限らず、VBAのどんな処理中でも原則として有効です。
時間のかかる処理を途中で中断したりするときにも、これで対応が利きます。
Escキー以外にも、『Ctrlキー + Breakキー』でも、同様に処理が止まります。私はどちらかというと、後者の方を使ってます。両者の違いは……、あるのかもしれませんが、自分にはわかりません。ごめんなさい。一応VBAのヘルプには後者のほうが載ってたと思います。

この『コードの中断』の方法を知らずに、繰り返し処理を適当に記述するのは危険です。しっかり覚えておきましょう。

さて、For文に続き、Do~Loop文を解説しましたが、これらの繰り返し処理について、なんとなく理解できたでしょうか。
次回は、Escキーで強制的に繰り返しを終了するのではなく、意図的にコードから繰り返し処理を終了させる方法を解説する予定です。


■格言

Do~Loopには繰り返し回数の制限がない
キチンと終了条件を記述する
処理を中断するにはEscキー


無限ループには焦らずEscキーですよ。
関連記事






Comment

Name
E-mail
URL
Comment
Pass  *
Secret? (管理者にだけ表示)

メールフォーム

影斬に物申すという方はこちら

名前 :
メール:
件名 :
本文 :

可能な限り要望には応えますが、必ず返信や回答ができることを、保障するものではありません。
ご了承ください。

Chapters

コンテンツ一覧


■Chapter 一覧■
    全てのChapterの一覧です。
    直接アクセスしたい方はこちらをご利用下さい。

    Chapter.1 [ 知っておくべき心得 ]
    Chapter.2 [ Excelってなんだろう ]
    Chapter.3 [ Excelの基本画面 ]
    Chapter.4 [ VBAとは? ]
    Chapter.5 [ モジュールについて ]
    Chapter.6 [ 変数 ]
    Chapter.7 [ 変数の型と宣言 ]
    Chapter.8 [ プロシージャとスコープ ]
    Chapter.9 [ ゲームつくる様々な手法 ]
    Chapter.10 [ ユーザーフォーム ]
    Chapter.11 [ プロパティウィンドウ ]
    Chapter.12 [ 乱数 ]
    Chapter.13 [ 条件分岐 ]
    Chapter.14 [ ゲーム画面のデザイン ]
    Chapter.15 [ コード記述の基本作法 ]
    Chapter.16 [ じゃんけんゲーム:1 名前をつける ]
    Chapter.17 [ じゃんけんゲーム:2 フォームの起動 ]
    Chapter.18 [ じゃんけんゲーム:3 乱数の種 ]
    Chapter.19 [ じゃんけんゲーム:4 イベント ]
    Chapter.20 [ じゃんけんゲーム:5 引数 ]
    Chapter.21 [ じゃんけんゲーム:6 役判定 ]
    Chapter.22 [ じゃんけんゲーム:7 予測と制限 ]
    Chapter.23 [ Withステートメント ]
    Chapter.24 [ 画像を表示させる ]
    Chapter.25 [ 画像表示の発展形 ]
    Chapter.26 [ 繰り返し処理 For文 ]
    Chapter.27 [ 繰り返し処理 Do~Loop文 ]
    Chapter.28 [ Exitステートメント ]
    Chapter.29 [ フォーム上の位置情報 ]
    Chapter.30 [ API基礎知識 ]
    Chapter.31 [ API補足知識 ]
    Chapter.32 [ メインループを考える ]
    Chapter.33 [ 同期処理の概念 ]
    Chapter.34 [ 移動処理その1:画面設定と考え方 ]
    Chapter.35 [ 移動処理その2:DoEvents ]
    Chapter.36 [ 移動処理その3:キー入力判定API ]
    Chapter.37 [ 条件分岐のさらなる探求 Select Case ]
    Chapter.38 [ アニメーション ]
    Chapter.39 [ 配列変数 ]
    Chapter.40 [ ゲームの初期化 ]
    Chapter.41 [ シューティングゲーム1:ゲーム設計 ]
    Chapter.42 [ シューティングゲーム2:メインプロセス ]
    Chapter.43 [ シューティングゲーム3:構造体 ]
    Chapter.44 [ シューティングゲーム4:定数 ]
    Chapter.45 [ シューティングゲーム5:プレイヤーキャラクター ]
    Chapter.46 [ シューティングゲーム6:ショットを撃つ① ]
    Chapter.47 [ シューティングゲーム7:ショットを撃つ② ]
    Chapter.48 [ シューティングゲーム8:Mod演算子の活用 ]
    Chapter.49 [ シューティングゲーム9:敵キャラクター登場 ]
    Chapter.50 [ シューティングゲーム10:衝突判定 ]
    Chapter.51 [ シューティングゲーム11:衝突の実体 ]
    Chapter.52 [ シューティングゲーム12:敵の攻撃 ]
    Chapter.53 [ シューティングゲーム13:爆発エフェクト ]
    Chapter.54 [ シューティングゲーム14:残機数表示① ]
    Chapter.55 [ シューティングゲーム15:残機数表示② ]
    Chapter.56 [ シューティングゲーム16:スコアの表示 ]
    Chapter.57 [ シューティングゲーム17:タイトル画面 ]
    Chapter.58 [ シューティングゲーム18:ボスキャラクター ]
    Chapter.59 [ シューティングゲーム19:最後の仕上げへ ]
    Chapter.60 [ シューティングゲーム20:いよいよ完成STG ]
    Chapter.61 [ カードゲームで使えるめくり効果 ]
    Chapter.62 [ ラジアンと角度 ]
    Chapter.63 [ ラジアンの活用:円運動 ]
    Chapter.64 [ ラジアンの活用:任意の角度へ移動する ]
    Chapter.65 [ APIによるサウンド再生:基礎 ]
    Chapter.66 [ APIによるサウンド再生:MIDIと多重再生 ]
    Chapter.67 [ APIによるサウンド再生:MCIコマンドとループ再生 ]
    Chapter.68 [ Function プロシージャ ]
    Chapter.69 [ 値渡しと参照渡し ]
    Chapter.70 [ デバッグ1:イミディエイトウィンドウ ]
    Chapter.71 [ デバッグ2:ローカルウィンドウ ]
    Chapter.72 [ デバッグ3:コード実行の中断 ]
    Chapter.73 [ オブジェクトってなんだ ]
    Chapter.74 [ プロパティ・メソッド・イベント ]
    Chapter.75 [ オブジェクト変数 ]
    Chapter.76 [ オブジェクトとコレクション ]
    Chapter.77 [ 特殊な繰り返し:For Each ]
    Chapter.78 [ エラー処理 ]
    Chapter.79 [ On Error と GoTo文 ]
    Chapter.80 [ Resumeステートメント ]
    Chapter.81 [ バイトとビット ]
    Chapter.82 [ ウィンドウメッセージとイベント ]
    Chapter.83 [ 文字列の基礎 ]
    Chapter.84 [ 文字列操作① ]
    Chapter.85 [ 文字列操作② ]
    Chapter.86 [ タイピングゲーム1:仕様を決める ]
    Chapter.87 [ タイピングゲーム2:キー入力検知 ]
    Chapter.88 [ タイピングゲーム3:文字列照合 ]
    Chapter.89 [ タイピングゲーム4:判定関数 ]
    Chapter.90 [ タイピングゲーム5:ゲーム画面設計 ]
    Chapter.91 [ タイピングゲーム6:問題文のソート ]
    Chapter.92 [ タイピングゲーム7:動的配列 ]
    Chapter.93 [ タイピングゲーム8:キーダウンイベント ]
    Chapter.94 [ タイピングゲーム9:正打数の表示 ]
    Chapter.95 [ タイピングゲーム10:タイムの表示 ]
    Chapter.96 [ クリックゲーム1:イベントの種類 ]
    Chapter.97 [ クリックゲーム2:画面設計 ]
    Chapter.98 [ クリックゲーム3:クリック座標検知 ]
    Chapter.99 [ クリックゲーム4:キャラクター準備 ]
    Chapter.100 [ クリックゲーム5:キャラクターの配置 ]
    Chapter.101 [ クリックゲーム6:キャラクター移動とNot演算子 ]
    Chapter.102 [ クリックゲーム7:クリックのヒット判定 ]
    Chapter.103 [ クリックゲーム8:ヒットマークエフェクト ]
    Chapter.104 [ クリックゲーム9:サウンド処理の実装 ]
    Chapter.105 [ クリックゲーム10:マウスカーソルの変更 ]
    Chapter.106 [ ブロック崩しゲーム1:仕様と概要を決める ]
    Chapter.107 [ ブロック崩しゲーム2:基本概念の確認 ]
    Chapter.108 [ ブロック崩しゲーム3:ベクトルとは ]
    Chapter.109 [ ブロック崩しゲーム4:変数や定数の宣言 ]
    Chapter.110 [ ブロック崩しゲーム5:初期化処理の実装 ]
    Chapter.111 [ ブロック崩しゲーム6:ブロックの配置 ]
    Chapter.112 [ ブロック崩しゲーム7:根幹処理とバーの処理 ]
    Chapter.113 [ ブロック崩しゲーム8:線分と線分の交差を判定 ]
    Chapter.114 [ ブロック崩しゲーム9:線分同士の交点 ]
    Chapter.115 [ ブロック崩しゲーム10:ボールの処理 ]
    Chapter.116 [ ブロック崩しゲーム11:最終調整して完成へ ]
    Chapter.117 [ テキストファイル操作基礎 ]
    Chapter.118 [ テキストファイル操作:読み込み編 ]
    Chapter.119 [ テキストファイル操作:CSV読み込み編 ]
    Chapter.120 [ テキストファイル操作:様々な読込編 ]
    Chapter.121 [ テキストファイル操作:バイナリ編 ]
    Chapter.122 [ テキストファイル操作:暗号化編 ]
    Chapter.123 [ テキストファイル操作:復号化編 ]
    Chapter.124 [ クラスモジュールとは ]
    Chapter.125 [ クラスモジュール:メソッド編 ]
    Chapter.126 [ クラスモジュール:プロパティ編 ]
    Chapter.127 [ クラスモジュール:イベント拡張編 ]
    Chapter.128 [ クラスモジュール:イベント自作編 ]
    Chapter.129 [ APIによる描画処理1:ハンドル ]
    Chapter.130 [ APIによる描画処理2:デバイスコンテキスト ]
    Chapter.131 [ APIによる描画処理3:ペン オブジェクト ]
    Chapter.132 [ APIによる描画処理4:ブラシ オブジェクト ]
    Chapter.133 [ APIによる描画処理5:図形描画準備編 ]
    Chapter.134 [ APIによる描画処理6:図形描画実践編 ]
    Chapter.135 [ APIによる描画処理7:画像描画の仕組み編 ]
    Chapter.136 [ APIによる描画処理8:ビットブロック転送編 ]
    Chapter.137 [ APIによる描画処理9:ラスタオペレーション ]
    Chapter.138 [ APIによる描画処理10:マスク描画 概念編 ]
    Chapter.139 [ APIによる描画処理11:マスク描画 実践編 ]


    コードやVBAに関する質問などはサポート掲示板(別館)までお気軽にどうぞ。




fc2 seotool Excel VBA ゲーム プログラミング 講座

Counter

twitter


Shadow BBS - 影掲示板

VBA 関連書籍



上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。