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 |