Last Update : 1999/10/10 20:12

SHIROのVB講座
『超』初心者編 第5日目

昨日は、IF文で条件分岐をやってみた。IFステートメント自体にループ構造が内蔵されていないので、ループさせるにはどうしても時代遅れのGoto文が必要になってしまう。

そこで今日は、ループ構造を内臓している『Do 〜 Loopステートメント』で条件分岐で条件分岐を行ってみよう。そして、いよいよゲーム作りに入るぞ!

『Do〜Loop』なんて名前からして、いかにもループが簡単に出来そうだ。(笑)

余計な能書きはやめて、早速コードを準備して、感覚的に理解してしまおう。行うことは、昨日の講義でやった『1〜10までの整数の総和を求める』プログラムを作ってみよう。

昨日のフォームをそのまま流用しても良い。とりあえず、必要なコントロールは、テキストボックスコントロール1個(Text1)、コマンドボタンコントロール1個(Command1)だけで良い。

Private Sub Command1_Click()
'変数の宣言
Dim x As Long, y As Long

    '初期化
    x = 0
    y = 0

    Do Until x = 10

        'ループカウンター(整数)を1ずつ増やす。
        x = x + 1

        '1ずつ増えている整数『x』を総和に足していく・・・。
        y = y + x

    Loop

    '計算結果を表示
    Text1 = y

End Sub

さて、解るだろうか。Doの横に『 Until 』というキーワードが見える。x が10になるまで、Do〜Loopの間でループが繰り返されると言う意味だ。

例によって、Do〜Loopの中にあるステートメントは、全てインデント(4字下げ)してある。これもプログラムを見やすくするための工夫。別にインデントしなくても動作するのだが、後々のことを考えて、こういう風にコーディングすることをお奨めする。プログラマによっては「3字下げ」のインデントをする。

Do〜Loopは、以下のような書き方も出来る。

    Do
        .....
    Loop Until x = 10

この場合は、ループするかどうかを判断するタイミングは、一通り処理が終わってからだ。つまりDo〜Loopの中のステートメント群は必ず1回は実行されることになる。

ちなみに先ほどの場合は、Do文の横にキーワードと式が書いてあるので、ループが行われるかどうかを判断するタイミングは、Doに処理が来たときに判断される。もしここで「 x = 10 」ならば、Loopの次の文に処理が飛ぶ。

今回のプログラムの場合には、どちらかと言うと、Loopの横に『 Until x = 10 』を配置する後者の方が良いかもしれない。

何故なら、必ず1回以上ループの中が実行されなければならないがプログラムしている段階でわかっているので、コンピュータが条件を判断する回数が1回減らすことが出来るからだ。

まぁ、今回の場合には、非常にわずかな差しかないわけで、この差が直ちに大問題にはなることはまず無いが、ループ構造が多重の入れ子構造(ループの中にそれよりも小さなループ構造がある構造のこと)になる場合には、小さな差と言えども『塵も積もればマウンテン』なので、注意したい。こういう使い分けが適宜出来るようになれば、プログラマ中級者レベルと言えるぞ。


また、ループの途中で突然Loop構造から抜け出したくなった場合は、以下のようにする。

    Do ...
        .....
           Exit Loop
        .....
    Loop

これは、ループの中で、If文を使ったりして、もうループする必要がなくなったときなんていうことがよくある。便利なので覚えておこう。

「 Until 」キーワードの他にも、『 While 』キーワードもある。Untilは「**するまで」だったのに対し、Whileは『**している間ループを繰り返す』と言ったときに使う。

    Do While x < 10
        .....
    Loop

もちろん、以下のようにLoop文の横に書いておくことも可能だ。

    Do
        .....
    Loop While x < 10

また、Exit Loopを使うことが前提であれば、「とりあえず必ずループする」というループ構造が欲しいときもある。そんなときは以下のように書いておこう。

    Do Until False
        .....
           Exit Loop
        .....
    Loop

こうしておけば、Exit Loopでしかこのループ構造から抜けられないのだが、例えば、Goto文を使ってLoopのところからDoへ飛ばすような見にくいプログラムを作らなくて済むぞ。


前置きが長すぎた。(笑)

ループ構造がわかったところで、いよいよゲームを作ることにしよう。

今回作るのは、非常に簡単で作る段階で、プログラムの基礎が誰にでも理解できる『数当てゲーム』だ。(・・・と思われる)

ルールは『コンピュータが事前に1〜100までのランダムな数を用意する。その数をユーザが当てる』というもので、当たるまでゲームは続けられる。かなり原始的なゲームだが、平均何回で当てられるか、などを競えば結構面白いかもしれない。

面白いかどうかはともかく、とりあえず、全体でどのような考え方でプログラムを組むことにしようか?!各自でよく考えて見よう。どのような考え方で組むかを考えることは、非常に大事だが、ちょっと面倒かもしれない。どのように考えれば良いのか、なかなか慣れないうちは思いつかないものだ。他人がどのように解決しているかを見ながら、少しずつコツを掴んでいこう。

プログラムの論理的な設計を行うことを、「アルゴリズムを設計する」などと言ったりする。コンピュータにどのような道筋で処理をさせ、どのように計算させ判断させるか、などを組み立てる作業だ。最適なアルゴリズムというのは、なかなか見つかるものではないが、常によく考えることで、パッとひらめくようになるものだ。そのうちにパターンのようなものが頭の中に自然と浮かんでくれば、もうプログラム上級者だ。(ちょっとオーバーかも・・・。)

筆者が、以下に適当な考え方の例を示す。くどいようだが、各自で考えて欲しい。

  • フォームが表示される前に処理すべきこと。(『Private Sub Form1_Load()』というところにプログラムを書けば、フォームが表示されるまでに処理される。)
  1. ユーザが入力するテキストボックスや、変数を初期化する(コンピュータが用意する1〜100までの数もここで作っておく)
  2. ラベルなどに「1〜100までの数のうち、いくつでしょう」というメッセージを出しておく。
  • ユーザが入力ボタンを押したら、処理するべきこと。(いままでプログラムを置いていた場所『Private Sub Command1_Click()』というところにプログラムを書く)
  1. ユーザが入力したテキストボックスの数値と、コンピュータの用意した数が同じなら『正解!!お疲れ様でした』と表示し、プログラムを終了する。
  2. コンピュータの用意した数の方が大きければ、『もっと大きいですよ』と表示する。
  3. コンピュータの用意した数の方が小さければ、『もっと小さいですよ』と表示する。

この他にフォーム全体で変数が使えるように、フォームのプログラムシートの一番先頭に、変数を定義する。こうすると、このフォームに含まれるプログラムは、全て共通の変数が使えるようになる。(詳しくは後述する予定。)

細かい処理に凝れば、これだけでは済まなくなるわけだが、しかし、ループ処理のために学んだ「1〜100の整数の総和を求めるプログラム」と殆ど変わらないボリュームであることに気づくだろう。

ここで『コンピュータが用意する1〜100までの数』は以下のようにして用意する。とりあえず、実行して、x の値をテキストボックスに入れて確かめよう。毎回違った数が得られるはずだ。

    Randomize
    x = Int(Rnd(1) * 100 ) + 1

少し解説すると、『Rnd(1)』で0以上1未満のランダムな数値が得られる。それを100倍して、Int()関数で、小数点以下を切り捨てています。こうすると、0以上100未満(つまり0〜99)のランダムな整数が得られることになる。これに +1 して、1以上100未満の数を得るようにした。

ちなみに、その前のRandomizeは、ランダムシードと言われる値を、決定するステートメントだ。コレを行わないと、なんと『起動する度に同じ順序で乱数を発生する』という、かなり嘘っぽい乱数になってしまう。(笑)
まぁ、これはおまじないみたいなものだ。最初のフォームを起動するときに少なくとも1度だけ実行されれば良い。とりあえず書いておこう。


実際のコードや、細かいところは、明日の講座で解説することにしよう。

明日までに、自分なりに処理の方法を考えておこう。または、筆者の例が、実際にはどのようなコードになるのか想像してみるのも良いかもしれない。
とにかく自分でプログラムに対して向き合い、考えることが上達の近道だ。『慣れ』が必要だからである。頑張ろう!