'ブロック崩し
'操作方法
'←と→キーだけ。

#N88BASIC

Const Xmax = 21
Const Ymax = 22
Const KABE=99
Const BALL=100
Const BAN=101

Dim map[Xmax,Ymax]'マップ情報
Dim k'のこりブロック数
Dim I$, x , y ,a'汎用
Dim c, wait'速度制御
Dim sx, sy'盤の位置
Dim bx, by 'ボールの位置
Dim bv, bh 'ボールの向き
Dim dflag'デバッグモード
dflag=0

Goto *MAIN

'----------------------------
' サブルーチンここから
'----------------------------

'初期化
*INIT
'変数の初期化
c=0
wait=8
bx=10:by=18
sx=10:sy=19
bh=-1:bv=1
'マップの初期化
For y=1 To Ymax
map[1 ,y]=KABE
map[Xmax,y]=KABE
Next
For x=1 To Xmax
map[x ,1]=KABE
map[x,Ymax]=KABE
Next
For y=4 To 9
For x=2 To Xmax-1
map[x ,y]=y-3
Next
Next
For x=1 To Xmax
map[x ,1]=KABE
Next
map[bx,by]=BALL
map[sx-1,sy]=BAN
map[sx,sy]=BAN
map[sx+1,sy]=BAN
Return

'描写
*DRAW
k=0
For y=1 To Ymax
For x=1 To Xmax
Locate x,y
Select Case map[x,y]
Case KABE
Print "X"
Case BALL
Print "o"
Case BAN
Print "="
Case 0
Print " "
Case Else
Color map[x,y],0
Print "X"
k=k+1
Color 7,0
End Select
Next
Next
If dflag=1 Then
Locate 25, 5,:Print bx,by
Locate 25, 6:Print bv, bh
Locate 25, 7:Print sx,sy
Locate 25, 8:Print k

End If
Return

'盤の移動
*MOV
If map[sx+2*a, sy] = 0 Then
map[sx-1*a,sy] =0
map[sx+2*a, sy]=BAN
sx=sx+a
End If
Return

'ボールの移動
*BALLMOV
If by > sy+1 Then *GAMEOVER
If map[bx+bh, by+bv]<>0 Then'壁に当たったら
'反転
If map[bx+bh,by]<>0 Then bh=bh*-1
If map[bx,by+bv]<>0 Then bv=bv*-1
If map[bx+bh, by+bv]<>0 Then bv=bv*-1: bh=bh*Sgn(Rnd()-.5)
End If
If map[bx-bh, by-bv]>0 And map[bx-bh, by-bv]<7 Then map[bx-bh, by-bv]=0
If map[bx, by-bv]>0 And map[bx, by-bv]<7 Then map[bx, by-bv]=0
map[bx,by]=0
bx=bx+bh
by=by+bv
map[bx,by]=BALL
Return
'----------------------------
' サブルーチンここまで
'----------------------------

'----------------------------
' メインルーチンここから
'----------------------------
*MAIN
GoSub *INIT

Do
GoSub *DRAW
I$=""
I$=Inkey$()
Select Case Asc(I$)
Case VK_LEFT
a=-1
GoSub *MOV
Case VK_RIGHT
a=+1
GoSub *MOV
End Select
c=c+1
If c=wait Then
GoSub *BALLMOV
c=0
End If
Loop While k

*GAMEOVER
Cls 3
Print "G A M E O V E R"
INPUT I$
End
'----------------------------
' メインルーチンここまで
'----------------------------