誰でもプログラマ(WSH編)(その9- 何度だって挑戦)

前回は、計算機のプログラムを作りながら、バグとはどんなものかをみてきました。
今回は、ちょっとしたゲームを作ってみましょう。

毎度のことですがメモ帳でプログラムを記述します。今回のプログラムはだいぶ短いです。短いですがちょっと複雑な構造をしています。頑張って追いかけていきましょう。
以下のプログラムを入力してください。


Dim ans, tnum, count
Randomize
ans = CInt(100 * Rnd)
count = 0
Do
count = count + 1
tnum = InputBox("0から99までの数字を入力してください")
tnum = CInt( tnum)
If tnum < ans Then
MsgBox "もっと大きいです"
Else
If tnum > ans Then
MsgBox "もっと小さいです"
End If
End If
Loop Until tnum = ans
count = CStr( count)
MsgBox count+"回で正解しました"

間違いなく入力されたら、numhit.vbsというファイル名で保存しましょう。

このアプリケーションは、数あてゲームです。コンピュータが0から100までの適当な数を思い浮かべます。この数字をヒントを元に当てていきます。
実際に試してみましょう。
ダブルクリックして実行すると、
1-9-1
んじゃ、50と入力して、
1-9-2 
1-9-4
ほいほい。んじゃもっと小さい数ってことで、25なんてどうでしょう。
1-9-5 
1-9-4
もっと小さい数ですか。んじゃ12
1-9-6 
1-9-3
ほう。今度は小さすぎると。もちょっと大きく18
1-9-7 
1-9-4
んじゃ、15とか?
1-9-8 
1-9-3
むぅぅぅ。んじゃ16
1-9-9 
1-9-3
なるほど。なら、17ですな。
1-9-10 
1-9-11
7回で当たりました。
なかなか面白いじゃないですか。ちょっと熱くなります。ぜひとも、一撃で沈めてみたいものです。
もちろん、みなさんが試したときに、同じ結果になるとは限りません。コンピュータは毎回違う数字を思い浮かべますから。
プログラムを追いかける前に、何回か遊んでみてください。どんな動きをしてるんでしょうか。

では、どんな仕組みになっているのか見てみましょう。


Dim ans, tnum, count

今日は、anstnumcountという変数を使うようです。


Randomize

見慣れないものが出てきました。
このRandomizeは、これから適当な数字を思い浮かべる準備をしてくださいという意味です。準備をするだけです。これをやらないと毎回同じ数字を思い浮かべるようになります。

次の行はちょっと複雑です。


ans = CInt(100 * Rnd)

まず、Rndから。
これはコンピュータが適当な数字を0から1の間で思い浮かべます。0.1かもしれないし、0.7538かもしれないです。どんな数字がくるかわかりません。
0から1までの適当な数字に100を掛けています。ってぇことは、0.106だったら10.6になるし、0.7538だったら75.38になります。
CIntというのは関数です。これは、括弧の中のものを数字として扱います。そして、数字の小数点を切り捨てます。って意味です。ということは、10.6だったら10になります。75.38だったら、75になるわけです。
これで、0から100までの数字が適当に作られたわけです。
0から100までの適当な数字にansという表札が割り当てられます。
一行なのに奥が深いです。


count = 0

このcountというのは正解までの回数を表します。最初は0ですね。

次の行は


Do

となっていますが、これは、


Do
'だーっと処理がいっぱい
Loop Until tnum = ans

で組になります。
これは、繰り返し処理と呼ばれるものです。Do から、Loopまでの間を繰り返します。
今まで出てきたプログラムはすべて、上から下へ、処理が流れていました。途中、分岐することがあっても、常に上から下に流れていました。今日は、繰り返しの処理があるので、上から下に流れても、途中で上に戻って繰り返すようです。

詳しく見てみましょう。


Loop Until tnum = ans

この行を日本語に訳すと、
tnum とansになるまで、繰り返せ
ってことになります。
要するに、あたりになるまで繰り返しなさいということですね。ということは、当たらない限り、プログラムはぐるぐる繰り返すわけです。

なにを繰り返すんでしょう。


count = count + 1
tnum = InputBox("0から99までの数字を入力してください")
tnum = CInt( tnum)
If tnum < ans Then
MsgBox "もっと大きいです"
Else
If tnum > ans Then
MsgBox "もっと小さいです"
End If
End If

DoとLoopに囲まれているこの部分が繰り返されます。

では、繰り返される内容を詳しくみてみます。


count = count + 1

こりゃ、なんだ?いえいえ。冷静に考えてください。
まず、右側。count + 1 ってことは、今のcountの値に1を足したものが結果になります。
この結果に、countという表札を、再び貼り付けたわけです。
ということは、countという表札の中身の数字がひとつ増えたわけです。
これは、回数を数えるときによく出てくる技のひとつです。


tnum = InputBox("0から99までの数字を入力してください")

これは、既におなじみの形です。InputBox関数でユーザーに答えを入力させているわけですね。入力した数字に、tnumという表札が貼り付けられています。


tnum = CInt( tnum)

この行もさっきの回数を数えるときのやり方に似ています。
CIntという関数は、先ほど適当な数字を思い浮かべるときに出てきました。
括弧の中のものを数字として扱います。そして、数字の小数点を切り捨てます。
という意味でしたね。ということは、入力されたものが、なんであろうと、数字として取り出してください。ってことになります。この場合、こんにちはとかの文字を入力すると、0という値になります。


If tnum < ans Then
MsgBox "もっと大きいです"
Else
If tnum > ans Then
MsgBox "もっと小さいです"
End If
End If

これは見慣れた構成です。今まで、=だったのが、<とか>とかになっているだけです。


もし tnum < ans だったら
MsgBox "もっと大きいです"
んじゃなくて
もし tnum > ans だったら
MsgBox "もっと小さいです"

ってことになります。ここで、大きいか小さいかのヒントを表示しているわけですね。

そして、先ほど説明した、


Loop Until tnum = ans

にたどり着いて、答えと入力された数字とが同じになるまで、Doに戻ります。同じになったら、Doに戻るのをやめて、次に進みます。


count = CStr( count)
MsgBox count+"回で正解しました"

ここでも、新しい関数が出てきています。
CStrというのは、なんでも文字として扱いなさいって関数です。
ってことは、countには回数の数字が入っていますので、数字が文字として扱われます。
その文字に、再びcountという変数を割り当てているわけです。
最後に文字と文字(回で正解しましたってやつ)との足し算は、ただくっつけるだけ。
それをMsgBoxで表示しているわけです。

うーん。長かった。でも、一行一行丁寧に見ていけば、それほど複雑ではなさそうです。
ひとつひとつはシンプルなのに全体として、だいぶ混乱するようになってきました。
でも、まだ、ついていけそうです。
このようにプログラムは、分岐だけではなくて、繰り返しなどをすることにより、あっちいったりこっちいったりしながら、処理を進めていきます。
プログラマはこれをひとつひとつ追いかけて、確認していくわけです。
うーん、地味な作業だ。。。
こんな簡単な数当てゲームでさえ、こんなに複雑なんだから、ファミコンのゲームなんてどんなに複雑なんでしょう。。。
実際、ゲームの開発は、何ヶ月もかけて行われます。
もちろん、プログラムだけではなにをやっているのかわからなくなりますから、ちゃんと設計書を書いて作業します。どこでどんな処理をやってて、どこで繰り返しているのか、図で表したり、言葉で説明したりして、あとから見てもわかるようにしておきます。
そのように設計書を残しておかないと、1行1行ぜーんぶ追いかけていたら、とっても疲れてしまうからです。
プログラマは、プログラムを書く前にいろいろ想像をするという話を前回ちょびっとしましたが、この想像するときに、一緒に設計書を作るわけです。プログラムにしてしまうと、1行づつみながら想像することになって大変だからです。設計書を作って、設計書をみながら、いろいろ想像して、思いもよらない状況が発生しないように検討します。検討の結果によっては設計書に修正を加えたり、書き直したりします。
また、テストの段階で問題が見つかった場合、いきなりプログラムを修正したりせずに、一旦設計書を眺めて、どこが悪いのか、修正することによってどこに影響が出る可能性があるのかを検討したりします。
一般的に、プログラムを書く作業より、設計書を書く作業の方が時間がかかります。
設計書の時点で、丁寧に作業をしていないと、後が無茶苦茶になります。
実は、この設計書を書く人材が、コンピュータ業界では不足していると言われています。
設計書を書くには、コンピュータの知識だけでなく、さまざまな知識が要求されるからです。

プログラマって案外地味で、ちまちました仕事をしてるんですね。

今日のまとめ

  • 上から下に処理が流れるだけでなく、戻ったりするらしい。
  • 戻ると分岐よりも頭が混乱しやすい。
  • 設計書があると、プログラムが見やすくなるらしい。

「誰でもプログラマ(WSH編)(その9- 何度だって挑戦)」への3件のフィードバック

  1. Dim pinnti ,amisa
    MsgBox “クイズ”
    amisa = 12
    Do
    pinnti = InputBox (“1年は何か月??”)

    If pinnti = “12” Then
    ‘だーーーっと処理がいっぱい
    Else
    MsgBox “違います”
    End If

    Loop Until pinnti = amisa

    If hankei = “12” Then
    MsgBox “正解です”
    Else
    ‘だーーーっと処理がいっぱい
    End If

    ↑なんとなくしかわかっていないので少し変ですが
    上のプログラムを書いたら閉じられなくなりました
    強制的に終わらせるにはどうすればいいですか?
    あとアドバイス等下さったらありがたいです

    自分がしたいことは
    クイズを出す
    12時間と入力されたら正解と表示しておわる
    それ以外の事が入力されたら
    違いますと表示してまた入力画面へ戻る

    ということです!!
    お忙しい所すみません!!

    1. 実際に試してないので、あくまでも予想ですが。。。
      amisa = 12
      としているので、amisaは数値になっています。
      でも、入力されたpinntiは文字ですから、文字と数値を比較して、いつまでたっても一致していないのではないでしょうか?文字の12と数値の12を比較して、一致しないと言われているのでは?

      amisa = “12”
      として、文字列にしてしまうか、pinntiをCIntで数値にしてしまう必要があると思います。

コメントを残す