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

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

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



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


スポンサーサイト

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






Chapter.26 [ 繰り返し処理 For文 ]

■繰り返し処理の必要性

前回の講座では、ユーザーフォームに画像を表示する様々なアプローチを解説しました。
透過処理の施された画像を使用したキャラクターの表示や、拡大縮小機能の実装など、ゲームに画像を取り入れる準備段階は理解できたと思います。

そして今回は、少しだけ画像の話を離れて、繰り返し処理について解説します。

ゲームのプログラミングをしていると、繰り返し処理が必要になる場面が頻繁に出てきます。
例えば、たくさんの同じキャラクターが表示されている場面などでは、表示されている全てのキャラクターを順番に処理していかなくてはなりません。こんなとき、ひとつひとつキャラクターを個別に処理していたのでは非効率的です。同じ動きをするキャラクターなら、繰り返し処理で一気に処理してしまったほうが、面倒が省けますし、コードの可読性から見ても理想的でしょう。
今回も、例を挙げて順に見ていきますので、焦らずしっかり覚えてくださいね。

それでは早速ですが、実際に繰り返し処理について解説していくことにします。

今回は、ユーザーフォームに、ラベルがひとつ配置されている、次のような状態を想定しています。

140.gif


ユーザーフォームの名前は『UserForm1』。ラベルの名前は『Label1』です。
それらのことを踏まえたうえで、まず、下のコードを見てください。

Sub kurikaesi()
    With UserForm1.Label1
        .Caption = "1行目の文章です" & vbCr & "2行目の文章です"
    End With
End Sub


さてこのコード。何をしようとしているのかわかるでしょうか。
このkurikaesiというプロシージャは、ユーザーフォーム上に設置されている、ラベルのキャプションを変更するプロシージャです。
コードの2行目には、以前解説した、Withステートメントを使っています。そこには、With UserForm1.Label1という記述がしてありますね。これによって、ユーザーフォーム上に設置されているラベルのプロパティを変更する場合には、ピリオド+プロパティという記述だけでOKになっています。これがよくわからない、という人は、以前の解説、『Chapter.23 [ Withステートメント ]』を見てくださいね。そちらで詳しく解説しています。

さて、その下の行では、.Caption = "1行目の文章です" & vbCr & "2行目の文章です"と記述されています。このコードを実行すると、どのようになるのでしょうか?
いつものように、ユーザーフォーム上にコマンドボタンを設置して、そこからこのkurikaesiプロシージャを呼び出すようにして、テストしてみましょう。

141.gif


142.gif


さて、準備ができたら、早速実行して、コマンドボタンを押してみましょう。
すると、次のようになったはずです。

143.gif

▼ コマンドボタンをクリックし、kurikaesiを実行すると……
144.gif


先に載せたコードで、『vbCr』という記述がありますね。これは、文字列の改行を表しています。ですからラベル上に、上段下段2行の文字列が表示されたわけです。もしvbCrなしで同様のコードを実行すると、こんな感じになっちゃいます。

145.gif


これはちょっと変ですね。途中でvbCrを挟んでおけば、改行されてキチンと表示されるというわけです。


■繰り返してみる

さて、このコードに繰り返し処理を実装させてみようと思うわけですが、その前に皆さんに質問です。
皆さんは、物を数えるとき、どんなふうに数えますか? 数えるものはりんごでもお皿でも百円玉でも何でもいいんですが、きっとこんなふうに数えますよね?
りんご⇒1個……2個……3個……
お皿⇒1枚……2枚……3枚……
百円玉⇒100円……200円……300円……


プログラミングで繰り返し処理する場合にも、これと同様に考えることができます。
繰り返し処理を行う場合には、今現在、何番目の処理をしているのかを明確にする必要があります。そのために、今何番目の処理をしているのか、それを保持する変数が必要です。
皆さんが物を数えるときは、無意識に頭の中で今何番目かを記憶しています。ですから1個……2個……ときて、いきなり5個……とはならないですよね。
プログラムが動くときにも、ある特定の変数が、毎回プラス1ずつ増えていくよう決められていれば、プログラムが順番をとばしてしまうことはありませんよね。
そして、その変数と、『For文』を組み合わせることで繰り返し処理を行うことができます。

具体的には、次のようにします。

For 変数 = 最初 To 最後
    繰り返す処理
Next


上のコードで、『変数』となっている部分が、『最初』から『最後』の部分まで順番に増えていきます。通常は1回繰り返すごとに1ずつ増えていきます。
最初』の部分に1を指定して、『最後』の部分に5を指定すれば、1~5まで全部で5回繰り返し処理が行われます。
例えば次のようなコードを実行すると、メッセージが3回出ます。

Sub test()
    Dim I As Integer
    For I = 1 To 3
        MsgBox I
    Next
End Sub


上の例で見ると、変数 I が、毎回増える『変数』です。そして、『最初』には1が指定されており、『最後』には3が指定されているので、全部で3回繰り返し処理が行われます。
メッセージとして、『変数 I 』を表示するようになっているので、1、2、3、という具合に3回メッセージがでます。

どうでしょう? なんとなく理解できましたか?


■最初のコードに応用してみる

さて、始めに紹介したラベルの表示を変えるプロシージャに、この繰り返し処理を実装するとどうなるのでしょう。
現状では、直接的にコードで2行の文字列を表示させていますが、これを繰り返すたびに毎回増やすようにしたいと思います。
例えば、5行の文字列を表示させるとすると、どうでしょうか。

Sub kurikaesi()
    Dim I As Integer
    With UserForm1.Label1
        For I = 1 To 5
            .Caption = I & "行目の文章です" & vbCr
        Next
    End With
End Sub


最初にDimを使って、整数型の変数 I を宣言しています。
そして、この変数を使って、1から5まで、5回処理を繰り返します。毎回繰り返すたびに改行させるようにするために、最後にはvbCrをつけます。
一見すると、なんとなくうまくいきそうに見えますね……。
しかしこれには罠が潜んでいるんです。それは実行させてみればわかります。

それがこれです。
146.gif


おかしいですね。キチンと改行もしているはずなのに、表示されているのは本来5行目に来るはずの文字列だけです。
これをうまく動かすようにするには、もうひと工夫必要です。と言っても、コードをちょこっと追加するだけです。

それがこれ。
Sub kurikaesi()
    Dim I As Integer
    With UserForm1.Label1
        .Caption = ""
        For I = 1 To 5
            .Caption = .Caption & I & "行目の文章です" & vbCr
        Next
    End With
End Sub


コードを2行追加しました。どこだかわかりますか?

まずは4行目。『.Caption = ""』の部分。これを追加することによって、始めから表示されている文字を、いったんクリアしています。何もない空の文字列をキャプションに設定することによって、全ての文字列を消しています。

そして、繰り返し処理の中の部分。
.Caption = .Caption & I & "行目の文章です" & vbCr』というふうに変更されています。
ここでは、元から入っていた文字列に、新しい文字列を連結するようにコードを変更しています。こうしないと、毎回毎回文字列が上書きされていってしまうのですね。だから最初のコードでは、最後の5行目の文字しか表示されなかったわけです。

もう少し詳しく解説すると、1回目の処理では、クリアされた直後の、何もないところに文字を入れていますので、下のようになります。
    .Caption = "" & I & "行目の文章です" & vbCr

最初の””は、何もない空の文字列です。そこに変数の数値と、『行目の文章です』を連結するので、結果的には『1行目の文章です(改行)』がキャプションに設定されます。

2回目以降の処理では、先に設定した文字列に、新しく文字列を連結していますので、次のような感じです。
    .Caption = "1行目の文章です(改行)" & I & "行目の文章です" & vbCr


さて、サブプロシージャkurikaesiを正しく修正できたら、実行して正しく表示されるかテストしてみてください。
うまくできていれば次のようになるはずです。

147.gif


キチンと文字列が連結し、改行されていますね。


■まとめ

For:

構文
    For カウンタとなる変数 = 最初の数 To 最後の数
        処理~
    Next
説明
    指定された回数分繰り返し処理

注意点としては、最初の数と、最後の数の、数値の指定の仕方があります。
繰り返し処理(For文)は、通常での場合プラス方向にカウントされていくようになります。ですから、最初の数よりも、最後の数が小さい数にならないようにしましょう。1ずつプラスされていくのに、最初の数より最後の数が小さいというのは変ですもんね。そのような指定の仕方をしないように注意しましょう。

ちなみに、マイナスの方向にカウントされていくようにできないということではありません。方法は……別の機会に。あまり使う機会がないと思いますし。

あとは、無意味に大きな数値を指定すれば、それだけ時間と負荷が大きくなります。テストする場合には、いきなり大きな数値を指定しないようにしましょう。まぁ、ただ単にまわすだけなら1万回くらいはほとんど一瞬ですけどね。
もしも、毎回メッセージを表示するようなプログラムを、1万回とかまわしてしまうと、当然1万回メッセージのOKボタンを押さなきゃならないはめになるので、大変です。


■格言

繰り返し処理には、For文を使う
繰り返し回数を保持する変数を宣言しておく
文字列の改行には、vbCrを使う


繰り返し処理について理解できたでしょうか?
関連記事






Comment

Name
E-mail
URL
Comment
Pass  *
Secret? (管理者にだけ表示)
多分次のステップになると思いますが、
For カウンタとなる変数 = 最初の数 To 最後の数
の後に step [数字]
というのがありますね。
これを応用すれば、ゲームプログラムにも活用
できます。
  • 中山功一#sfl/mmIw
  • URL
  • 2007.11.24(Sat)
  • Edit
中山さん、どうもです。

Stepを使うと、マイナス方向へのカウントなど、柔軟な繰り返し処理が可能になりますね。
ただ、今回はあえて解説しなかったのですが、確かにゲームの作成には有用な情報ですね。

新作にも、これを用いたプログラミングがされている部分があります。
  • 影斬#m.2.LkcQ
  • URL
  • 2007.11.26(Mon)
  • Edit
どこに書けば良いのかわからないのでコメント欄で質問をさせてください。

なぜ、Step -1の時 カウンタ変数にByte型の変数を使用するとオーバーフローの、
エラーが出るのでしょうか?

疑問に思っているので、よかったら解答よろしくお願いします。
  • Kws#EBUSheBA
  • URL
  • 2009.08.16(Sun)
  • Edit
>Kwsさん

こんばんは。For文を用いた繰り返し処理には、あまりByte型は使用しません。これにはちゃんと理由があります。
Byte型変数を説明するときには、専門的な言い方をすると「8ビット、符号なし」などと言います。これはどういうことだか、わかるでしょうか。
1ビットでは、オンかオフの2種類の情報しか保持できません。それが8個あると8ビットですよね。2種類しか情報を保持できなくても、それが8個あれば「2の8乗=256」となるので、0~255までの数値を保持することができるようになります。
そして、符号なしという言葉からわかるように、Byte型変数にはマイナスという概念がありません。マイナスを表すためには、さらに多くのビットが必要になりますから、8ビットでは足りなくなってしまうのですね。
このことから、Byte型変数では、あくまでも整数しか扱うことはできず、なおかつ、範囲は0~255の範囲に限られていること、そしてマイナスの数値は格納できないということがわかります。
For文のなかでStepステートメントによって処理を行う際、カウンタがマイナスの領域に達したり255以上の数値に達したりした場合、Byte型ではオーバーフローを起こしてしまうのですね。
どうでしょう、参考になりましたでしょうか。
  • 影斬#m.2.LkcQ
  • URL
  • 2009.08.16(Sun)
  • Edit
それは、自分でも分かってはいるつもりで、
以下のように[0-255]を超えないようやってるのですが・・・
エラーになってしまう。

もしかして私、どこか間違ってますか?

ーーーーーーーーーーーーーーーーーーー

Sub Test()

  Dim I As Byte

  For I = 100 To 90 Step -1
   MsgBox I
  Next

End Sub

ーーーーーーーーーーーーーーーーーーー
  • Kws#EBUSheBA
  • URL
  • 2009.08.16(Sun)
  • Edit
>Kwsさん
こんばんは。影斬です。
私も実際にやってみたのですが、確かにオーバーフローのエラーが出ますね。これは不思議です。
これは正直言って私にもわかりません。理屈上はオーバーフローにはならないはずなのに、それでも確かにオーバーフローが発生してしまうということは、恐らく内部的な処理において、Byte型の範囲外になるような計算が行われているのだと思います。(たとえば一時的に数値をマイナス領域にまで持っていって差し引きしているとか)
やはり、For文などでカウンタとして使う変数には、最低でもマイナス領域を扱うことができる Integer型 を使うようにしたほうがいいのかもしれません。
お役に立てなくてごめんなさい。
  • 影斬#m.2.LkcQ
  • URL
  • 2009.08.17(Mon)
  • Edit
そうですか・・・残念です。

でも、そこまでByte型にこだわる理由もないですし
素直にIntegerやLongなどの型を使うことにします。
お時間を取らせて申し訳ないです。

質問に答えて頂いて、有り難うございます。
  • Kws#EBUSheBA
  • URL
  • 2009.08.17(Mon)
  • Edit
このコメントは管理者の承認待ちです
  • #
  • 2009.12.17(Thu)
  • Edit

メールフォーム

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

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

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

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ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。