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 |