HSP3 ゲームのプログラミング
 ブロック・ゲーム制作 前へ 目次へ 

(7) ハイスコアー

 得点のベスト5を記録していき、情報表示領域に得点と名前を表示するようにする。
 ここで必要になる処理は次の通りである。
  ・ ハイスコアーの記録には、ノートパッドを利用する。
  ・ 高得点順に並べ替える処理が必要である。
  ・ 名前を入力するための工夫が必要である。


○ ハイスコアーの読み込み
 ハイスコアーを記録しておくファイルは「block.txt」とする。また、プログラム中でハイスコアーを格納しておく配列変数をscr、名前を格納しておく配列変数をnamaeとする。
 ノートパッドで読み込むとき、ファイルがない場合のことも考えてサブルーチン*hiscr_readを作成する。

 まず、サブルーチンの呼び出しは、次の位置に挿入し、一度だけ実行されるようにする。
 実行中は配列にデータが格納されているので再度読み込む必要はない。サブルーチンであるがgoto命令で呼び出している。gosub命令で呼び出していないのは、サブルーチンの中でonerror命令を使っており、エラーが発生したときreturn命令で正しく戻ってこれないためである。

    goto *hiscr_read    ;ハイスコアー読み込み
*restart

 ハイスコアー読み込みのサブルーチンは次の通りである。

01:
02:
03:
04:
05:
06:
07:
08:
09:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
;ハイスコアー読み込み -----
*hiscr_read
    onerror gosub *hserr    ;エラー処理
    dim scr, 5 : sdim namae, 5    ;ハイスコアー用配列
    hiscr = ""              ;メモリノートパッド用変数クリア(文字型にする)        
    notesel hiscr           ;メモリノートパッド設定
    noteload "block.txt"    ;メモリノートパッド読み込み
    foreach scr
        noteget sscr, cnt * 2            ;スコアー取り出し
        noteget namae(cnt), cnt * 2 + 1  ;名前取り出し
        scr(cnt) = int(sscr)             ;スコアーを整数に変換
    loop
    noteunsel        ;メモリノートパッド解放
    goto *restart    ;呼び出しの次行に戻る
*hserr
    if wparam = 12 {        ;ファイルがないエラー
        foreach scr
            noteadd "0"
            noteadd "none"
        loop
        return
    }
    dialog "エラーです。終了します。" + wparam + "/" + lparam, 1
    end

 ハイスコアー用ファイルblock.txtがあるときは、7行目でファイルを読み込みノートパッド用変数hiscrに格納され、8〜12行で配列にデータを取り出す。データは文字型なので9行目で得点(文字型)を取り出し、11行目で整数に変換している。
 ハイスコアー用ファイルblock.txtがないときは、7行目でエラーが発生し、15行目にジャンプする。17〜20行でノートパッド用変数hiscrに初期データを格納し、return命令でエラーの発生した次行(8行目)に戻り、ファイルがあるときと同じ処理を続けることになる。


○ ハイスコアーの書き込み
 ゲームオーバーになったとき、得点がハイスコアーの5番目より高ければハイスコアーに登録する。ハイスコアー書き込みの処理もサブルーチン*hiscr_writeとして作成する。

 サブルーチンの呼び出しは次の位置に挿入する。こちらも、サブルーチンであるがgoto命令で呼び出している。入力ボックスなどのオブジェクトを使用しており、プログラムをstop命令で停止しているためである。
 また、ハイスコアーの処理が終わった後、ハイスコアーを表示するため情報領域表示のサブルーチン呼び出しを追加している。

    if ball >= 0 {    ;残りボールあり
        gosub *joho        ;情報領域表示
        goto *start        ;ゲームスタート
    }
    goto *hiscr_write    ;ハイスコアー書き込み
*owari
    gosub *joho    ;情報領域表示
    dialog "もう一度しますか。", 2
    if stat = 6 : goto *restart
    end

 情報領域表示のサブルーチンでハイスコアーを表示するため処理を追加する。ball=-1のときにも、このサブルーチンが呼び出されるので残りボール表示はball>0の時だけするように判定文を追加している。

*joho
    redraw 0        ;仮描画
    color 0, 0, 128    ;青色
    boxf 60 * mm , 0   ;情報表示領域消去
    ;タイトル
    color 255, 128, 128
    pos 61 * mm, 0
    mes "ラケット・ゲーム"
    ;得点
    color 128, 192, 255
    pos 62 * mm, 3 * mm
    mes strf("得点 = %06d", tokuten)
    ;残りボール
    if ball > 0 {
        repeat ball
            pos (62 + cnt * 3) * mm, 56 * mm
            gcopy 1, 0, 0
        loop
    }
    ;ハイスコアー
    pos 61 * mm, 20 * mm
    mes "ハイスコアー"
    foreach scr
        mes strf("%06d ", scr(cnt)) + namae(cnt)
    loop
    redraw 1       ;実描画
    return

 ハイスコアー書き込みのサブルーチンは次の通りである。並べ替えについては「並べ替え(sort : ソート)」を参照すること。

01:
02:
03:
04:
05:
06:
07:
08:
09:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
;ハイスコアー書き込み -----
*hiscr_write
    hiscr = ""        ;メモリノートパッド用変数クリア
    notesel hiscr     ;メモリノートパッド設定
    last = length(scr) - 1    ;配列最後の添字
    if tokuten <= scr(last) : goto *owari    ;得点と5番目の比較            
    ;文字列入力ダイアログ
    screen 2, 200, 120, 8    ;ダイアログ用ウィンドウ
    dat = ""
    mes "名前を入力して下さい。"
    pos 25, 32
    input dat, 150    ;入力ボックス
    pos 65, 64
    button "OK", *ok  ;ボタン
    stop
*ok
    gsel 2, -1    ;ID2非表示
    gsel 0, 1     ;ID0アクティブ
    scr(last) = tokuten    ;得点を配列の最後に格納
    namae(last) = dat      ;名前を配列の最後に格納
    gosub *sort        ;ソート
    foreach scr        ;配列データをメモリノートパッドに追加
        noteadd str(scr(cnt))
        noteadd namae(cnt)
    loop
    notesave "block.txt"    ;メモリノートパッド保存
    noteunsel               ;メモリノートパッド解放
    goto *owari
*sort
    repeat length(scr) - 1
        d1 = cnt
        repeat length(scr) - (d1 + 1), d1 + 1
            if scr(d1) < scr(cnt){
                ww = scr(d1)       : sww = namae(d1)
                scr(d1) = scr(cnt) : namae(d1) = namae(cnt)
                scr(cnt) = ww      : namae(cnt) = sww
            }
        loop
    loop
    return

 6行目で5番目の得点と比較し、5番目以下であれば*owari(呼び出しの次行)へジャンプしている。
 8〜15行は名前を入力するためのウィンドウ(ダイアログ)を表示し、[OK]ボタンがクリックされるまで待つように、stop命令で停止している。[OK]ボタンがクリックされると*OKにジャンプする。
 17行で入力用のダイアログを消し、18行でゲームウィンドウをアクティブにしている。
 19, 20行で5番目に得点と名前を格納して、21行で並べ替えのサブルーチンを呼び出している。ここまでで、配列のデータが最新のハイスコアーのデータになっている。
 22〜25行で配列に格納されているハイスコアーのデータをノートパッド用変数hiscrに格納して、26行でファイルに保存している。



課題(block66.hsp)
 ハイスコアーの処理を追加する。


(リスト)新しいウィンドウで開く


 ブロック・ゲーム制作 前へ 目次へ 
2007 © Hiroshi Masuda

 

 

inserted by FC2 system