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