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 

 

 

inserted by FC2 system