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