HSP3 ゲームのプログラミング | |
プログラミング例(ブロック・ゲーム) |
リンクをクリックするとリストが表示される。
課題 (block61.hsp)
ラケットのプログラムracket96.hspにブロックの描画block11.hspを追する。
;block61.hsp dim bx, 96 : dim by, 96 : dim bf, 96 buffer 1 ;ウィンドウID 1番 picload "block1.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 ;情報領域表示 ;ブロック初期設定 foreach bf bx(cnt) = (cnt \ 12) * 4 + 6 ;ブロックx座標 by(cnt) = cnt / 12 * 2 + 2 ;ブロックy座標 bf(cnt) = 1 ;1:あり/0:なし loop *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 ;ゲーム領域消去 ;ブロック描画 foreach bf if bf(cnt) = 1 { pos bx(cnt) * mm, by(cnt) * mm gcopy 1, 0, 16, 32, 16 } loop pos x0 * mm, y0 * mm ;カレントポジション設定 gcopy 1, 0, 0 ;画像コピー pos x1 * mm, y1 * mm ;カレントポジション設定 gcopy 1, 16, 0, 32, 8 ;画像コピー redraw 1 ;実描画 << 省略 >>
課題 (racket62.hsp)
ボールとブロック衝突判定の処理を追加する。ブロック1つにつき得点を10点加算する。
;block62.hsp dim bx, 96 : dim by, 96 : dim bf, 96 buffer 1 ;ウィンドウID 1番 picload "block1.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 ;情報領域表示 ;ブロック初期設定 foreach bf bx(cnt) = (cnt \ 12) * 4 + 6 ;ブロックx座標 by(cnt) = cnt / 12 * 2 + 4 ;ブロックy座標 bf(cnt) = 1 ;1:あり/0:なし loop *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(5) + 12) * 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 ;ゲーム領域消去 ;ブロック描画 foreach bf if bf(cnt) = 1 { pos bx(cnt) * mm, by(cnt) * mm gcopy 1, 0, 16, 32, 16 } loop pos x0 * mm, y0 * mm ;カレントポジション設定 gcopy 1, 0, 0 ;画像コピー pos x1 * mm, y1 * mm ;カレントポジション設定 gcopy 1, 16, 0, 32, 8 ;画像コピー redraw 1 ;実描画 foreach bf ;ボールとブロック衝突判定 if bf(cnt) = 1 { if abs(x0 - bx(cnt) - 1) <= 2 & y0 + 2 = by(cnt) & dy0 > 0 { ;上辺衝突 dy0 = -dy0 ;方向反転 bf(cnt) = 0 ;ブロックなし tokuten = tokuten + 10 ;得点加算 gosub *joho ;情報領域表示 } if abs(x0 - bx(cnt) - 1) <= 2 & y0 = by(cnt) + 2 & dy0 < 0 { ;下辺衝突 dy0 = -dy0 ;方向反転 bf(cnt) = 0 ;ブロックなし tokuten = tokuten + 10 ;得点加算 gosub *joho ;情報領域表示 } if abs(y0 - by(cnt)) <= 1 & x0 + 2 = bx(cnt) & dx0 > 0 { ;左辺衝突 dx0 = -dx0 ;方向反転 bf(cnt) = 0 ;ブロックなし tokuten = tokuten + 10 ;得点加算 gosub *joho ;情報領域表示 } if abs(y0 - by(cnt)) <= 1 & x0 = bx(cnt) + 4 & dx0 < 0 { ;右辺衝突 dx0 = -dx0 ;方向反転 bf(cnt) = 0 ;ブロックなし tokuten = tokuten + 10 ;得点加算 gosub *joho ;情報領域表示 } } loop if abs(x0 - x1 - 1) <= 2 & y0 + 2 = y1 { ;ボールとラケット衝突判定 dy0 = -dy0 ;方向反転 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
課題 (racket63.hsp)
ブロック全消去時の処理を追加する。
;block63.hsp dim bx, 96 : dim by, 96 : dim bf, 96 buffer 1 ;ウィンドウID 1番 picload "block1.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 ;情報領域表示 gosub *block_init ;ブロック初期設定 *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(5) + 12) * 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 ;ゲーム領域消去;ブロック描画 bff = 0 ;ブロック有(1)無(0) foreach bf if bf(cnt) = 1 { pos bx(cnt) * mm, by(cnt) * mm gcopy 1, 0, 16, 32, 16 bff = 1 ;ブロック有(1) } loop pos x0 * mm, y0 * mm ;カレントポジション設定 gcopy 1, 0, 0 ;画像コピー pos x1 * mm, y1 * mm ;カレントポジション設定 gcopy 1, 16, 0, 32, 8 ;画像コピー redraw 1 ;実描画 if bff = 0 : gosub *block_init : break ;ブロック全消去 foreach bf ;ボールとブロック衝突判定 if bf(cnt) = 1 { if abs(x0 - bx(cnt) - 1) <= 2 & y0 + 2 = by(cnt) & dy0 > 0 { ;上辺衝突 dy0 = -dy0 ;方向反転 bf(cnt) = 0 ;ブロックなし tokuten = tokuten + 10 ;得点加算 gosub *joho ;情報領域表示 } if abs(x0 - bx(cnt) - 1) <= 2 & y0 = by(cnt) + 2 & dy0 < 0 { ;下辺衝突 dy0 = -dy0 ;方向反転 bf(cnt) = 0 ;ブロックなし tokuten = tokuten + 10 ;得点加算 gosub *joho ;情報領域表示 } if abs(y0 - by(cnt)) <= 1 & x0 + 2 = bx(cnt) & dx0 > 0 { ;左辺衝突 dx0 = -dx0 ;方向反転 bf(cnt) = 0 ;ブロックなし tokuten = tokuten + 10 ;得点加算 gosub *joho ;情報領域表示 } if abs(y0 - by(cnt)) <= 1 & x0 = bx(cnt) + 4 & dx0 < 0 { ;右辺衝突 dx0 = -dx0 ;方向反転 bf(cnt) = 0 ;ブロックなし tokuten = tokuten + 10 ;得点加算 gosub *joho ;情報領域表示 } } loop if abs(x0 - x1 - 1) <= 2 & y0 + 2 = y1 { ;ボールとラケット衝突判定 dy0 = -dy0 ;方向反転 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 ;----- サブルーチン ----- *block_init ;ブロック初期設定 foreach bf bx(cnt) = (cnt \ 12) * 4 + 6 ;ブロックx座標 by(cnt) = cnt / 12 * 2 + 4 ;ブロックy座標 bf(cnt) = 1 ;1:あり/0:なし loop return *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
課題 (block64.hsp)
ブロックを全部消去したとき、別の配置のブロックを表示するように処理を追加する。
;block64.hsp dim bx, 96 : dim by, 96 : dim bf, 96 buffer 1 ;ウィンドウID 1番 picload "block1.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 ;残りボール bmen = 0 ;ブロック配置番号 gosub *joho ;情報領域表示 gosub *block_init ;ブロック初期設定 *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(5) + 12) * 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 ;ゲーム領域消去;ブロック描画 bff = 0 ;ブロック有(1)無(0) foreach bf if bf(cnt) = 1 { pos bx(cnt) * mm, by(cnt) * mm gcopy 1, 0, 16, 32, 16 bff = 1 ;ブロック有(1) } loop pos x0 * mm, y0 * mm ;カレントポジション設定 gcopy 1, 0, 0 ;画像コピー pos x1 * mm, y1 * mm ;カレントポジション設定 gcopy 1, 16, 0, 32, 8 ;画像コピー redraw 1 ;実描画 if bff = 0 { ;ブロック全消去 bmen = (bmen + 1) \ 2 gosub *block_init break } foreach bf ;ボールとブロック衝突判定 if bf(cnt) = 1 { if abs(x0 - bx(cnt) - 1) <= 2 & y0 + 2 = by(cnt) & dy0 > 0 { ;上辺衝突 dy0 = -dy0 ;方向反転 bf(cnt) = 0 ;ブロックなし tokuten = tokuten + 10 ;得点加算 gosub *joho ;情報領域表示 } if abs(x0 - bx(cnt) - 1) <= 2 & y0 = by(cnt) + 2 & dy0 < 0 { ;下辺衝突 dy0 = -dy0 ;方向反転 bf(cnt) = 0 ;ブロックなし tokuten = tokuten + 10 ;得点加算 gosub *joho ;情報領域表示 } if abs(y0 - by(cnt)) <= 1 & x0 + 2 = bx(cnt) & dx0 > 0 { ;左辺衝突 dx0 = -dx0 ;方向反転 bf(cnt) = 0 ;ブロックなし tokuten = tokuten + 10 ;得点加算 gosub *joho ;情報領域表示 } if abs(y0 - by(cnt)) <= 1 & x0 = bx(cnt) + 4 & dx0 < 0 { ;右辺衝突 dx0 = -dx0 ;方向反転 bf(cnt) = 0 ;ブロックなし tokuten = tokuten + 10 ;得点加算 gosub *joho ;情報領域表示 } } loop if abs(x0 - x1 - 1) <= 2 & y0 + 2 = y1 { ;ボールとラケット衝突判定 dy0 = -dy0 ;方向反転 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 ;----- サブルーチン ----- *block_init ;ブロック初期設定 if bmen = 0 { foreach bf bx(cnt) = (cnt \ 12) * 4 + 6 ;ブロックx座標 by(cnt) = cnt / 12 * 2 + 4 ;ブロックy座標 bf(cnt) = 1 ;1:あり/0:なし loop } if bmen = 1 { foreach bf bx(cnt) = (cnt \ 12) * 4 + 6 ;ブロックx座標 by(cnt) = cnt / 12 * 2 + 4 ;ブロックy座標 loop repeat 8 lp = cnt if lp \ 3 = 0 { repeat 12 np = lp * 12 + cnt if cnt \ 2 = 0 : bf(np) = 1 : else : bf(np) = 0 ;1:あり/0:なし loop } if lp \ 3 = 1 { repeat 12 np = lp * 12 + cnt if cnt \ 2 = 1 : bf(np) = 1 : else : bf(np) = 0 ;1:あり/0:なし loop } if lp \ 3 = 2 { repeat 12 np = lp * 12 + cnt bf(np) = 0 ;1:あり/0:なし loop } loop } return *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
課題 (block65.hsp)
ブロックの角からボールが進入してきたときの衝突判定の処理を追加する。
<< 省略 >> foreach bf ;ボールとブロック衝突判定 if bf(cnt) = 1 { if abs(x0 - bx(cnt) - 1) <= 2 & y0 + 2 = by(cnt) & dy0 > 0 { ;上辺衝突 dy0 = -dy0 ;方向反転 bf(cnt) = 0 ;ブロックなし tokuten = tokuten + 10 ;得点加算 gosub *joho ;情報領域表示 } if abs(x0 - bx(cnt) - 1) <= 2 & y0 = by(cnt) + 2 & dy0 < 0 { ;下辺衝突 dy0 = -dy0 ;方向反転 bf(cnt) = 0 ;ブロックなし tokuten = tokuten + 10 ;得点加算 gosub *joho ;情報領域表示 } if abs(y0 - by(cnt)) <= 1 & x0 + 2 = bx(cnt) & dx0 > 0 { ;左辺衝突 dx0 = -dx0 ;方向反転 bf(cnt) = 0 ;ブロックなし tokuten = tokuten + 10 ;得点加算 gosub *joho ;情報領域表示 } if abs(y0 - by(cnt)) <= 1 & x0 = bx(cnt) + 4 & dx0 < 0 { ;右辺衝突 dx0 = -dx0 ;方向反転 bf(cnt) = 0 ;ブロックなし tokuten = tokuten + 10 ;得点加算 gosub *joho ;情報領域表示 } if (x0 = bx(cnt) - 1 | x0 = bx(cnt) + 3) & (y0 = by(cnt) - 1 | y0 = by(cnt) + 1) { dx0 = -dx0 ;方向反転 dy0 = -dy0 ;方向反転 bf(cnt) = 0 ;ブロックなし tokuten = tokuten + 10 ;得点加算 gosub *joho ;情報領域表示 } } loop << 省略 >>
課題 (block66.hsp)
ハイスコアーの処理を追加する。
;block66.hsp dim bx, 96 : dim by, 96 : dim bf, 96 buffer 1 ;ウィンドウID 1番 picload "block1.bmp" ;画像ファイル読み込み screen 0, 640, 480 ;ウィンドウID 0番 gmode 2, 16, 16 ;コピーモード設定 mm = 8 ;間隔 winx = 60 : winy = 60 ;ゲーム領域のサイズ randomize title "ラケット・ゲーム" font "MS ゴシック", 18, 1 ;フォント設定 goto *hiscr_read ;ハイスコアー読み込み *restart tokuten = 0 ;得点初期化 ball = 2 ;残りボール bmen = 0 ;ブロック配置番号 gosub *joho ;情報領域表示 gosub *block_init ;ブロック初期設定 *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(5) + 12) * 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 ;ゲーム領域消去;ブロック描画 bff = 0 ;ブロック有(1)無(0) foreach bf if bf(cnt) = 1 { pos bx(cnt) * mm, by(cnt) * mm gcopy 1, 0, 16, 32, 16 bff = 1 ;ブロック有(1) } loop pos x0 * mm, y0 * mm ;カレントポジション設定 gcopy 1, 0, 0 ;画像コピー pos x1 * mm, y1 * mm ;カレントポジション設定 gcopy 1, 16, 0, 32, 8 ;画像コピー redraw 1 ;実描画 if bff = 0 { ;ブロック全消去 bmen = (bmen + 1) \ 2 gosub *block_init break } foreach bf ;ボールとブロック衝突判定 if bf(cnt) = 1 { if abs(x0 - bx(cnt) - 1) <= 2 & y0 + 2 = by(cnt) & dy0 > 0 { ;上辺衝突 dy0 = -dy0 ;方向反転 bf(cnt) = 0 ;ブロックなし tokuten = tokuten + 10 ;得点加算 gosub *joho ;情報領域表示 } if abs(x0 - bx(cnt) - 1) <= 2 & y0 = by(cnt) + 2 & dy0 < 0 { ;下辺衝突 dy0 = -dy0 ;方向反転 bf(cnt) = 0 ;ブロックなし tokuten = tokuten + 10 ;得点加算 gosub *joho ;情報領域表示 } if abs(y0 - by(cnt)) <= 1 & x0 + 2 = bx(cnt) & dx0 > 0 { ;左辺衝突 dx0 = -dx0 ;方向反転 bf(cnt) = 0 ;ブロックなし tokuten = tokuten + 10 ;得点加算 gosub *joho ;情報領域表示 } if abs(y0 - by(cnt)) <= 1 & x0 = bx(cnt) + 4 & dx0 < 0 { ;右辺衝突 dx0 = -dx0 ;方向反転 bf(cnt) = 0 ;ブロックなし tokuten = tokuten + 10 ;得点加算 gosub *joho ;情報領域表示 } if (x0 = bx(cnt) - 1 | x0 = bx(cnt) + 3) & (y0 = by(cnt) - 1 | y0 = by(cnt) + 1) { dx0 = -dx0 ;方向反転 dy0 = -dy0 ;方向反転 bf(cnt) = 0 ;ブロックなし tokuten = tokuten + 10 ;得点加算 gosub *joho ;情報領域表示 } } loop if abs(x0 - x1 - 1) <= 2 & y0 + 2 = y1 { ;ボールとラケット衝突判定 dy0 = -dy0 ;方向反転 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 ;ゲームスタート } goto *hiscr_write ;ハイスコアー書き込み *owari gosub *joho ;情報領域表示 dialog "もう一度しますか。", 2 if stat = 6 : goto *restart end ;----- サブルーチン -----;ハイスコアー書き込み ----- *hiscr_write hiscr = "" ;メモリノートパッド用変数クリア notesel hiscr ;メモリノートパッド設定 last = length(scr) - 1 ;配列最後の添字 if tokuten <= scr(last) : goto *owari ;得点と5番目の比較;文字列入力ダイアログ screen 2, 200, 120, 8 ;ダイアログ用ウィンドウ dat = "" mes "名前を入力して下さい。" pos 25, 32 input dat, 150 ;入力ボックス pos 65, 64 button "OK", *ok ;ボタン stop *ok gsel 2, -1 ;ID2非表示 gsel 0, 1 ;ID0アクティブ scr(last) = tokuten ;得点を配列の最後に格納 namae(last) = dat ;名前を配列の最後に格納 gosub *sort ;ソート foreach scr ;配列データをメモリノートパッドに追加 noteadd str(scr(cnt)) noteadd namae(cnt) loop notesave "block.txt" ;メモリノートパッド保存 noteunsel ;メモリノートパッド解放 goto *owari *sort repeat length(scr) - 1 d1 = cnt repeat length(scr) - (d1 + 1), d1 + 1 if scr(d1) < scr(cnt){ ww = scr(d1) : sww = namae(d1) scr(d1) = scr(cnt) : namae(d1) = namae(cnt) scr(cnt) = ww : namae(cnt) = sww } loop loop return ;ハイスコアー読み込み ----- *hiscr_read onerror gosub *hserr ;エラー処理 dim scr, 5 : sdim namae, 5 ;ハイスコアー用配列 hiscr = "" ;メモリノートパッド用変数クリア(文字型にする) notesel hiscr ;メモリノートパッド設定 noteload "block.txt" ;メモリノートパッド読み込み foreach scr noteget sscr, cnt * 2 ;スコアー取り出し noteget namae(cnt), cnt * 2 + 1 ;名前取り出し scr(cnt) = int(sscr) ;スコアーを整数に変換 loop noteunsel ;メモリノートパッド解放 goto *restart ;呼び出しの次行に戻る *hserr if wparam = 12 { ;ファイルがないエラー foreach scr noteadd "0" noteadd "none" loop return } dialog "エラーです。終了します。" + wparam + "/" + lparam, 1 end *block_init ;ブロック初期設定 if bmen = 0 { foreach bf bx(cnt) = (cnt \ 12) * 4 + 6 ;ブロックx座標 by(cnt) = cnt / 12 * 2 + 4 ;ブロックy座標 bf(cnt) = 1 ;1:あり/0:なし loop } if bmen = 1 { foreach bf bx(cnt) = (cnt \ 12) * 4 + 6 ;ブロックx座標 by(cnt) = cnt / 12 * 2 + 4 ;ブロックy座標 loop repeat 8 lp = cnt if lp \ 3 = 0 { repeat 12 np = lp * 12 + cnt if cnt \ 2 = 0 : bf(np) = 1 : else : bf(np) = 0 ;1:あり/0:なし loop } if lp \ 3 = 1 { repeat 12 np = lp * 12 + cnt if cnt \ 2 = 1 : bf(np) = 1 : else : bf(np) = 0 ;1:あり/0:なし loop } if lp \ 3 = 2 { repeat 12 np = lp * 12 + cnt bf(np) = 0 ;1:あり/0:なし loop } loop } return *joho redraw 0 ;仮描画 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) ;残りボール if ball > 0 { repeat ball pos (62 + cnt * 3) * mm, 56 * mm gcopy 1, 0, 0 loop } ;ハイスコアー pos 61 * mm, 20 * mm mes "ハイスコアー" foreach scr mes strf("%06d ", scr(cnt)) + namae(cnt) loop redraw 1 ;実描画 return
プログラミング例 | |
2007 © Hiroshi Masuda |