§13 シューティングゲーム(3)1 | プログラミング実習 |
ハイスコアを記録するプログラムを追加する。
ハイスコアはプログラムと同じフォルダにファイル名"hiscore.txt"で記録する。記録するハイスコアは5人分とする。
【1】 プログラムの流れ
「9.シューティングゲーム(2)」の実習で作成したゲームの大まかな流れは次の通りであった。
@ ゲーム開始の確認をメッセージボックスで行う。
A ゲームを開始する。時間制限を設ける。
B ゲーム終了後、再度ゲームをするかどうかの確認をメッセージボックスで行う。
流れの@で、メッセージボックスを表示している間、ゲームは停止しているので、その間だけフォームにハイスコアを表示することにする。
ハイスコアの処理の大まかな流れは次の通りである(☆印)。
☆1 ハイスコアのファイルを読み込む。
@ ゲーム開始の確認をメッセージボックスで行う。
☆2 ハイスコアを表示する。ゲーム開始前に非表示にする。
A ゲームを開始する。時間制限を設ける。
☆3 ゲーム終了後、順位を計算してハイスコアなら配列に記憶する。
B ゲーム終了後、 再度ゲームをするかどうかの確認をメッセージボックスで行う。
☆4 プログラムを終了する前に、ハイスコアをファイルに書き込む。
【2】 プログラム作成の準備
操作 1 「9.シューティングゲーム(2)」の実習で作成したプロジェクト「実習8シューティング」を開く。フォーム(Form1)のTextプロパティを「実習8シューティングC」に変更する。
【3】 ハイスコアの読み込みと表示
ハイスコアはテキストボックスに5人分を表示する。ハイスコアは得点の下に表示する。
操作 2 テキストボックスを配置し、プロパティを次のように設定する。
(Name) txtDisplay BorderStyle FixedSingle Font.Name MS ゴシック Font.Size 12 Location 578,45 Multiline True Size 200,120 Text HiScore
操作 3 ハイスコア5人分を記憶するため、得点は配列HScore、名前は配列HNameの宣言を追加する(下線部)。いろいろなメソッドで共通して使用できるようにグローバルで宣言する。
Public Class Form1
Dim StartTime As Double '開始時間
Dim HName(6) As String, HScore(6) As Integer 'ハイスコア用(5人分+作業用)
Const JIKAN As Double = 30 'ゲーム時間(秒)
操作 4 ファイル読み込みのプログラムをメソッドReadHiScoreとして作成する。ハイスコアは、名前、得点の順に5人分のデータが記録されているものとする。
Private Sub ReadHiScore()
Dim n As Integer
'カレントディレクトリをこのプログラムと同じフォルダにする。
IO.Directory.SetCurrentDirectory(My.Application.Info.DirectoryPath)
Try
'↓ファイル(読み込み用)を開く
Dim rf As New IO.StreamReader("hiscore.txt")
For n = 1 To 5
HName(n) = rf.ReadLine
'名前読み込み
HScore(n) = Val(rf.ReadLine)
'得点読み込み
Next
rf.Close()
'ファイルを閉じる
Catch ex As Exception
For n = 1 To 5
HName(n) = "NONE"
HScore(n) = 0
Next
End Try
End Sub
ハイスコアの記録形式 |
1位の名前 1位の得点 2位の名前 2位の得点 … |
ゲームを最初に実行したとき、ハイスコアのファイルはないので、ファイルを開こうとするとエラーになる。このとき、得点は0、名前はNONEが配列に記憶される。
操作 5 フォームのLoadイベントに対応するFome1_Loadメソッドに、ファイル読み込みのメソッドReadHiScoreの呼び出しを追加する(下線部)。
Private Sub Form1_Load(ByVal sender As System.Object, ByVal
e As System.EventArgs) Handles MyBase.Load
ReadHiScore() 'ハイスコア読み込み
GameInit()
'ゲーム初期化メソッド呼び出し
End Sub
ハイスコア表示用のテキストボックスが表示されるだけである。
○ ハイスコアの表示
操作 6 ハイスコアを表示するプログラムをメソッドDisplayHiScoreとして作成する。
Private Sub DisplayHiScore()
Dim n As Integer
txtDisplay.Visible = True 'テキストボックス表示
@→ txtDisplay.Text = "△△===== Hi Score =====" &
vbCrLf & vbCrLf
For n = 1 To 5
A→ txtDisplay.Text = txtDisplay.Text & Str(n) & "△"
B→ txtDisplay.Text = txtDisplay.Text & Microsoft.VisualBasic.Left(HName(n)
& "△△△△△△△△△△△△△△△", 15)
C→ txtDisplay.Text = txtDisplay.Text & Microsoft.VisualBasic.Right("00000"
& Trim(Str(HScore(n))), 5)
D→ txtDisplay.Text = txtDisplay.Text & vbCrLf
Next
txtDisplay.ReadOnly = True '書き込み禁止
End Sub
プログラム中の△は、半角の空白文字である。
@タイトル、A順位、B名前、C得点、D改行文字。
Aの名前は全体で15文字になるようにしている。Bの得点は全体で5文字になるようにしている。どちらも文字は半角文字である。
最後の「txtDisplay.ReadOnly」プロパティは、テキストボックス内のデータの編集禁止を設定するプロパティである。
操作 7 ゲーム開始確認のときにハイスコアを表示するので、ゲーム初期化のメソッドにプログラムを追加する(下線部)。
Private Sub GameInit()
<< 略 >>
'得点の初期化
Label1.Text = "00000"
'ハイスコア表示
DisplayHiScore()
'ゲーム開始確認
Me.Show()
MsgBox("ゲームを開始します。" & Now.Second)
txtDisplay.Visible = False 'ハイスコア非表示
Timer1.Enabled = True 'タイマー始動
StartTime = Microsoft.VisualBasic.DateAndTime.Timer
'開始時間記憶
End Sub
ハイスコアが表示される。ゲーム開始確認で[OK]ボタンをクリックするとハイスコア表示は消えてゲームが始まる。
§13 シューティングゲーム(3)1 | Copyright©2008 Hiroshi Masuda |