§13 シューティングゲーム(3)2 | プログラミング実習 |
【4】 ハイスコアの処理(順位・ソート・保存)
ゲームが終了したとき、得点がハイスコアなら配列に記憶する。また、プログラムを終了する前にハイスコアをファイルに書き込む。
@ 得点がハイスコアかどうか、得点の順位を計算して判定する。
A ハイスコアを得点順に並べ替える(ソートする)。→メソッドSortHiScoreとして作成する。
B ハイスコアを保存する。→メソッドSaveHiScoreとして作成する。
○ 得点の順位計算
順位の計算は、自分より高い点数がいくつあるかをカウントすればよい。順位が5位以内であれば、ハイスコアのデータとして配列に記憶する。
操作 8 ゲーム再開確認の前に、順位計算などのプログラムを追加する(下線部)。
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal
e As System.EventArgs) Handles Timer1.Tick
Dim tokuten As String, yesno As MsgBoxResult
Dim n As Integer, juni As Integer
'UFOの移動
<< 略 >>
'終了確認
If StartTime + JIKAN < Microsoft.VisualBasic.DateAndTime.Timer
Then
Timer1.Enabled = False
'タイマー停止
'順位計算
juni = 1
For n = 1 To 5
If Val(Label1.Text) < HScore(n) Then '得点比較
juni = juni + 1 '順位加算
End If
Next
If juni <= 5 Then '5位以内
HScore(6) = Val(Label1.Text)
HName(6) = InputBox("おめでとうございます。第" & Str(juni) & "位です。" & vbCrLf & "名前を半角文字(14文字以内)で入力してください。")
SortHiScore() 'ハイスコア並べ替え呼び出し
End If
'再開確認
yesno = MsgBox("もう一度しますか。",
MsgBoxStyle.YesNo)
If yesno = MsgBoxResult.Yes Then
GameInit()
'再開
Else
SaveHiScore() 'ハイスコア保存呼び出し
Me.Close()
'終了
End If
End If
End Sub
メソッドSortHiScoreとSaveHiScoreは、まだ作成していないのでエラーになる。
得点の順位が5位以内のとき、名前と得点を配列の6番目に記憶している。これば、次のSortHiScoreメソッドでソートするために配列に記憶しておく必要がある。しかし、配列の1〜5番にはハイスコアのデータが記憶されているので、とりあえず6番目に記憶しておいてソートする。
変数 = InputBox(メッセージ ) メッセージボックスのように、別ウィンドウにメッセージ が表示され、入力待ちになる。入力されたデータは変数 に記憶される。
○ ハイスコアのソート
ソートのアルゴリズムには、直接選択法、単純選択法、バブルソート法、単純挿入法など、いろいろなものがあるが、データ数が少ないのでどれを使っても処理スピードに大きな差はない。ここでは、「直接選択法」を使って並べ替える。
直接選択法は、図(a)のように1番目のデータと残りのデータを比較する。1番目の50より大きいデータがないので、1番目は確定である。次に、図(b)のように2番目のデータと残りのデータを比較する。6番目のデータの方が大きいので2番目と入れ替え、図(c)のようになる。同じようにして、データの比較と入れ替えをしていく。
データの入れ替えは、余分に変数を用意して下図のようにする。
Aのバケツに赤色の水が、Bのバケツに青色の水が入っている。この水を入れ替えることをイメージすればよい。
操作 9 ハイスコアソートのプログラムをメソッドSortHiScoreとして作成する。
Private Sub SortHiScore()
Dim x As Integer, p As Integer
Dim w1 As Integer, w2 As String
For x = 1 To 5
For p = x + 1 To 6
If HScore(x) <
HScore(p) Then
w1
= HScore(x) '得点の入れ替え
HScore(x)
= HScore(p)
HScore(p)
= w1
w2
= HName(x) '名前の入れ替え
HName(x)
= HName(p)
HName(p)
= w2
End If
Next
Next
End Sub
○ ハイスコアの保存
ファイルには、1位の名前、得点、2位の名前、得点…の順に書き込む。
操作 10 ファイル書き込みのプログラムをメソッドSaveHiScoreとして作成する。
Private Sub SaveHiScore()
Dim n As Integer
Try
'↓ファイル(書き込み用)を開く
Dim wf As New IO.StreamWriter("hiscore.txt")
For n = 1 To 5
wf.WriteLine(HName(n))
'名前書き込み
wf.WriteLine(HScore(n))
'得点書き込み
Next
wf.Close() 'ファイルを閉じる
Catch ex As Exception
MsgBox("ハイスコアをファイルに書き込めませんでした。")
End Try
End Sub
以上で、ハイスコア処理の追加は完了である。
§13 シューティングゲーム(3)2 | Copyright©2008 Hiroshi Masuda |