§13 シューティングゲーム(3)2 プログラミング実習
 back next 

【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(メッセージ )
 メッセージボックスのように、別ウィンドウにメッセージ が表示され、入力待ちになる。入力されたデータは変数 に記憶される。

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

 以上で、ハイスコア処理の追加は完了である。

 

 back next 
 §13 シューティングゲーム(3)2 Copyright©2008 Hiroshi Masuda 

 

 

inserted by FC2 system