VisualBasic(脳トレ的アプリ002: コーディング試作)

■とりあえずコーディングしてみる。
前回考えた内容で動かせるよう、とりあえずコーディングしてみる。
Visual Studioのデザイン画面からボタンなどをダブルクリックすると、Form1.vbというファイルが自動的に開くので、それを修正していく。
問題を作ってテキストボックスやボタンに入れるメソッド(Set_Problem)を下のように作ってみた。

    Dim MAX_NUM = 9
    Dim ANSWER_MAX_NUM = 99
    Dim CODE_ARRAY = New String() {"*", "+", "-"}
    Dim answer_num_ = 0

    Private Sub Set_Problem()

        Dim num_1 As Integer
        Dim num_2 As Integer
        Dim code As Integer

        num_1 = Int((MAX_NUM * Rnd()) + 1)
        num_2 = Int((MAX_NUM * Rnd()) + 1)
        code = Int((CODE_ARRAY.length * Rnd()))

        Dim answer As Integer
        If CODE_ARRAY(code).Equals("*") Then
            answer = num_1 * num_2
        ElseIf CODE_ARRAY(code).Equals("+") Then
            answer = num_1 + num_2
        ElseIf CODE_ARRAY(code).Equals("-") Then
            answer = num_1 - num_2
        End If
        TextBox1.Text = num_1
        TextBox2.Text = num_2
        TextBox3.Text = CODE_ARRAY(code)


        Button1.Text = Int((ANSWER_MAX_NUM * Rnd()) + 1)
        Button2.Text = Int((ANSWER_MAX_NUM * Rnd()) + 1)
        Button3.Text = Int((ANSWER_MAX_NUM * Rnd()) + 1)
        Button4.Text = Int((ANSWER_MAX_NUM * Rnd()) + 1)
        Button5.Text = Int((ANSWER_MAX_NUM * Rnd()) + 1)
        Button6.Text = Int((ANSWER_MAX_NUM * Rnd()) + 1)
        Button7.Text = Int((ANSWER_MAX_NUM * Rnd()) + 1)
        Button8.Text = Int((ANSWER_MAX_NUM * Rnd()) + 1)
        Button9.Text = Int((ANSWER_MAX_NUM * Rnd()) + 1)

        answer_num_ = Int((MAX_NUM * Rnd()) + 1)

        If answer_num_ = 1 Then
            Button1.Text = answer
        ElseIf answer_num_ = 2 Then
            Button2.Text = answer
        ElseIf answer_num_ = 3 Then
            Button3.Text = answer
        ElseIf answer_num_ = 4 Then
            Button4.Text = answer
        ElseIf answer_num_ = 5 Then
            Button5.Text = answer
        ElseIf answer_num_ = 6 Then
            Button6.Text = answer
        ElseIf answer_num_ = 7 Then
            Button7.Text = answer
        ElseIf answer_num_ = 8 Then
            Button8.Text = answer
        ElseIf answer_num_ = 9 Then
            Button9.Text = answer
        End If
    End Sub

   

ここで、1から9の整数をランダムで取り出し、足したり(+)、引いたり(-)、掛けたり(*)する。どれにするかもランダムで決める。それぞれの値をテキストボックスに入れて、問題文は完成。回答部分のボタンについては、1から99までのランダムの整数を入れる。その後、ランダムで決めた正解のボタンに対して正解の整数を上書きする。
これを実行すると、下のような感じで数値が入る。

次に、時間の計測について、ツールボックスからTimerが使えそうだったので、これを追加。少し調べるとTimer1_Tickというメソッドを使用すると、Timerのプロパティで指定した時間ごとにメソッド内のコードを実行してくれるそう。下のコードを追加して、ProgressBarが時間ごとに増え最大まで行ったら、問題を更新し0に戻すようにした。

 Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
        ProgressBar1.PerformStep()
        If ProgressBar1.Value = ProgressBar1.Maximum Then
            Set_Problem()
            ProgressBar1.Value = 0
        End If

 End Sub

また、正解のボタンを押したときも同様に、問題を更新しProgressBarを0に戻すようにした。

動かしてみると、正解を押せば次の問題になり時間も0に戻るといったイメージした感じで動作する。何問か解いてみて、いくつか改善したいポイントを挙げる。
・ 不正解の選択をランダムで1~99で選ぶと、マイナスが正解の時、正解が目立つ。
・ 足し算だった場合、不正解の選択をランダムで1~99で選ぶと、大きな数に偏りがちになる。
・ 不正解の選択をランダムで1~99で選ぶと、正解と同じ数値が不正解のボタンに入る場合がある。
・ ProgressBarが最大になったときに処理すると、見た目上は最後までバーが進む前に0に戻ってしまう。
・ フォントの色やサイズ、画面デザインが単調。
・ 点数や問題数などで、どれだけ問題を解いたか表示された方がよさそう。

次回はこの辺りの改善について考えてみる。