VBAを用いて簡単なゲームを作ろう1

Download Report

Transcript VBAを用いて簡単なゲームを作ろう1

実例で学ぶプログラミング
VBAを用いて簡単なゲームを作ろう
徳山 豪
東北大学情報科学研究科
システム情報科学専攻
情報システム評価学分野
1
ゲームのプロットを作る
• 頭の体操
– 計算式もしくはクイズを表示する
– ユーザは回答を行う
– 正しく回答した数を競う
• バージョン1
– 計算: 表示した数の3倍を計算
• バージョン2
– 足し算、引き算、掛け算を計算
• あなたのバージョン??
2
アルゴリズムと流れ図を考える
ゲーム開始
タイムカウンタセット
問題提示
回答取り込み
正解かどうか
Yes
正解数を1増やす
タイムアップか
Yes
得点の表示をして終了
No
間違い表示
No
3
必要な機能を探そう
•
問題を生成する
– 3桁の数をランダムに生成する
– Rnd関数を利用します
•
問題の表示と回答の取り込み
– InputBoxで出来る
•
正解の判定と正誤表示
– If 文と MsgBoxで出来る
•
タイムカウンタの作成
– Timerという関数(オブジェクト)があります
4
乱数とタイムカウンタ
• Rnd
– 呼び出すごとに1未満0以上の実数(実際は16桁
の小数)をランダムに発生するオブジェクト
– プログラムの最初にRandomizeとおまじないを
書いておく必要がある
• Timer
– その日の午前0時から現在何秒たったかを示す
オブジェクト
5
整数をランダムに出そう
• 実数の整数部分を計算する関数(切捨て操作)
– Int()
– Int(4.356) = 4
• 1000未満の整数をランダムに出すには
– x = Int(Rnd*1000)
• 3未満だったら
– x = Int(Rnd* 3)
– x が0ならグー 1ならチョキ 2ならパー というよう
に使える
6
プログラムを読もう
Sub Game1( )
'
' Brain training1
'
Dim suuji As Integer '提示する問題
Dim answer As Integer '回答
Dim score As Integer '得点(正解数)
Dim mytime As Single 'タイムカウンタ、単精度小数型
'乱数を利用するためのおまじない
Randomize
MsgBox "頭の体操です。 表示する数の3倍をタイプしてください"
'スコアとタイマーのセット
score = 0
mytime = Timer
7
'制限時間になるまで操作を続ける
While Timer < mytime + 30
'問題の提示と回答のチェック、正解数のカウント
suuji = Int(Rnd * 1000)
answer = InputBox("問題:" & suuji & "の3倍は?")
If
answer = suuji * 3 Then
score = score + 1
Else
MsgBox "間違い"
End If
Wend
8
' 終了と得点の表示、講評つき
If
score > 20 Then
MsgBox "正解数" & score & "個。よく出来ました。"
ElseIf score > 10 Then
MsgBox "正解数" & score & "個。まあまあやね"
Else
MsgBox "正解数" & score & "個。頑張りましょう"
End If
End Sub
9
バージョン2
•
足し算、掛け算、引き算を計算させたい
–
–
–
–
•
乱数で第一変数を発生
乱数で第二変数を発生
乱数で演算を発生
引き算のときは、答えが負にならないように工
夫しよう。
20問出題して、正解数と、何秒で計算した
かを計りましょう。
10
問題の生成部分を変更
Dim x As Integer
Dim y As Integer
Dim enzan As Integer
Dim score As Integer
Dim answer As Integer
Dim mytime As Single
Dim count As Integer ’20問出すためのカウンタ
11
演算と2つの変数をランダムに生成
enzan = Int(Rnd * 3)
x = Int(Rnd * 8 + 2)
y = Int(Rnd * 8 + 2)
enzanが0なら足し算、1なら掛け算、2なら引き
算をさせましょう。 それについては次のページ
変数が0や1だとやさしすぎるので、2以上にしてあります
12
If enzan = 0 Then
answer = InputBox("問題:" & x & "+" & y & "= ?")
If answer = x + y Then score = score + 1
Else MsgBox "間違い"
End If
ElseIf enzan = 1 Then
answer = InputBox("問題:" & x & "*" & y & "= ?")
If answer = x * y Then score = score + 1
Else MsgBox "間違い"
End If
Else
answer = InputBox("問題:" & x + y & "-" & y & "= ?")
If answer = x Then score = score + 1
Else MsgBox "間違い"
End If
13
End If
For count = 1 To 20
enzan = Int(Rnd * 3)
hensu1 = Int(Rnd * 8 + 2)
hensu2 = Int(Rnd * 8 + 2)
If
enzan = 0 Then
answer = InputBox("問題:" & x & "+" & y & "= ?")
If answer = x + y Then score = score + 1
Else MsgBox "間違い"
End If
ElseIf enzan = 1 Then
answer = InputBox("問題:" & x & "*" & y & "= ?")
If answer = x * y Then score = score + 1
Else MsgBox "間違い"
End If
Else
answer = InputBox("問題:" & x + y & "-" & y & "= ?")
If answer = x Then score = score + 1
Else MsgBox "間違い"
End If
End If
Next count
mytime = Timer - mytime
MsgBox “正解数” & score & “個。” & “時間” & mytime & "秒" 14