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

 ハイスコアを記録するプログラムを追加する。
 ハイスコアはプログラムと同じフォルダにファイル名"hiscore.txt"で記録する。記録するハイスコアは5人分とする。

【1】 プログラムの流れ

 「9.シューティングゲーム(2)」の実習で作成したゲームの大まかな流れは次の通りであった。

  @ ゲーム開始の確認をメッセージボックスで行う。
  A ゲームを開始する。時間制限を設ける。
  B ゲーム終了後、再度ゲームをするかどうかの確認をメッセージボックスで行う。

 流れの@で、メッセージボックスを表示している間、ゲームは停止しているので、その間だけフォームにハイスコアを表示することにする。
 ハイスコアの処理の大まかな流れは次の通りである(☆印)。

  ☆1 ハイスコアのファイルを読み込む。
   @ ゲーム開始の確認をメッセージボックスで行う。
  ☆2 ハイスコアを表示する。ゲーム開始前に非表示にする。
   A ゲームを開始する。時間制限を設ける。
  ☆3 ゲーム終了後、順位を計算してハイスコアなら配列に記憶する。
   B ゲーム終了後、 再度ゲームをするかどうかの確認をメッセージボックスで行う。
  ☆4 プログラムを終了する前に、ハイスコアをファイルに書き込む。

 

【2】 プログラム作成の準備

操作 1 「9.シューティングゲーム(2)」の実習で作成したプロジェクト「実習8シューティング」を開く。フォーム(Form1)のTextプロパティを「実習8シューティング」に変更する。

 

【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]ボタンをクリックするとハイスコア表示は消えてゲームが始まる。


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

 

 

inserted by FC2 system