;*********************************************** ; 定数設定 ;*********************************************** #define WINDOW_TITLE "ブロック崩し" ;windowタイトル #define WINDOW_X_SIZE 300 ;window横幅 #define WINDOW_Y_SIZE 400 ;window縦幅 #define BAR_X_SIZE 60 ;バー横幅 #define BAR_Y_SIZE 10 ;バー縦幅 #define BALL_SIZE 20 ;ボール幅 #define BLOCK_X_NUM 5 ;ブロック横の数 #define BLOCK_Y_NUM 5 ;ブロック縦の数 #define BLOCK_PADDING 3 ;ブロック間隔 #define BLOCK_WIDTH 50 ;ブロック横幅 #define BLOCK_HEIGHT 10 ;ブロック縦幅 #define BLOCK_START_X 17 ;ブロック開始X座標 #define BLOCK_START_Y 20 ;ブロック開始Y座標 ;*********************************************** ; 変数設定(デフォルト設定) ;*********************************************** barX = 120 ;バー横座標(左上位置) barY = 360 ;バー縦座標(左上位置) barSpeed = 10 ;バーのスピード ballX = 140 ;ボール横座標(左上位置) ballY = 341 ;ボール座標(左上位置) ballSpeedX = 10 ;ボールの横スピード ballSpeedY = -10 ;ボールの縦スピード ;ブロックの表示フラグ dim blockFlg,BLOCK_X_NUM,BLOCK_Y_NUM repeat BLOCK_Y_NUM: i=cnt repeat BLOCK_X_NUM :j=cnt blockFlg(i,j) = 1 loop loop ;ブロック残り数 restBlock = BLOCK_X_NUM*BLOCK_Y_NUM ;■windowの設定 screen 0,WINDOW_X_SIZE,WINDOW_Y_SIZE title WINDOW_TITLE ;■メイン処理 *main repeat cls gosub *bar_operation gosub *ball_move gosub *hit_judgment gosub *block_judgment await 50 loop stop ;■バー操作 *bar_operation boxf barX,barY,barX + BAR_X_SIZE,barY + BAR_Y_SIZE stick key,15 if key=128 : end if key&1 : barX = barX - barSpeed if key&4 : barX = barX + barSpeed if barX <= 0 { barX = 0 } if barX >= ginfo_winx - BAR_X_SIZE { barX = ginfo_winx - BAR_X_SIZE } return ;■ボール動作 *ball_move color 255,0,0 circle ballX, ballY, ballX+BALL_SIZE, ballY+BALL_SIZE ballX = ballX + ballSpeedX ballY = ballY + ballSpeedY ;左端 if ballX <= 0 { ballX = 0 : ballSpeedX = -ballSpeedX } ;右端 if ballX >= ginfo_winx - BALL_SIZE { ballX = ginfo_winx - BALL_SIZE ballSpeedX = -ballSpeedX } ;上端 if ballY <= 0 { ballY = 0 : ballSpeedY = -ballSpeedY } ;下端 if ballY >= ginfo_winy - BALL_SIZE { pos 70,150 font "MS ゴシック",30 mes "GAME OVER" stop } return ;■当たり判定処理(バーとボール) *hit_judgment if (barX+BAR_X_SIZE) > ballX AND barX < (ballX+BALL_SIZE) AND (barY+BAR_Y_SIZE) > ballY AND barY < (ballY+BALL_SIZE){ ballSpeedY = -ballSpeedY } return ;■当たり判定処理(ブロックとボール) *block_hit_judgment if (blockX+BLOCK_WIDTH) > ballX AND blockX < (ballX+BALL_SIZE) AND (blockY+BLOCK_HEIGHT) > ballY AND blockY < (ballY+BALL_SIZE){ blockFlg(i,j) == 0 restBlock-- if restBlock == 0 { color 255,0,0 pos 70,150 font "MS ゴシック",30 mes "Game Clear" stop } ballSpeedY = -ballSpeedY } return ;■ブロック表示 *block_judgment color 0,0,255 blockY = BLOCK_START_Y ;縦ループ(Y座標) repeat BLOCK_Y_NUM : i=cnt blockX = BLOCK_START_X ;横ループ(X座標) repeat BLOCK_X_NUM : j=cnt ;ブロックがあれば当たり判定 if blockFlg(i,j) == 1 { gosub *block_hit_judgment } ;ブロックがあれば表示 if blockFlg(i,j) == 1 { boxf blockX,blockY, blockX+BLOCK_WIDTH , blockY+BLOCK_HEIGHT } blockX + = BLOCK_WIDTH + BLOCK_PADDING loop blockY + = BLOCK_HEIGHT + BLOCK_PADDING loop return