SHIROのIchigoJam日記

IchigoJamの電子工作とプログラミングをメインに

簡素ブロックくずし

昔のアーケードゲームを思い出しながら作りました。

プレイ動画


遊び方

起動するとデモ画面が出ます。Aボタンでゲームがスタートします。
パドルは下画面をタッチして動かしてください。十字キーには対応していません。
アイテムなどは何も出ません。ひたすらボールを打ち返してブロックを消してください。
向こう側の壁にボールが当たると、パドルの長さが半分になります。
ボールは3個です。400点でボールが1個追加されます。
2面クリアしても終わりません。ずっと続きます。

おまけ

DSiLLで開発しています。3DSだとボールが速過ぎると思いますので、49行目のウェイトの値を増やしてください。
かつて8ビットマシンの時代にブロックくずしを作りましたが、BASICでは速度が足りず、マシン語ルーチンを組み込んで何とか遊べる代物になりました。
今はオールBASICでこれだけ高速なブロックくずしが作れるんですね。楽しいです。
ゲームタイトルは最初「元祖ブロックくずし」にしようと思ったのですが、既に使っている人がいたので、「簡素」にしてみました。

プチコンmkII用QRコード

1 2
3 4

プログラムリスト

'**************
'*            *
'*    カンソ     *
'* ブロック クズシ *
'*            *
'* 2011.12.7  *
'*  by shiro  *
'*            *
'**************

'*** ショキ セッテイ ***

CLEAR
VISIBLE 1,0,0,0,1,1
PNLTYPE "OFF"
CLS
GPAGE 0:GCLS 0
GPAGE 1:GCLS 0
BGMSTOP
GPAGE 0
SPPAGE 0

DIM BLOCK(14,8),COLBLK(8)

'ゲーム モード
GMDEMO=0
GMPLAY=1
GMMISS=2

'ブロック
BLOCKMAX=14*8
BLKOX=56:BLKOY=16
BLKWX=14:BLKWY=6

'スクリーン サイズ
SCRMINX=55:SCRMAXX=SCRMINX+BLKWX*14+2
SCRMINY=0:SCRMAXY=191

'パドル
PADIX=150:PADY=189
PADWL=28:PADWS=14
PADWY=2

'ボール
SPSET 9,254,1,0,0,0
SPSCALE 0,150
BALLMAX=3
BALLIX=110:BALLIY=82
BALLWT0=12:BALLWT1=10

'スコア
SCOREX=0:SCOREY=0
SCOREB=400

'ボール ノコリ
BALLCX=0:BALLCY=3

'メッセージ
MESX=12:MESY=13

'カラー
COLBALL=15
COLPAD=15
COLWALL=15
COLMES=0
COLSCORE=0:COLBALLC=0

FOR Y=0 TO 7
READ COLBLK(Y)
NEXT Y
DATA 3,3,12,12,11,11,15,15

'サウンド
BPPAD=4096:BPWALL=2048:BPBLOCK=0
BPBONUS=3

GOSUB @INIBLOCK
GOSUB @PRTSCORE
GOSUB @PRTBALLC

'*** デモ ***
@DEMO

GM=GMDEMO
GOSUB @PRTBLOCK
BALLSP=3
BALLX=BALLIX:BALLY=BALLIY
BALLDX=1:BALLDY=1
GOSUB @PRTPADLN

LOCATE MESX,MESY
PRINT "PUSH A TO START"
LOCATE MESX,MESY+2
PRINT " PUSH B TO END"

@DEMOLOOP
GOSUB @MOVEBALL
FOR I=0 TO BALLWT0+BALLWT1*BALLSP:GOSUB @PRTWALL:NEXT I
IF (BUTTON() AND 16)!=0 GOTO @RESTART
IF (BUTTON() AND 32)!=0 GOTO @ENDINIT
GOTO @DEMOLOOP

'*** ゲーム リスタート ***
@RESTART

GM=GMPLAY
SCORE=0
BALLC=BALLMAX:BALLSP=3
BALLX=-2:BALLY=-2
BALLDX=1:BALLDY=1
PADX=PADIX:PADWX=PADWL
PADRFC=0
RFPAD=FALSE:RFBLOCK=FALSE
CLBLOCK=FALSE

CLS:GCLS 0
GOSUB @PRTWALL
GOSUB @INIBLOCK
GOSUB @PRTBLOCK
GOSUB @PRTPAD
GOSUB @PRTBALL
GOSUB @PRTSCORE
GOSUB @PRTBALLC
VSYNC 150
BALLX=BALLIX:BALLY=BALLIY

'*** メイン ループ ***
@MAINLOOP

GOSUB @MOVEPAD
GOSUB @MOVEBALL
FOR I=0 TO BALLWT0+BALLWT1*BALLSP:GOSUB @PRTWALL:NEXT I
IF GM==GMPLAY GOTO @MAINLOOP

'*** ミス ***

VSYNC 150
BALLC=BALLC-1
GOSUB @PRTBALLC
IF BALLC==0 GOTO @DEMO

BALLSP=3
BALLX=BALLIX:BALLY=BALLIY
BALLDX=1:BALLDY=1
GOSUB @ERCPAD
PADX=PADIX:PADWX=PADWL
PADRFC=0
RFPAD=FALSE:RFBLOCK=FALSE
GM=GMPLAY
GOTO @MAINLOOP

'*** ゲーム シュウリョウ ***
@ENDINIT

VISIBLE 1,1,1,1,1,1
CLS
GPAGE 0:GCLS 0
SPCLR
END

'===== サブルーチン =====

'*** カベ ヒョウジ ***
@PRTWALL
GLINE SCRMINX,SCRMINY,SCRMINX,SCRMAXY,COLWALL
GLINE SCRMAXX,SCRMINY,SCRMAXX,SCRMAXY,COLWALL
RETURN

'*** デモ パドルライン ヒョウジ ***
@PRTPADLN
GFILL SCRMINX+1,PADY,SCRMAXX-1,PADY+PADWY,COLPAD
RETURN

'*** ブロック ショキカ ***
@INIBLOCK

BLOCKC=BLOCKMAX
FOR X=0 TO 13
BLOCK(X,0)=7:BLOCK(X,1)=7
BLOCK(X,2)=5:BLOCK(X,3)=5
BLOCK(X,4)=3:BLOCK(X,5)=3
BLOCK(X,6)=1:BLOCK(X,7)=1
NEXT X
RETURN

'*** ブロック ヒョウジ ***
@PRTBLOCK

FOR X=0 TO 13
FOR Y=0 TO 7
IF BLOCK(X,Y)==0 THEN @PRTBLK2
GX=BLKOX+X*BLKWX
GY=BLKOY+Y*BLKWY
GCOLOR COLBLK(Y)
GFILL GX+1,GY+1,GX+BLKWX-1,GY+BLKWY-1
@PRTBLK2
NEXT Y
NEXT X

RETURN

'*** パドルヲ ウゴカス ***
@MOVEPAD

GOSUB @ERCPAD
IF TCHST==TRUE THEN PADX=TCHX
IF PADX-PADWX/2<=SCRMINX THEN PADX=SCRMINX+PADWX/2
IF PADX+PADWX/2>=SCRMAXX-1 THEN PADX=SCRMAXX-PADWX/2-1
GOSUB @PRTPAD

RETURN

'パドル ヒョウジ
@PRTPAD
GFILL PADX-PADWX/2+1,PADY,PADY+PADWY,COLPAD
RETURN

'パドル ショウキョ
@ERCPAD
GFILL PADX-PADWX/2+1,PADY,PADY+PADWY,0
RETURN

'*** ボールヲ ウゴカス ***
@MOVEBALL

IF BALLX<=SCRMINX+2 THEN GOSUB @RFWALLL
IF BALLX>=SCRMAXX-2 THEN GOSUB @RFWALLR
IF BALLY<SCRMINY THEN GOSUB @RFWALLU
IF BALLY>SCRMAXY+1 THEN GOSUB @RFMISS:RETURN

IF BALLY<PADY-2 OR BALLY>PADY THEN RFPAD=FALSE:GOTO @NOPAD
IF GM==GMDEMO THEN GOSUB @RFPADLN:GOTO @NOPAD
IF 0<=PADX-BALLX AND PADX-BALLX<=PADWX/2 AND RFPAD==FALSE THEN GOSUB @RFPADL
IF 0<BALLX-PADX AND BALLX-PADX<=PADWX/2+1 AND RFPAD==FALSE THEN GOSUB @RFPADR
@NOPAD

@CHKBLOCK
IF RFBLOCK==TRUE GOTO @NOBLOCK
BX=FLOOR((BALLX-BLKOX)/BLKWX)
BY=FLOOR((BALLY-BLKOY)/BLKWY)
IF BY<0 OR BY>7 GOTO @NOBLOCK
IF BLOCK(BX,BY)>0 THEN GOSUB @RFBLOCK
@NOBLOCK

BALLX=BALLX+BALLDX
BALLY=BALLY+BALLDY
GOSUB @PRTBALL

RETURN

'ボール ヒョウジ
@PRTBALL
SPOFS 0,BALLX-12,BALLY-12
RETURN

'ハンシャ パドル ヒダリ
@RFPADL
BEEP 0,BPPAD
BALLDX=-1:BALLDY=-BALLDY
GOSUB @BALLPTRN
RFPAD=TRUE:RFBLOCK=FALSE
IF CLBLOCK=TRUE THEN GOSUB @PRTBLOCK:CLBLOCK=FALSE
RETURN

'ハンシャ パドル ミギ
@RFPADR
BEEP 0,BPPAD
BALLDX=1:BALLDY=-BALLDY
GOSUB @BALLPTRN
RFPAD=TRUE:RFBLOCK=FALSE
IF CLBLOCK=TRUE THEN GOSUB @PRTBLOCK:CLBLOCK=FALSE
RETURN

'ハンシャ パドルライン
@RFPADLN
BALLDY=-BALLDY
GOSUB @BALLPTRN
RFBLOCK=FALSE
RETURN

'ボール パターン
@BALLPTRN
PADRFC=PADRFC+1
IF PADRFC==5 AND BALLSP!=0 THEN BALLSP=2
IF PADRFC==11 AND BALLSP!=0 THEN BALLDY=-0.5
IF PADRFC==15 AND BALLSP!=0 THEN BALLSP=1:BALLDY=-1
RETURN

'ハンシャ カベ ヒダリ
@RFWALLL
IF GM==GMPLAY THEN BEEP 0,BPWALL
BALLDX=1
RETURN

'ハンシャ カベ ミギ
@RFWALLR
IF GM==GMPLAY THEN BEEP 0,BPWALL
BALLDX=-1
RETURN

'ハンシャ カベ ウエ
@RFWALLU
BALLDY=-BALLDY
RFBLOCK=FALSE
IF GM=GMDEMO THEN RETURN
IF PADWX==PADWL THEN GOSUB @ERCPAD:PADWX=PADWS:GOSUB @PRTPAD
RETURN

'ハンシャ ブロック
@RFBLOCK

BALLDY=-BALLDY
RFBLOCK=TRUE

IF BY<=3 THEN BALLSP=0:BALLDY=SGN(BALLDY)
IF GM==GMDEMO THEN RETURN

BEEP 0,BPBLOCK
SCORE0=SCORE
SCORE=SCORE+BLOCK(BX,BY)
GOSUB @PRTSCORE

BLOCK(BX,BY)=0
BLOCKC=BLOCKC-1
GX=BLKOX+BX*BLKWX
GY=BLKOY+BY*BLKWY
GFILL GX+1,GY+1,GX+BLKWX-1,GY+BLKWY-1,0

IF SCORE0<SCOREB AND SCORE>=SCOREB THEN BALLC=BALLC+1:GOSUB @PRTBALLC:BEEP BPBONUS
IF BLOCKC==0 THEN CLBLOCK=TRUE

RETURN

'ミス
@RFMISS
GM=GMMISS
RETURN

'*** スコア ヒョウジ ***
@PRTSCORE

COLOR COLSCORE
LOCATE SCOREX,SCOREY
PRINT "SCORE"
LOCATE SCOREX,SCOREY+1
PRINT SCORE
RETURN

'*** ノコリ ボール ヒョウジ ***
@PRTBALLC

COLOR COLBALLC
LOCATE BALLCX,BALLCY
PRINT "BALL"
LOCATE BALLCX,BALLCY+1
PRINT "    "
LOCATE BALLCX,BALLCY+1
FOR I=0 TO BALLC
PRINT "○";
NEXT I
RETURN