カテゴリー
Visual Basic

ハイスコアを保存する

テスト用に、画面の左下にボタンを追加し、Textプロパティを「スコア保存」に設定します。Nameプロパティを「SaveScore」に変更しておきます。

プログラムの先頭にハイスコアを保存するためのファイル名を表すSCORE_FILE定数とhighscore変数を追加します。

Public Class Form1
    Const SCORE_FILE = "score.txt"
    :
    Dim score, highscore As Integer
    :

ボタンをダブルクリックしてイベントプロシージャを作成します。

    Private Sub SaveScore_Click(sender As Object, e As EventArgs) Handles SaveScore.Click
        Save()
    End Sub

    Public Sub Save()
        'スコアをファイルに保存する
        My.Computer.FileSystem.WriteAllText(SCORE_FILE, highscore, False)
    End Sub

アプリを起動して「スコア保存」ボタンをクリックすると、プロジェクトのフォルダ内に「score.txt」ファイルが生成されています。

アプリを起動したときに「score.txt」を読み込んで、ハイスコアを表示するように変更してみます。

フォームのスコアの左側にハイスコアを表示するためのLabelを追加します。

Form_Load内で「score.txt」ファイルを読み込んで、ハイスコアを表示します。

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    :
        'ハイスコアをファイルから参照する
        If IO.File.Exists(SCORE_FILE) Then
            Dim s As String
            s = My.Computer.FileSystem.ReadAllText(SCORE_FILE)
            highscore = Val(s)
        End If
        HighScoreLabel.Text = "ハイスコア: " & highscore
    End Sub

ハイスコアを保存するところと表示するところはできました。

次は、ゲームを開始してゲームオーバーになった時点で、ハイスコアよりも高いスコアだった時に、そのスコアをファイルに書き込むようにします。

タイマーイベント内でゲームオーバーのメッセージを表示している個所に追加します。

    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
        HitWall()
        HitRacket()
        HitBricks()
        If CountBricks() = 0 Then
            Timer1.Enabled = False
            MsgBox("クリアしました!")
        End If
        If y > Racket.Top + Racket.Height Then
            Timer1.Enabled = False
            MsgBox("ゲームオーバー")
        End If
        x = x + dx
        y = y + dy
        Ball.Left = x
        Ball.Top = y
        ScoreLabel.Text = "スコア: " & score
    End Sub

ゲームオーバーになったときにスコアがこれまでのハイスコアよりも大きかったら、ハイスコアを更新したことをメッセージを表示して、ファイルを更新します。

    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
        HitWall()
        HitRacket()
        HitBricks()
        If CountBricks() = 0 Then
            Timer1.Enabled = False
            MsgBox("クリアしました!")
        End If
        If y > Racket.Top + Racket.Height Then
            Timer1.Enabled = False
            MsgBox("ゲームオーバー")
            If score > highscore Then
                MsgBox("ハイスコアを更新しました!!!!!!!")
                highscore = score
                Save()
            End If
        End If
        x = x + dx
        y = y + dy
        Ball.Left = x
        Ball.Top = y
        ScoreLabel.Text = "スコア: " & score
    End Sub