実例で学ぶプログラミング 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
© Copyright 2024 ExpyDoc