HSP3 ゲームのプログラミング | |
レース・ゲーム制作 |
(3) ゲームらしく
このままでは、キャラクタが移動するだけでゲームらしくない(ゲームではない)。1着になるキャラクタを予想するゲームにしていく。
1着の番号を入力するのに入力ボックスのinput命令、レース開始にボタンのbutton命令を使う。持ち点は最初200点とする。
race05.hsp
ゲームらしくプログラムを追加していく。
;race05.hsp screen 0, 640, 480 randomize ;乱数初期化 ;配列宣言、データ初期化 char_max = 8 dim chx, char_max dim chy, char_max dim chj, char_max ;着順 tokuten = 200 ;得点初期化 pos 200, 220 ;座標指定 input yoso ;順位予想 button "スタート", *start ;ゲーム開始 *restart foreach chx chx(cnt) = 0 chy(cnt) = cnt ;コース loop juni = 1 ;順位 stop ;停止 *start repeat redraw 0 color 255, 255, 255 : boxf ;画面消去 color 0, 0, 0 pos 200, 200 ;座標指定 mes "得点=" + tokuten ;得点表示 ;コース描画 …
得点の初期化をして、入力ボックスとボタンを配置している。この後、これま通りのゲーム開始に必要な初期化をして、stop命令で停止する。スタートボタンをクリックするとラベル*startから処理が再開される。
;着順表示
color 255, 255, 255
boxf 0, 200
color 0, 0, 0
pos 50, 200
foreach chj
mes "" + (cnt + 1) + "着->" + chj(cnt) + "号車"
loop
if yoso = chj(0) {
tokuten += 50
} else {
tokuten -= 50
}
pos 200, 200
mes "得点=" + tokuten
dialog "もう一度しますか", 2
if stat = 6 : goto *restart
stop
実行すると、入力ボックスとスタートボタンだけが表示される。
着順を表示した後、予想が当たったがどうかを判定する。当たれば+50点、はずれれば-50点としている。1着はchj(0)に格納されている。以下、2着はchj(1)、3着はchj(2)というように順に格納されている。
ダイアログを出して、もう一度するかどうか確認している。再度ゲームするときは、ラベル*restartに処理が移動する。再度ゲームをしないときは終わりであるから最後のstop命令はend命令に変更しても良い。
ゲーム開始時の画面が余りにも寂しすぎる。
コースや得点だけでも表示するように、これらの表示部分をサブルーチンにして表示されるようにしたサンプルを次に示す。元のサンプルrace05.hspと比べてみよう。
race05b.hsp
;race05b.hsp screen 0, 640, 480 randomize ;乱数初期化 ;配列宣言、データ初期化 char_max = 8 dim chx, char_max dim chy, char_max dim chj, char_max ;着順 tokuten = 200 ;得点初期化 pos 200, 220 ;座標指定 input yoso ;順位予想 button "スタート", *start ;ゲーム開始 gosub *disp_haikei ;得点・コース描画 *restart foreach chx chx(cnt) = 0 chy(cnt) = cnt ;コース loop juni = 1 ;順位 stop ;停止 *start repeat redraw 0 gosub *disp_haikei ;得点・コース描画 ;キャラクタ移動・ゴール判定 foreach chx x = 600 - chx(cnt) * 5 - 20 ;x座標変換 y = chy(cnt) * 20 + 10 ;y座標変換 hsvcolor cnt * 23, 255, 255 circle x + 2, y + 2, x + 18, y + 18 ;キャラクタ描画 chx(cnt) += 1 + rnd(10) / 9 ;移動量加算 if chx(cnt) > 99 and chx(cnt) < 102 { ;ゴールした chj(juni - 1) = cnt + 1 ;順位格納 chx(cnt) = 102 juni += 1 ;順位加算 } loop redraw 1 if juni = 9 : break await 200 loop ;着順表示 color 255, 255, 255 boxf 0, 200 color 0, 0, 0 pos 50, 200 foreach chj mes "" + (cnt + 1) + "着->" + chj(cnt) + "号車" loop if yoso = chj(0) { tokuten += 50 } else { tokuten -= 50 } pos 200, 200 mes "得点=" + tokuten dialog "もう一度しますか", 2 if stat = 6 : goto *restart stop *disp_haikei color 255, 255, 255 : boxf ;画面消去 color 0, 0, 0 pos 200, 200 mes "得点=" + tokuten ;コース描画 repeat char_max + 1 y = cnt * 20 + 10 line 100, y, 600, y loop line 100, 10, 100, 170 line 600, 10, 600, 170 return
着順予想に1〜8以外の数字を入力してもエラーがでないので、その対策をする。
ゲームを続けていって得点がマイナスになってもゲームオーバーにならないので、その対策をする。
レースがスタートしてからでもスタートボタンをクリックすることができる。クリックするタイミングにもよるが、コース番号の小さいキャラクタに有利に働く。 → クリックするとラベル*startから処理が開始されるので、クリックするたびに1コースの移動量加算から始まるためである。
同じように、入力ボックスもいつでも入力できる。ゴール直前に予想を入れ直すことができる。
<対策> スタートボタンをクリックしたら、入力ボックスとボタンをclrobj命令で消去する。ゲーム再開時に入力ボックスとボタンを再度は位置するため、ラベル*restartを得点初期化の次の行に移動する。
レースゲームの基本的な処理の流れは理解できただろうか?単純なゲームなので、いろいろ工夫をする必要がある。例えば、次のようなことが考えられる。
・1着を複数予想できるようにする。
・1, 2(1, 2, 3)着を予想するようにする。
・予想に対して賭点を入力できるようにする。
・各キャラクタのオッズ(強さ)を表示する。(オッズによって移動量が変わるようにする。)
・コースを陸上競技のトラックのような形にする。
・コース制限をなくして移動できるようにする。
・キャラクタを車や舟などの画像に変更する。
・音を入れる。
レース・ゲーム制作 | |
2007 © Hiroshi Masuda |