Last Update : 1999/10/10 20:44

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

引き続き『数当てゲーム』を作っていこう。

このゲームプログラムの基本的な要素をどのように組み立てていくか、考えておいて頂けたであろうか。

ボタンコントロールはCommand1、テキストボックスコントロールはText1、ラベルコントロールはLabel1として、以下のようなプログラムを組んでみた。

'変数の定義を強制するコマンド
Option Explicit

'このフォームのどのSubプロシージャでも使えるように、ここに定義しておく
Dim x As Long    'コンピュータが用意する数を記憶しておくための変数

Private Sub Command1_Click()
'ボタンが押されたら、コンピュータが用意している数とユーザが
'入力した数の大小関係を判断するサブプロシージャ。
'ボタンが押されたとき(クリックしたとき)に実行される。

If x = Text1 Then

    'もし同じなら・・・・
    Label1.Caption = "正解!!"
    MsgBox "正解っ!!" & vbCrLf & "お疲れ様でした", , "正解しました!"
    End

ElseIf x > Text1 Then

    'もしコンピュータの用意した数が大きければ・・・
    Label1.Caption = Text1 & "よりも大きいですよ"

Else

    'もしコンピュータの用意した数が大きければ・・・
    Label1.Caption = Text1 & "よりも小さいですよ"

End If


End Sub

Private Sub Form_Load()
'いろいろな初期化を行うためのサブプロシージャ
'フォームがLOAD時(メモリーに読み込まれた時)に自動的に実行される。

    '初期化
    Randomize
    x = Int(Rnd(1) * 100) + 1

    'メッセージ表示
    Label1.Caption = "1〜100までの数のうち、いくつでしょう。"
    Text1 = "0"
    Command1.Caption = "入力"

End Sub

実際のコードにすると、こんなものである。コメント(注釈)を多めに書いてあるので、実質的な量としては、これの半分程度だろうか。

さてここで、Private Sub Form_Load()Private Sub Command1_Click()の説明をしておこう。

VBでは、Subプロシージャと呼ばれる単位でプログラムを取り扱う。それぞれのプロシージャは、何か出来事(イベント)が起こったときに適宜呼び出され、実行されることになっており、例えばForm_Loadは、その名の通りフォームがメモリーにロードされた時に呼び出され実行される

他にもいろいろなイベントがある。フォームが終了するときに呼び出されるプロシージャはForm_Unload、Text1が変更されたときはText1_Change、Label1をダブルクリックしたときに呼び出されるプロシージャはLabel1_DblClick、・・・などだ。他にもたくさんの種類がある。

これは、フォーム・コントロールなどに、別々のイベントが用意されていて、それぞれに対応するプログラムを記述することが出来るという特徴がある。コレはイベントドリブン・プログラミングと呼ばれ、VB、VC++など多くのWindows系言語のプログラミング技法の基礎になる考え方なので、是非習得しておこう。

フォームや各コントロールには、具体的にどのようなイベントがあるのかを知りたければ、以下のようにして、調べると良いだろう。

コードを書くエディタの上部に、2つのコンボボックスがあるが、この左側がフォームまたはコントロールを選択するところ(オブジェクトリスト)で、右側がそのフォーム・コントロールが持つイベント一覧(プロシージャリスト)が出ている。イベントの説明は、そのイベント名のヘルプなどを見ながら、実際にコードを組んでみて、どのようなタイミングで実行されるのかを、いろいろと試して欲しい。

▲オブジェクトリスト ▲プロシージャリスト
太文字になっているところは、既にコードが書かれている事を示している。

学習のために作った数当てゲームだが、これを適当にコンパイルして、実際のEXEを作ってみよう。


プロジェクトのプロパティーがデフォルトの「Project1」となってしまっているので、これを変更しておこう。


『プロジェクト名(N)』を適当な名前に変更しよう。


そして、「ファイル」から『***.exeの作成』を選ぶと、上記の画面が表示され、生成されるEXEの名前を設定してOKボタンを押すと、指定されたフォルダに実行形式のファイルが出来るぞ。

この他の作業として、実際のプログラムをリリースするまでには、ユーザが入力したものが数字以外だった場合のチェック、範囲チェック(1〜100の中かどうか)、アイコン作成、ヘルプなどのドキュメントの用意・・・などが考えられるが、このような処理・作成方法は、そのうち学習することにしよう。とにかく、プログラムの基本的な考え方を身につけて欲しい。コレが出来るようになれば、他のことは「何が必要」で「何が危ない」のかを自然と嗅ぎ分けることが出来るようになってくるからである。

参考までに、ユーザによって入力されたものが正しいかどうかをチェックするプログラム例を以下に示しておこう。

Private Sub Text1_LostFocus()
'ユーザによって入力されたものをチェックするプロシージャ。
'LostFocusとは、このコントロールから他のコントロール
'を操作しようとしたときに、このイベントが発生する。
'(例えば、ユーザがこのテキストボックスに入力後、コマンドボタンを押したりしたときなど・・・)

If IsNumeric(Text1) = False Then

    'もしText1が数値では無いときは、メッセージを表示する。
    MsgBox "文字が入力されています。数値を入力してください。", vbCritical, "数値チェック"

    'すぐに、もう一度入力が出来るようにフォーカスをText1にセットしておく。
    'こうすると、ユーザがテキストボックスをマウスカーソルでクリックする手間が省ける。
    Text1.SetFocus

    'ついでに、Text1の文字列すべてを選択しておく。
    'こうすると、ユーザは、既に入力された文字を削除する手間が省略することが出来る。
    Text1.SelStart = 0
    Text1.SelLength = Len(Text1.Text)

    'この後の処理は行わないので、このサブプロシージャから抜ける
    Exit Sub

End If

'小数点以下を切り捨てておき整数化しておく。
Text1 = Int(Text1)

If Text1 < 1 Or Text1 > 100 Then

    'もしText1が範囲内に無いときは、メッセージを表示する。
    MsgBox "1100までの数値を入力してください。", vbCritical, "範囲チェック"

    Text1.SetFocus
    Text1.SelStart = 0
    Text1.SelLength = Len(Text1.Text)
    Exit Sub

End If
End Sub

見なれないプロパティーや関数が出てきているが、ヘルプなどを活用したり、自分で動作を確かめれば解るだろう。


さて、どうだろうか。量的には、この程度の作業で、ゲームが実現してしまうのだ。つまり、少ない作業で、希望のソフトが作れてしまうということである。VBが生産性に優れた言語だと言われている理由をと言うことを、体験して頂けたと思う。

あとは、プログラム独特(←これはVBに限ったことではないが・・・)の基本的な「作り方」「考え方」さえ身につけてしまえば、『こんなものがあれば便利だな』と思うようなツールが、自分の手で、しかも短時間に出来あがるのだ。プログラム作業そのものは、少ない時間で済んでしまうため、実質的な言語学習により多くの時間が費やせる。効率良く職業プログラマを目指すなら、VBはウッテツケなのである。

アルゴリズムなどを自分で1から創作するのは、初心者にはとても重たいことだが、他人の作ったプログラムを見て、どのように解決しているのか数多くの事例を見ていくことで、プログラム独特の考え方のコツが手っ取り早くつかめる。コツというものは、ひょんなコトから理解に達してしまうものなので、とにかく自分の手で(簡単なもので良いから)いろんなプログラム作ってみて、またはいろんなサンプルプログラムを目にして、プログラム技術を早く身につけて欲しいものである。