プログラミング入門

実践プログラミング入門2
配列を使ってゲームを作ろう
徳山 豪
東北大学情報科学研究科
システム情報科学専攻
情報システム評価学分野
1
データの貯蔵と利用
•
カードめくりゲーム
–
–
–
–
カードを20枚配置してユーザが2枚づつめくる
同じカードなら当り。
あたった札にある数はユーザの取り分になる
20枚のカードをあらかじめ配置しておかないと
いけない
•
データの貯蔵の仕組みが必要
2
配列によるデータの貯蔵
•
•
•
配列: データの列
card(0)=5, card(1)=3, card(2)=5 などなど
Dim card(20) As Integer
– 整数20個が入る配列の定義
– card(0)からcard(19)までです
• 例えば
For i=0 to 19
card(i) = i *i
Next i
3
エクセルの表を使ったデータの貯蔵
• エクセルの表の10列目に果物の名前を
たくさんタイプしておく
• エクセルの表の11列目にその名前を逆順に
タイプしておく
• ゲーム: 果物の名前をランダムな順に表
示してユーザに逆順にタイプさせる
4
カードめくりゲームのプログラム
Sub パネルアタック1()
Dim card(20) As Integer ‘カードのための配列
Dim Check(20) As Boolean ‘ 重複チェック用配列
Dim mytime As Double
Dim i As Integer
Dim j As Integer
Dim a As integer
Dim x As Integer
Dim y As Integer
Dim row(2) As Integer
Dim col(2) As Integer
Dim score As Integer
‘得点
Dim fullscore As Integer ‘ 満点
5
数字の組を10個生成する
For i = 0 To 19
Do
a = Int(Rnd() * 20)
'重複のチェック。重複したらaを引きなおす
Loop Until Check(a) = False
' カードの表。aが2か3なら200というように
card(i) = (1 + Int(a / 2)) * 100
Check(a) = True
Next i
6
Do Loop 構文1
mytime = Timer
Do
xxxxxxxx
Loop until Timer > mytime + 100
100秒たつまである操作xxxxxxxをする
7
Do Loop 構文2
mytime = Timer
Do
xxxxxxxx
Loop while Timer < mytime + 100
100秒たつまである操作xxxxxxxをする
8
初期画面の設定
' タイムカウンタの表示
Cells(7, 2) = "残り時間"
Cells(7, 3) = 100
Cells(7, 4) = "秒です"
‘ 0から19までカードの裏に番号をつける
‘
For i = 1 To 5
For j = 1 To 4
Cells(i, j) = 4 * (i - 1) + j
Next j
Next i
9
ゲーム開始
MsgBox "パネルアタック20、がっちり当てましょう"
MsgBox "同じ値段のペアを見つけてください。100秒間
にいくら儲けられるかな"
score = 0
mytime = Timer
‘満点は5500点です
fullscore = 5500
10
最初のカードをめくる
While (Timer < mytime + 100) And (score < fullscore)
‘位置(5000,100)に入力窓を出す
x = InputBox(“パネル番号を指定してください”, 入力1, , 5000, 100)
'パネルの場所を探す
row(1) = Int(x / 4) + 1
col(1) = x - 4 * (row(1) – 1) + 1
'xに対応するカードを表示する
Cells(row(1), col(1)) = card(x)
11
二枚目のカードをめくる
y = InputBox("もう一つ番号を指定してください", 入力2, , 5000, 100)
row(2) = Int(y / 4) + 1
col(2) = y - 4 * (row(2) – 1) + 1
Cells(row(2), col(2)) = card(y)
'カードが一致したらスコアに加えて表示
If Cells(row(1), col(1)) = Cells(row(2), col(2)) Then
score = score + card(x)
MsgBox "Bingo" & card(x) & "ドル獲得です。"
' あけたカードの価値は0にする
card(x) = 0
card(y) = 0
12
裏返しと残り時間表示
Else
‘カードが違えばもう一度裏返し
MsgBox "残念"
Cells(row(1), col(1)) = x
Cells(row(2), col(2)) = y
End If
Cells(7, 3) = 100 + mytime - Timer
Wend
MsgBox "Score = " & score
MsgBox "Game Over"
Range(“A1:D4”).ClearContents
‘画面クリアのオブジェクト
End Sub
13