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

 迷路にアイテムを表示して、アイテムを取りながらゴールへ進むゲームを作成する。

(1) 迷路とアイテム表示

 アイテムは緑色(0, 255,0)の四角形で表し、迷路上に10個配置する。1個当たり100点とする。

サンプル(maze15.hsp)
 迷路とアイテムを表示する。

 迷路の壁のサイズは16×16ドットとし、迷路のサイズは39×39マス目とする。スタートはマス目座標(1,1)、ゴールはマス目座標(37,37)で、ゴールにはアイテムを表示する。

;maze15.hsp
#define bsize 16        ;ブロックサイズ(正方形)
#define bx 39           ;迷路のサイズ(マス目単位)
#define by 39
#define winx1 bx * bsize    ;ウィンドウサイズ
#define winy1 by * bsize
    dim maze, bx, by        ;迷路データ 0:道、1:壁
    dim ptx, 10 : dim pty, 10           ;アイテム用
    randomize
    screen 0, winx1 + 150, winy1    ;メインウィンドウ
    title "迷路・ゲーム"
    font "MS Pゴシック", 18, 3
    tokuten = 0         ;得点初期化
*start
    color 200, 200, 255 : boxf          ;ウィンドウ消去
    color 50, 50, 255
    pos winx1 + 15, 5 : mes "迷路・ゲーム"        ;タイトル表示
    gosub *tokuten_disp         ;得点表示
    gosub *maze_make            ;迷路作成
    ;アイテム座標決定
    foreach ptx
        p = cnt
        repeat
            ptx(p) = rnd(bx)    ;乱数で座標決定
            pty(p) = rnd(by)
            if maze(ptx(p), pty(p)) = 0 : break    ;道ならOK
        loop
    loop
    ptx(0) = bx - 2 : pty(0) = by - 2       ;ゴールにアイテム配置
    ;アイテム表示
    foreach ptx
        color 0, 255, 0
        boxf ptx(cnt) * bsize + 1, pty(cnt) * bsize + 1, ptx(cnt) * bsize + bsize - 1, pty(cnt) * bsize + bsize - 1
    loop
    stop
;得点表示 -----
*tokuten_disp
    ty = 50
    color 200, 200, 255
    boxf winx1 + 1, ty, winx1 + 150, ty + 20
    color 0, 0, 0
    pos  winx1 + 5, ty : mes strf("得点:%08d", tokuten)
    return
;迷路作成(棒倒し法) -----
*maze_make
<< 省略 >>
    return

実行迷路とアイテムが表示される。画面の右側に得点などの情報が表示される。

 今回のゲームでは、画面(迷路)全体を描き換える(消しては描く)ことはしないので、迷路画像用のウィンドウは用意しないで、メインウィンドウ(ID0)に迷路を直接描画している。



(2) プレイヤー移動

 プレイヤーは赤丸で表し、カーソルキーで移動させる。このとき、移動前の赤丸を消去してから移動後の座標に赤丸を描画する。このように、必要な部分だけを描画、消去することにする。プレイヤーの座標は変数px, pyで、一つ前の座標を変数px1, py1に格納する。どちらも初期値はスタート位置の(1, 1)である。

    px = 1 : py = 1         ;スタート座標
    px1 = 1 : py1 = 1       ;足跡格納用
    ;ゲームメイン
    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]
        ;プレイヤー表示
        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 : break    ;ゴール確認
        await 100
    loop

 足跡消去は、白色で行っているので、移動した後がわかるようにしている。
 キー入力では、入力データkkの判定と移動先の状況(道/壁)を判定している。



課題(maze63.hsp)
 プレイヤー移動の処理を追加する。さらに、ゴールした後、継続確認をしてから再度ゲームができるようにする。


(リスト)



課題(maze64.hsp)
 プレイヤーがアイテム上に来たら得点(100点)を加算する処理を追加する。

 アイテムの座標は配列ptx, ptyに格納されているので、現在の座標(px, py)と比較してチェックする。処理は、プレイヤー移動後に追加する。

        ;アイテムチェック
        foreach ptx
            if ptx(cnt) = px & pty(cnt) = py {      ;座標チェック
                tokuten += 100          ;得点加算
                gosub *tokuten_disp     ;得点表示
                ptx(cnt) = 0 : pty(cnt) = 0         ;アイテム座標消去
                break
            }
        loop


(リスト)



課題(maze65.hsp)
 アイテムをすべて取らないとゴールできないようにする。

 アイテムを取ったあと、アイテムの座標は0にしている。10個の配列ptx, ptyがすべて0であれば、すべて取ったと判断できる。判断する時期は、プレイヤーがゴールに来たときである。
 10個の配列ptxがすべて0かどうかは、配列ptxの合計を計算して判定する。

        if px = bx - 2 & py = by - 2 : break    ;ゴール確認
         ↓
        if px = bx - 2 & py = by - 2 {  ;ゴール確認
            wa = 0  ;合計用
            foreach ptx
                wa += ptx(cnt)  ;x座標の合計
            loop
            if wa = 0 : break       ;ゴールOK
        }


(リスト)


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

 

 

inserted by FC2 system