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

前回は、数あてゲームという、簡単なゲームを作ってみました。
簡単なゲームではありますが、結構熱くなった人もいるのではないでしょうか。

さて、前回のプログラムを公開したところ、以下のようなコメントを頂きました。

キャンセルできないんですけど….

ごもっともな意見ですね。実際にやってみて、誰もが感じたことではないでしょうか?
では、このリクエストに答えて、キャンセルできるようにしてみましょう。

キャンセルできる。ってどうゆうことでしょうか。
1-9-1
ここで予想した数字を入力するわけですが、ここには「キャンセル」というボタンがあります。
いつもは「OK」ばかり押していましたが、ギブアップしたいときなどに「キャンセル」ボタンを押したのではないでしょうか?
でもここでキャンセルを押しても、
1-9-3
といわれて、有無を言わさず続けられてしまいました。
ごめんなさい。許してください。って気持ちになっちゃいます。
「キャンセル」を押したら、「20回でギブアップしました。」なんて言ってくれて、終了してくれたらよさそうです。
そのように改良してみましょう。
どのあたりを修正したらいいか、想像がつきますか?

そうですね。


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

で、質問のダイアログを出しているわけですが、ここでキャンセルを押したら、「20回でギブアップしました。」とダイアログを出して、終了すればいいわけです。

マイクロソフトのサイトにある、ヘルプの中のInputBox関数に関する説明の部分を見てみます。ここを見ると、

解説
引数 helpfile および引数 context を指定すると、ダイアログ ボックスに自動的に [ヘルプ] ボタンが追加されます。

[OK] をクリックするか、または Enter キーを押すと、InputBox 関数はテキスト ボックスの内容を返します。[キャンセル] をクリックすると、InputBox 関数は長さ 0 の文字列 (“”) を返します。

ほうほう。InputBox関数は「キャンセル」をクリックすると、長さ0の文字列(“”)を返すようです。

ということは、tnumが””かどうか調べたらいいわけです。


If tnum = "" Then
'なんちゃら
End If

てな感じになるのでしょう。

ギブアップのメッセージは、前回の「20回で正解しました」とほぼ同じです。
「20回で正解しました」は、


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

でしたから、


count = CStr( count)
MsgBox count+"回でギブアップしました"

になるわけです。

終了するには、WScript.Quitです。

それでは今回のプログラムです。


Dim ans, tnum, count
Randomize
ans = CInt(100 * Rnd)
count = 0
Do
count = count + 1
tnum = InputBox("0から99までの数字を入力してください")
If tnum = "" Then
count = CStr( count)
MsgBox count+"回でギブアップしました"
WScript.Quit
End If
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+"回で正解しました"

前回のプログラムを上のように修正してみてください。
どの部分がどのように変更されたのかをじっくり見ると良いでしょう。
修正した結果はこちらからダウンロードできます。
実際に試してみましょう。

ちゃんとギブアップできますか?
これで睡眠不足が解消されそうです。

実際の開発でも似たようなことがよく発生します。
プログラムを開発した後に、通常テストを行います。
テストというのは、設計したとおりにプログラムが動いているか確認する作業です。必要な機能が正しく動くのかどうか確認するわけです。
この「設計したとおり」というが曲者でして、設計のときにそんなこと考えもしなかった。ってなことがたまに(よく?)あります。
また実際に使ってみることにより、より明確に「こうしたらもっとよくなるな。」とか「こうしたら、もっと使いやすくなるな」ということが見つかったりします。
それがテストのときに見つかることもありますし、お客様が実際に使っているときに、新たな要望として出てくることもあります。
これらのリクエストに順次答えるために、一旦作ったプログラムをどんどん修正していくわけです。
実際、開発と呼ばれる作業は、ほとんどがこの修正作業です。
新しくプログラムを書くという作業はとっても少ないんです。
一旦作り上げたプログラムを、機能追加したり、問題を修正したりすることで、よりよいプログラムに仕上げていくのが、プログラマの仕事です。

前回、設計書についてお話しました。
もちろん実際にプログラムを修正する際は、いきなりプログラムを修正するわけではありません。
まず、設計書を確認します。設計書のどの部分に問題があったのか、どの部分が足りなかったのか。設計書を修正して確認するわけです。
優秀な設計者は、未来に発生するであろうこのような修正に対して、最初に設計する時点から考慮しています。
将来発生するであろうことがらを想像して、それらのことをすべて設計書に記述できれば、ベストですが、それはとても難しいことです。ですから、想像できないことに対しても、柔軟に対処できるような設計を作っておくわけです。
想像できないことを想像するってとっても難しいです。

今日のまとめ

  • プログラムは作成するよりも修正することの方が多い。
  • リクエストやコメントがあると修正しなきゃだめだから面倒だけど、まったくリクエストやコメントが無いと、それはそれで寂しい。
  • 想像できないことを想像しておくって、哲学みたい。

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

  1. Option Explicit
    On Error Resume Next

    Dim objWshShell ‘ WshShell オブジェクト
    Dim strCmdLine ‘ 実行するコマンド

    Set objWshShell = WScript.CreateObject(“WScript.Shell”)
    If Err.Number = 0 Then
    strCmdLine = “notepad.exe”
    objWshShell.Exec(strCmdLine)
    If Err.Number = 0 Then
    WScript.Echo strCmdLine & ” を起動しました。”
    Else
    WScript.Echo “エラー: ” & Err.Description
    End If
    Else
    WScript.Echo “エラー: ” & Err.Description
    End If

    Set objWshShell = Nothing

    このプログラム、ネットで見つけたのですがよく分からないことがあります。
    詳しく解説してくれませんか。
    ちなみに、実行するとメモ帳が開きます。

    1. なかなか難問ですな。
      僕のWSHの解説は本当にプログラマの体験ができるように書いているので、実際に使えるプログラムの解説ってしてないんですね。僕も使えるプログラムをWSHで書いたことが無いですし。
      このプログラムで鍵となるのは、2つ。

      Set objWshShell = WScript.CreateObject(“WScript.Shell”);
      Shellオブジェクトを作成します。

      objWshShell.Exec(strCmdLine);
      Execメソッドを呼び出して、アプリケーションを実行します。Exec メソッド

      あとは、WScript.Echo(Echo メソッドで標準出力にエラー内容を出力するとか、Errオブジェクトでエラー内容を取得するとか、そんなところでしょうか。
      ざっくり、Windows Script Hostの内容を一読することをお勧めします。

      ただ、個人的な意見ですが、MicrosoftはWindows Script Hostよりも、Windows PowerShellを薦めています。これから学ぶのであれば、Windows Script Hostの方をお勧めします。

      僕のWSHの記事は2004年のものですし。。。

  2. 組み合わせて・・・

    Dim ans, tnum, count
    Randomize
    ans = CInt(100 * Rnd)
    count = 0
    Do
    count = count + 1
    tnum = InputBox(“0から99までの数字を入力してください”)
    If tnum = “” Then
    count = CStr( count)
    MsgBox count+”回でギブアップしました”
    msgbox”ギブアップするなら最初からやるな!”
    WScript.Quit
    End If
    tnum = CInt( tnum)
    If tnum ans Then
    MsgBox “もっと小さいです”
    End If
    End If
    Loop Until tnum = ans
    count = CStr( count)
    MsgBox count+”回で正解しました”
    if count 14 then
    msgbox(“ふざけてやってただろ!!”)
    else
    msgbox(“本気出してやればもっといける!”)
    end if
    end if

    判定機能をつけましたw

  3. ↑すみません、きちんとなっていませんでした。
    不等号が入っていなかったり、行が抜けていたりしています。
    これはコピペして使わないでください。
    できるなら、いつかちゃんとしたプログラムを書きたいと思っています。
    m(_ _)mすみませんでした。

  4. 本当にすみませんでした。
    意味としては
    「countの数値と、「回で正解しました」を表示
    もしcountが7以下ならば、「運を信じて頑張ったな!!」と表示
    でなければ、
     もしcountが18よりも大きければ、「ふざけてやってただろ!!」と表示
     でなければ、
     「本気出してやればもっといける!」と表示
     end if
    end if                                          」
    ということです。

  5. msgboxが開いているときに、×を押しても閉じずに、OKと同じ処理になってしまいます。msgboxを閉じる方法を知っている方は教えてほしいです。お願い致します。

コメントを残す