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に戻ってしまう。
・ フォントの色やサイズ、画面デザインが単調。
・ 点数や問題数などで、どれだけ問題を解いたか表示された方がよさそう。
次回はこの辺りの改善について考えてみる。