テスト用に、画面の左下にボタンを追加し、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