HSP3 ゲームのプログラミング | |
プログラミング例(ラケット・ゲーム) |
リンクをクリックするとリストが表示される。
課題 (racket91.hsp)
変更点*1〜*8について修正せよ。
;racket91.hsp buffer 1 ;ウィンドウID 1番 picload "racket1.bmp" ;画像ファイル読み込み screen 0, 640, 480 ;ウィンドウID 0番 gmode 2, 16, 16 ;コピーモード設定 mm = 8 ;間隔 winx = 60 : winy = 60 ;ゲーム領域のサイズ randomize *start x0 = rnd(winx - 2) : y0 = 2 ;ボールの初期座標 dx0 = 1 : dy0 = 1 ;ボールの移動量 x1 = 12 : y1 = 55 ;バーの座標 dx1 = 2 : dy1 = 0 ;バーの移動量 repeat redraw 0 ;仮描画 color 0, 128, 0 ;緑色 boxf 0, 0, winx * mm - 1, winy * mm ;ゲーム領域消去 pos x0 * mm, y0 * mm ;カレントポジション設定 gcopy 1, 0, 0 ;画像コピー pos x1 * mm, y1 * mm ;カレントポジション設定 gcopy 1, 16, 0, 32, 8 ;画像コピー redraw 1 ;実描画 if abs(x0 - x1 - 1) <= 2 & y0 + 2 = y1 : dy0 = -dy0 ;衝突判定 x0 = x0 + dx0 ;x座標加算 y0 = y0 + dy0 ;y座標加算 if x0 >= winx - 2 : dx0 = -dx0 ;右壁衝突 if x0 <= 0 : dx0 = -dx0 ;左壁衝突 if y0 >= winy : break ;下壁衝突 if y0 <= 0 : dy0 = -dy0 ;上壁衝突 stick key, 15 ;キー入力 if key & 1 : x1 = x1 - dx1 ;左 if key & 4 : x1 = x1 + dx1 ;右 if key & 128 : end ;[Esc] x1 = limit(x1, 0, winx - 4) await 100 ;無限ループの時のお約束 loop dialog "もう一度しますか。", 2 if stat = 6 : goto *start end
課題 (racket92.hsp)
サンプルで示した処理を前の課題(racket91.hsp)に追加・修正せよ。
;racket92.hsp buffer 1 ;ウィンドウID 1番 picload "racket1.bmp" ;画像ファイル読み込み screen 0, 640, 480 ;ウィンドウID 0番 gmode 2, 16, 16 ;コピーモード設定 mm = 8 ;間隔 winx = 60 : winy = 60 ;ゲーム領域のサイズ randomize title "ラケット・ゲーム" font "MS ゴシック", 18, 1 ;フォント設定 *restart tokuten = 0 ;得点初期化 ball = 2 ;残りボール gosub *joho ;情報領域表示 *start x0 = rnd(winx - 2) : y0 = 2 ;ボールの初期座標 dx0 = 1 : dy0 = 1 ;ボールの移動量 x1 = 12 : y1 = 55 ;バーの座標 dx1 = 2 : dy1 = 0 ;バーの移動量 repeat redraw 0 ;仮描画 color 0, 128, 0 ;緑色 boxf 0, 0, winx * mm - 1, winy * mm ;ゲーム領域消去 pos x0 * mm, y0 * mm ;カレントポジション設定 gcopy 1, 0, 0 ;画像コピー pos x1 * mm, y1 * mm ;カレントポジション設定 gcopy 1, 16, 0, 32, 8 ;画像コピー redraw 1 ;実描画 if abs(x0 - x1 - 1) <= 2 & y0 + 2 = y1 { ;衝突判定 dy0 = -dy0 ;方向反転 tokuten = tokuten + 10 ;得点加算 gosub *joho ;情報領域表示 } x0 = x0 + dx0 ;x座標加算 y0 = y0 + dy0 ;y座標加算 if x0 >= winx - 2 : dx0 = -dx0 ;右壁衝突 if x0 <= 0 : dx0 = -dx0 ;左壁衝突 if y0 >= winy { ;下壁衝突 ball-- ;ボール減 break ;ループを抜ける } if y0 <= 0 : dy0 = -dy0 ;上壁衝突 stick key, 15 ;キー入力 if key & 1 : x1 = x1 - dx1 ;左 if key & 4 : x1 = x1 + dx1 ;右 if key & 128 : end ;[Esc] x1 = limit(x1, 0, winx - 4) await 100 ;無限ループの時のお約束 loop if ball >= 0 { ;残りボールあり gosub *joho ;情報領域表示 goto *start ;ゲームスタート } dialog "もう一度しますか。", 2 if stat = 6 : goto *restart end ;----- サブルーチン ----- *joho color 0, 0, 128 ;青色 boxf 60 * mm , 0 ;情報表示領域消去;タイトル color 255, 128, 128 pos 61 * mm, 0 mes "ラケット・ゲーム" ;得点 color 128, 192, 255 pos 62 * mm, 3 * mm mes strf("得点 = %06d", tokuten) ;残りボール repeat ball pos (62 + cnt * 3) * mm, 56 * mm gcopy 1, 0, 0 loop return
課題 (racket93.hsp)
プログラムを実行したり、失敗後の再スタートで、ボールがいきなり出てくる。ゲーム領域に「START」などと表示してからボールが出てくるようにする。
処理としては、ラベル*startの直後に表示と時間待ちを追加するだけである。
;racket93.hsp buffer 1 ;ウィンドウID 1番 picload "racket1.bmp" ;画像ファイル読み込み screen 0, 640, 480 ;ウィンドウID 0番 gmode 2, 16, 16 ;コピーモード設定 mm = 8 ;間隔 winx = 60 : winy = 60 ;ゲーム領域のサイズ randomize title "ラケット・ゲーム" font "MS ゴシック", 18, 1 ;フォント設定 *restart tokuten = 0 ;得点初期化 ball = 2 ;残りボール gosub *joho ;情報領域表示 *start color 0, 128, 0 ;緑色 boxf 0, 0, winx * mm - 1, winy * mm ;ゲーム領域消去 color 255, 255, 255 pos 26 * mm, 30 * mm mes "START" wait 100 x0 = rnd(winx - 2) : y0 = 2 ;ボールの初期座標 dx0 = 1 : dy0 = 1 ;ボールの移動量 x1 = 12 : y1 = 55 ;バーの座標 dx1 = 2 : dy1 = 0 ;バーの移動量 repeat << 省略 >>
課題 (racket94.hsp)
ボールの出てくる位置は乱数で変わるようになっているが、いつも右下に向かって移動する。ボールの移動量dx0, dy0が正数であるためである。dx0の値が+1または-1に変わるように変更する。
また、y0の値も2〜20(偶数のみ)の範囲で変わるようにする。
;racket94.hsp << 省略 >> *start color 0, 128, 0 ;緑色 boxf 0, 0, winx * mm - 1, winy * mm ;ゲーム領域消去 color 255, 255, 255 pos 26 * mm, 30 * mm mes "START" wait 100 x0 = rnd(winx - 2) : y0 = (rnd(10) + 1) * 2 ;ボールの初期座標 if rnd(10) < 5 : dx0 = 1 : else : dx0 = -1 ;ボールの移動量 dy0 = 1 x1 = 12 : y1 = 55 ;バーの座標 dx1 = 2 : dy1 = 0 ;バーの移動量 repeat << 省略 >>
課題 (racket95.hsp)
得点が1000点になったら、残りボールを1個増やす。
<< 省略 >> if abs(x0 - x1 - 1) <= 2 & y0 + 2 = y1 { ;衝突判定 dy0 = -dy0 ;方向反転 tokuten = tokuten + 10 ;得点加算 if tokuten = 1000 : ball = ball + 1 ;ボール加算 gosub *joho ;情報領域表示 } << 省略 >>
課題 (racket96.hsp)
一定回数打ち返すごとに、ボールのスピードが速くなるようにせよ。失敗後は、また1からカウントする。打ち返した回数は変数hitでカウントする。スピードはawaitのパラメータで調整する。
初期値 … await 100、 10回 … await 80、 30回 … await 65、 50回 … await 50
;racket96.hsp buffer 1 ;ウィンドウID 1番 picload "racket1.bmp" ;画像ファイル読み込み screen 0, 640, 480 ;ウィンドウID 0番 gmode 2, 16, 16 ;コピーモード設定 mm = 8 ;間隔 winx = 60 : winy = 60 ;ゲーム領域のサイズ randomize title "ラケット・ゲーム" font "MS ゴシック", 18, 1 ;フォント設定 *restart tokuten = 0 ;得点初期化 ball = 2 ;残りボール gosub *joho ;情報領域表示 *start color 0, 128, 0 ;緑色 boxf 0, 0, winx * mm - 1, winy * mm ;ゲーム領域消去 color 255, 255, 255 pos 26 * mm, 30 * mm mes "START" wait 100 wt = 100 ;await時間 hit = 0 ;打ち返した回数 x0 = rnd(winx - 2) : y0 = (rnd(10) + 1) * 2 ;ボールの初期座標 if rnd(10) < 5 : dx0 = 1 : else : dx0 = -1 ;ボールの移動量 dy0 = 1 x1 = 12 : y1 = 55 ;バーの座標 dx1 = 2 : dy1 = 0 ;バーの移動量 repeat redraw 0 ;仮描画 color 0, 128, 0 ;緑色 boxf 0, 0, winx * mm - 1, winy * mm ;ゲーム領域消去 pos x0 * mm, y0 * mm ;カレントポジション設定 gcopy 1, 0, 0 ;画像コピー pos x1 * mm, y1 * mm ;カレントポジション設定 gcopy 1, 16, 0, 32, 8 ;画像コピー redraw 1 ;実描画 if abs(x0 - x1 - 1) <= 2 & y0 + 2 = y1 { ;衝突判定 dy0 = -dy0 ;方向反転 tokuten = tokuten + 10 ;得点加算 hit++ ;打ち返しカウント if tokuten = 1000 : ball = ball + 1 ;ボール加算 gosub *joho ;情報領域表示 } x0 = x0 + dx0 ;x座標加算 y0 = y0 + dy0 ;y座標加算 if x0 >= winx - 2 : dx0 = -dx0 ;右壁衝突 if x0 <= 0 : dx0 = -dx0 ;左壁衝突 if y0 >= winy { ;下壁衝突 ball-- ;ボール減 break ;ループを抜ける } if y0 <= 0 : dy0 = -dy0 ;上壁衝突 stick key, 15 ;キー入力 if key & 1 : x1 = x1 - dx1 ;左 if key & 4 : x1 = x1 + dx1 ;右 if key & 128 : end ;[Esc] x1 = limit(x1, 0, winx - 4) if hit = 10 : wt = 80 if hit = 30 : wt = 65 if hit = 50 : wt = 50 await wt ;無限ループの時のお約束 loop if ball >= 0 { ;残りボールあり gosub *joho ;情報領域表示 goto *start ;ゲームスタート } dialog "もう一度しますか。", 2 if stat = 6 : goto *restart end ;----- サブルーチン ----- *joho color 0, 0, 128 ;青色 boxf 60 * mm , 0 ;情報表示領域消去;タイトル color 255, 128, 128 pos 61 * mm, 0 mes "ラケット・ゲーム" ;得点 color 128, 192, 255 pos 62 * mm, 3 * mm mes strf("得点 = %06d", tokuten) ;残りボール repeat ball pos (62 + cnt * 3) * mm, 56 * mm gcopy 1, 0, 0 loop return
プログラミング例 | |
2007 © Hiroshi Masuda |