HSP3 ゲームのプログラミング
 迷路・ゲーム制作 前へ 目次へ 

(3) 経過時間表示

 時間をかければアイテムをすべて取ってゴールすることができる。時間か移動回数など何か制限が必要である。ここでは、時間制限を設けることにする。まず、経過時間を表示する処理を追加する。

サンプル(maze16.hsp)
 経過時間を表示する。

;maze16.hsp
<< 省略 >>
    px = 1 : py = 1         ;スタート座標
    px1 = 1 : py1 = 1       ;足跡格納用
    ;ゲームメイン
    tt1 = gettime(4) * 3600 + gettime(5) * 60 + gettime(6)  ;開始時間
    repeat
        ;足跡消去
        color 255, 255, 255
        boxf px1 * bsize + 1, py1 * bsize + 1, px1 * bsize + bsize - 1, py1 * bsize + bsize - 1
        ;キー入力
        stick kk, 15
        if kk = 1 & maze(px - 1, py) = 0 : px--     ;左(西)
        if kk = 2 & maze(px, py - 1) = 0 : py--     ;上(北) 
        if kk = 4 & maze(px + 1, py) = 0 : px++     ;右(東)
        if kk = 8 & maze(px, py + 1) = 0 : py++     ;下(南)
        if kk = 128 : end       ;[Esc]
        ;アイテムチェック
        foreach ptx
            if ptx(cnt) = px & pty(cnt) = py {      ;座標チェック
                tokuten += 100      ;得点加算
                gosub *tokuten_disp         ;得点表示
                ptx(cnt) = 0 : pty(cnt) = 0         ;アイテム座標消去
                break
            }
        loop
        ;プレイヤー表示
        color 255, 0, 0
        circle px * bsize + 1, py * bsize + 1, px * bsize + bsize, py * bsize + bsize
        px1 = px : py1 = py         ;一つ前
        if px = bx - 2 & py = by - 2 {  ;ゴール確認
            wa = 0  ;合計用
            foreach ptx
                wa += ptx(cnt)  ;x座標の合計
            loop
            if wa = 0 : break       ;ゴールOK
        }
        tt2 = gettime(4) * 3600 + gettime(5) * 60 + gettime(6) - tt1    ;経過時間計算
        gosub *jikan_disp       ;経過時間表示
        await 100
    loop
    dialog "もう一度しますか。", 2, "迷路・ゲーム"
    if stat = 6 :goto *start
    stop
;経過時間表示 -----
*jikan_disp
    ty = 100
    color 200, 200, 255
    boxf winx1 + 1, ty, winx1 + 150, ty + 20
    color 0, 0, 0
    pos  winx1 + 5, ty : mes strf("経過時間:%04d", tt2)
    return
;得点表示 -----
*tokuten_disp
<< 省略 >>
    return
;迷路作成(棒倒し法) -----
*maze_make
<< 省略 >>
    return

 時間の情報を取り出すにはgettime関数を利用する。引数が4で現在の時間、5で現在の分、6で現在の秒のデータが得られる。変数tt1には開始時間の午前0時からの秒数、変数tt2にはゲーム開始からの秒数が格納される。



課題(maze66.hsp)
 ゲーム開始から180秒でゲームオーバーになるようにする。

ヒント
・経過時間表示の呼び出し(gosub *jikan_disp)の後、変数tt2を調べる。
        if tt2 >= 180 : wa = -1 : break    ;180秒超え、GameOver
 wa=-1としているのは、ゴールしたとき(コメント「ゴールOK」)、アイテムをすべて取っているのでwa=0でループを抜け出すので、同じ変数waを使って別の値(ここでは-1)を格納してからbreak命令でループを抜け出すようにしている。したがって、ゲーム再開の確認部分も次のように変更する必要がある。
    if wa = 0 {
        dialog "もう一度しますか。", 2, "迷路・ゲーム"
        if stat = 6 : goto *start
    }
    if wa = -1 {
        dialog "ゲームオーバーです。もう一度しますか。", 2, "迷路・ゲーム"
        if stat = 6 : tokuten = 0 : goto *start
    }


(リスト)



課題(maze67.hsp)
 ゴールしたとき、残り時間(秒)の10倍を得点に加算する。また、1マス進むごとに1ずつ減点していく。

ヒント
・残り時間は、180秒から経過時間(秒)を減算すれば求まる。
・移動は「キー入力」で処理している。次のように処理する。
   if kk = 1 & maze(px - 1, py) = 0 : px-- : tokuten -= 1 : gosub *tokuten_disp     ;左(西)


(リスト)



◎ その他

 迷路・ゲームの制作は一応終了とするが、いろいろなルールを考えて、追加してみよう。

 ・アイテムと同じように「障害」を配置して、この「障害」を通過すると100点減点にする。
  「障害」を通過するとその「障害」は → 消える。 → 消えない。

 ・移動する「障害」を配置する。移動する「障害」は迷路探索の処理を使い、自身をスタート、プレイヤーをゴールとして探索する。


 迷路・ゲーム制作 前へ 目次へ 
2007 © Hiroshi Masuda 

 

 

inserted by FC2 system