沙发
QB71 [专家分:1300] 发布于 2005-01-17 13:36:00
DECLARE FUNCTION MsgBox% (stil$)
DECLARE SUB GameOver ()
DECLARE SUB BlGet (e AS ANY)
DECLARE SUB BlClear ()
DECLARE SUB BlDraw ()
DECLARE SUB BlInit ()
DECLARE SUB Is.CanDown ()
DECLARE SUB Is.CanLeft ()
DECLARE SUB Is.CanRight ()
DECLARE SUB Is.CanTurnLeft ()
DECLARE SUB Is.CanTurnRight ()
DECLARE SUB MyPrn (X%, Y%, st$, bfclr%, bkclr%, over%)
DECLARE SUB Set.Palete ()
DECLARE SUB SysInit ()
DECLARE SUB Turn.Left (e AS ANY)
DECLARE SUB Turn.Right (e AS ANY)
DECLARE SUB Up.Pset (X%, Y%)
DECLARE SUB XYClear ()
DECLARE SUB XYSet ()
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
' 定义变量
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
TYPE BlType '方块
Wid AS INTEGER '宽度
Hei AS INTEGER '高度
Bit AS STRING * 6 '形状
END TYPE
'-------------------------------
'按键值
CONST KeyLeft% = 75, KeyRight% = 77, KeyDown% = 80, KeyA% = 65
CONST KeyS% = 83, KeyEsc% = 27, KeySpace% = 32, KeyPgDn% = 81, KeyPgUp% = 73
'-------------------------------
CONST False = 0, True = NOT False '真假值
CONST Bgnx% = 10, Bgny% = 0 '方块初始位置
CONST BackClr% = 10 '背景色
CONST bordx% = 60, Bordy% = 50 '桶左上边界
CONST Pexx% = 16, Pexy% = 16 '方块高宽
CONST Hei% = 24, Wid% = 24 '桶高宽
DIM SHARED Works AS LONG '积分数
DIM SHARED Fast% '方块下落的速度
DIM SHARED BPic(32) AS LONG '方块样式
REDIM SHARED Xy(Hei%, Wid%) AS INTEGER'桶方块数据
DIM SHARED Bl(11) AS BlType '方块形状数组
DIM SHARED CurBl AS BlType '当前方块
DIM SHARED NextBl AS BlType '下一方块
DIM SHARED Blx%, Bly% '当前方块位置
DIM SHARED Staring% '游戏是否开始变量
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
DEFINT A-Z
SCREEN 12
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
'程序开始了
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Fast% = 10
SysInit
BlInit '初始化方块
DEF SEG = 65
WHILE Quit% = False '等待按键
'---------------------------------------
NewTime% = PEEK(92) '取时间间隔
IF OldTime% > NewTime% THEN OldTime% = 0
IF NewTime% > OldTime% + Fast% AND Staring% THEN
OldTime% = NewTime%
Is.CanDown
END IF
'---------------------------------------
ikey$ = INKEY$: KeyCode% = -1 '取按键
IF ikey$ <> "" THEN
IF LEN(ikey$) = 2 THEN
KeyCode% = ASC(MID$(ikey$, 2, 1))
ELSE : KeyCode% = ASC(UCASE$(ikey$))
END IF
END IF
'---------------------------------------
IF KeyCode% > 0 THEN '处理按键
SELECT CASE KeyCode%
CASE KeyLeft% '左移
IF Staring% THEN CALL Is.CanLeft
CASE KeyRight% '右移
IF Staring% THEN CALL Is.CanRight
CASE KeyDown% '下落
IF Staring% THEN CALL Is.CanDown
CASE KeyA% '左旋转
IF Staring% THEN CALL Is.CanTurnLeft
CASE KeyS% '右旋转
IF Staring% THEN CALL Is.CanTurnRight
CASE KeyEsc% '退出程序
Quit% = True
CASE KeySpace% '暂停/开始
Staring% = NOT Staring%
CASE KeyPgDn% '减速
IF Fast% < 10 THEN
Fast% = Fast% + 1
M$ = LTRIM$(RTRIM$(STR$(10 - Fast%)))
LINE (500, 390)-(520, 407), BackClr%, BF
MyPrn 501, 391, M$, 13, BackClr%, 0
MyPrn 500, 390, M$, 4, 0, 0
END IF
CASE KeyPgUp% '加速
IF Fast% > 0 THEN
Fast% = Fast% - 1
M$ = LTRIM$(RTRIM$(STR$(10 - Fast%)))
LINE (500, 390)-(520, 407), BackClr%, BF
MyPrn 501, 391, M$, 13, BackClr%, 0
MyPrn 500, 390, M$, 4, 0, 0
END IF
END SELECT
END IF
'---------------------------------------
WEND
END
DATA 0,0,0,0,0,0,0,0,0,64,0,48,0,60,63,254,0,60,0,48,0,64,0,0,0,0,0,0,0,0,0,0
DATA 0,0,0,0,0,0,0,0,1,0,6,0,30,0,63,254,30,0,6,0,1,0,0,0,0,0,0,0,0,0,0,0
DATA 0,0,0,128,0,128,0,128,0,128,0,128,0,128,0,128,0,128,4,144,3,224,3,224,1,192,1,192,0,128,0,0
DATA 17,0,17,0,17,0,35,252,34,4,100,8,168,64,32,64,33,80,33,72,34,76,36,68,32,64,32,64,33,64,32,128
DATA 1,0,17,0,17,0,17,16,31,248,33,0,65,0,1,4,255,254,1,0,2,128,2,128,4,64,8,48,16,14,96,4
DATA 4,64,126,64,68,68,84,126,84,136,85,8,84,72,84,72,84,72,84,80,84,80,16,32,40,80,36,142,69,4,130,0
DATA 0,0,127,248,0,16,0,32,0,64,1,128,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,5,0,2,0
DATA 16,64,16,32,16,0,19,254,250,2,20,68,16,64,63,254,208,136,16,136,17,8,16,144,16,96,16,80,80,140,35,4
DATA 16,32,18,32,34,32,35,36,74,172,250,112,18,32,35,252,66,32,250,112,66,172,3,36,26,32,226,36,67,254,0,0
DATA 16,64,16,80,35,248,32,64,72,64,255,252,17,36,32,168,66,32,249,36,7,254,0,64,28,96,224,144,65,12,2,4
DATA 3,248,66,8,50,8,19,248,2,8,2,8,243,252,18,8,18,208,18,32,18,144,19,12,18,4,40,0,68,6,3,252
DATA 1,0,1,0,33,8,33,8,33,8,33,8,63,248,33,8,1,0,65,4,65,4,65,4,65,4,65,4,127,252,64,4
DATA 16,16,8,24,4,32,4,72,127,252,1,0,1,0,1,4,255,254,1,0,2,128,2,128,4,64,8,48,48,14,192,4
DATA 2,0,2,32,3,240,2,0,2,0,2,4,255,254,2,0,2,0,2,128,2,96,2,48,2,16,2,0,2,0,2,0
DATA 4,0,14,4,120,254,8,132,8,132,254,132,8,132,24,132,28,252,42,132,40,0,72,136,136,196,9,6,10,2,8,0
DATA 0,128,4,128,4,64,8,64,8,32,16,16,32,8,79,238,132,36,4,32,4,32,4,32,4,32,8,32,17,64,32,128
DATA 16,0,16,0,16,4,18,126,255,68,18,68,18,68,18,68,18,68,34,68,34,68,34,68,34,68,74,124,132,68,0,0
DATA 16,128,16,128,16,128,16,136,91,252,84,136,80,136,144,136,16,136,31,254,16,128,17,64,17,32,18,16,20,14,24,4
DATA 0,16,64,24,48,20,23,254,4,16,4,16,13,208,20,20,37,212,229,84,37,84,37,88,37,208,37,42,8,70,16,130
DATA 19,248,18,8,19,248,90,8,87,248,80,4,151,254,20,164,20,164,23,252,16,0,19,248,17,16,16,224,17,24,22,6
DATA 0,4,255,254,2,0,2,0,2,0,2,128,2,64,2,48,2,16,2,0,2,0,2,0,2,0,2,0,2,0,2,0
DATA 8,32,8,36,255,254,9,32,65,248,35,16,36,160,128,64,73,176,18,14,47,252,226,8,34,8,34,8,35,248,34,8
DATA 2,0,2,0,2,4,255,254,4,0,4,0,8,0,8,8,31,252,40,8,72,8,136,8,8,8,8,8,15,248,8,8
DATA 8,64,28,64,240,252,17,132,18,72,252,48,16,96,57,160,52,62,84,66,144,196,17,36,16,24,16,48,16,192,23,0
DATA 2,0,2,0,2,8,255,252,4,0,4,0,4,0,8,16,15,248,16,128,16,128,32,128,64,128,128,132,127,254,0,0
DATA 8,32,9,168,15,36,17,32,17,36,63,254,81,32,145,32,17,164,19,24,29,16,17,48,17,72,17,138,21,6,18,2
DATA 0,4,127,254,68,68,68,68,68,68,127,252,66,4,2,0,7,240,8,16,20,32,98,192,1,0,6,0,24,0,224,0
DATA 34,8,34,28,127,96,34,64,34,64,62,64,34,126,34,72,62,72,34,72,34,72,255,72,0,136,21,8,34,8,64,8
DATA 4,0,3,0,1,0,0,4,255,254,4,0,4,16,7,248,4,16,4,16,4,16,8,16,8,16,16,16,32,160,64,64
DATA 16,128,16,128,16,128,16,136,19,252,252,136,16,136,16,136,16,136,23,254,28,128,241,64,65,32,2,16,4,14,8,4
DATA 8,64,28,64,240,64,16,64,17,68,253,76,17,80,50,64,56,64,84,160,80,160,145,16,17,8,18,14,20,4,24,0
DATA 0,16,63,248,32,16,40,80,36,80,34,144,34,144,33,16,33,16,34,144,34,144,36,80,40,80,48,18,64,10,128,6
DATA 16,12,126,240,16,128,40,132,126,254,8,144,254,144,9,16,10,16,0,16,31,248,16,16,31,240,16,16,31,240,16,16
DATA 16,128,16,72,23,252,32,0,35,248,98,8,163,248,32,0,47,254,40,2,51,244,32,64,32,64,32,64,33,64,32,128
DATA 0,8,127,252,8,32,8,32,8,32,8,32,8,36,255,254,8,32,8,32,8,32,8,32,16,32,16,32,32,32,64,32
DATA 16,64,16,64,16,64,16,128,252,136,37,4,39,254,36,2,36,4,73,254,41,4,17,4,41,4,69,4,133,252,1,4
DATA 32,128,16,132,20,254,254,128,33,0,34,254,60,34,36,36,36,160,36,168,36,188,36,160,68,160,85,96,138,38,4,28
DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,4,255,254,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
'---------------------------------------------
DATA 0,0,56,108,198,198,214,214,198,198,108,56,0,0,0,0
DATA 0,0,24,56,120,24,24,24,24,24,24,126,0,0,0,0
DATA 0,0,124,198,6,12,24,48,96,192,198,254,0,0,0,0
DATA 0,0,124,198,6,6,60,6,6,6,198,124,0,0,0,0
DATA 0,0,12,28,60,108,204,254,12,12,12,30,0,0,0,0
DATA 0,0,254,192,192,192,252,6,6,6,198,124,0,0,0,0
DATA 0,0,56,96,192,192,252,198,198,198,198,124,0,0,0,0
DATA 0,0,254,198,6,6,12,24,48,48,48,48,0,0,0,0
DATA 0,0,124,198,198,198,124,198,198,198,198,124,0,0,0,0
DATA 0,0,124,198,198,198,126,6,6,6,12,120,0,0,0,0
DATA 0,0,0,0,0,0,0,0,0,24,24,24,48,0,0,0
DATA 0,0,0,0,0,126,0,0,126,0,0,0,0,0,0,0
DATA 0,0,0,0,2,6,12,24,48,96,192,128,0,0,0,0
DATA 0,0,0,0,0,0,0,0,0,0,24,24,0,0,0,0
DATA 0,0,12,24,48,48,48,48,48,48,24,12,0,0,0,0
DATA 0,0,48,24,12,12,12,12,12,12,24,48,0,0,0,0
DATA 0,0,0,0,24,24,0,0,0,24,24,0,0,0,0,0
DATA 0,0,124,198,198,96,56,12,6,198,198,124,0,0,0,0
DATA 0,0,0,0,0,220,102,102,102,102,102,124,96,96,240,0
DATA 0,0,0,0,0,120,12,124,204,204,204,118,0,0,0,0
DATA 0,0,0,0,0,124,198,192,192,192,198,124,0,0,0,0
DATA 0,0,0,0,0,124,198,254,192,192,198,124,0,0,0,0
DATA 0,0,254,102,98,104,120,104,96,98,102,254,0,0,0,0
DATA 0,0,0,0,0,124,198,96,56,12,198,124,0,0,0,0
DATA 0,0,252,102,102,102,124,96,96,96,96,240,0,0,0,0
DATA 0,0,0,0,0,118,204,204,204,204,204,124,12,204,120,0
DATA 0,0,198,198,198,198,198,198,198,198,198,124,0,0,0,0
DATA 0,0,248,108,102,102,102,102,102,102,108,248,0,0,0,0
DATA 0,0,0,0,0,220,102,102,102,102,102,102,0,0,0,0
DATA 0,0,60,102,194,192,192,192,192,194,102,60,0,0,0,0
DATA 0,0,0,0,0,124,198,198,198,198,198,124,0,0,0,0
DATA 0,0,0,0,0,198,198,198,198,198,198,126,6,12,248,0
DATA 0,0,252,102,102,102,124,108,102,102,102,230,0,0,0,0
DATA 0,0,24,24,0,56,24,24,24,24,24,60,0,0,0,0
DATA 0,0,224,96,96,108,118,102,102,102,102,230,0,0,0,0
DATA 0,0,16,48,48,252,48,48,48,48,54,28,0,0,0,0
DATA 0,0,16,56,108,198,198,254,198,198,198,198,0,0,0,0
DATA 0,0,198,198,198,198,198,198,198,108,56,16,0,0,0,0
SUB BlClear
'擦除当前位置的方块
N% = 1
FOR Y% = 0 TO CurBl.Hei - 1
FOR X% = 0 TO CurBl.Wid - 1
IF MID$(CurBl.Bit, N%, 1) = "1" THEN
Rx% = (X% + Blx%) * Pexx% + bordx%
Ry% = (Y% + Bly%) * Pexy% + Bordy%
LINE (Rx%, Ry%)-(Rx% + 15, Ry% + 15), 0, BF
END IF
N% = N% + 1
NEXT
NEXT
END SUB
SUB BlDraw
'画当前位置的方块
N% = 1
FOR Y% = 0 TO CurBl.Hei - 1
FOR X% = 0 TO CurBl.Wid - 1
IF MID$(CurBl.Bit, N%, 1) = "1" THEN
Ry% = (Bly% + Y%) * Pexx% + Bordy%
Rx% = (Blx% + X%) * Pexy% + bordx%
PUT (Rx%, Ry%), BPic, PSET
END IF
N% = N% + 1
NEXT
NEXT
END SUB
SUB BlGet (e AS BlType)
'随机生成一个方块并随机旋转位置
RANDOMIZE TIMER
N% = INT(RND * 11)
e = Bl(N%)
N% = INT(RND * 4)
FOR i% = 1 TO N%: Turn.Left e: NEXT
END SUB
SUB BlInit
IF NextBl.Wid = 0 THEN
BlGet NextBl
BlGet CurBl
ELSE
CurBl = NextBl
BlGet NextBl
END IF
'-------------------------
Blx% = Bgnx%: Bly% = Bgny%
CALL BlDraw
LINE (460, 70)-(524, 134), BackClr%, BF
N% = 1
FOR Y% = 0 TO NextBl.Hei - 1
FOR X% = 0 TO NextBl.Wid - 1
IF MID$(NextBl.Bit, N%, 1) = "1" THEN
PUT (X% * Pexx% + 461, Y% * Pexy% + 70), BPic, PSET
END IF
N% = N% + 1
NEXT
NEXT
END SUB
SUB GameOver
M% = MsgBox("你失败了,按Space继续,Esc退出")
IF M% THEN
REDIM Xy(Hei%, Wid%) AS INTEGER'桶方块数据
Fast% = 10: NextBl.Wid = 0
LINE (bordx%, Bordy%)-(bordx% + Wid% * Pexx%, Bordy% + Hei% * Pexy%), 0, BF
M$ = LTRIM$(RTRIM$(STR$(10 - Fast%)))
LINE (500, 390)-(520, 407), BackClr%, BF
MyPrn 501, 391, M$, 13, BackClr%, 0
MyPrn 500, 390, M$, 4, 0, 0
Works& = 0
M$ = LTRIM$(RTRIM$(STR$(Works&)))
LINE (500, 360)-(550, 377), BackClr%, BF
MyPrn 501, 361, M$, 13, BackClr%, 0
MyPrn 500, 360, M$, 4, 0, 0
Staring% = -1
CALL BlInit
ELSE
END
END IF
END SUB
SUB Is.CanDown
'判断当前方块是否能够下落,并处理之
IF Bly% + CurBl.Hei > Hei% - 1 THEN '已经到达底部
CALL XYSet
CALL XYClear
CALL BlInit
EXIT SUB
END IF
N% = 1
FOR Y% = 0 TO CurBl.Hei - 1 '看是否能下落
FOR X% = 0 TO CurBl.Wid - 1
IF Xy(X% + Blx%, Bly% + Y% + 1) AND MID$(CurBl.Bit, N%, 1) = "1" THEN
IF Bly% = 0 THEN
CALL GameOver
EXIT SUB
END IF
CALL XYSet
CALL XYClear
CALL BlInit
EXIT SUB
END IF
N% = N% + 1
NEXT
NEXT
'能下落,将方块下移一格
CALL BlClear
Bly% = Bly% + 1
CALL BlDraw
END SUB
SUB Is.CanLeft
'判断当前方块是否能够左移
IF Blx% = 0 THEN EXIT SUB '己到达最左边
N% = 1
FOR Y% = 0 TO CurBl.Hei - 1 '看是否能向左移
FOR X% = 0 TO CurBl.Wid - 1
IF Xy(Blx% + X% - 1, Bly% + Y%) AND MID$(CurBl.Bit, N%, 1) = "1" THEN
EXIT SUB
END IF
N% = N% + 1
NEXT
NEXT
'左移一格
CALL BlClear
Blx% = Blx% - 1
CALL BlDraw
END SUB
SUB Is.CanRight
'判断当前方块是否能够右移
IF Blx% + CurBl.Wid > Wid% - 1 THEN EXIT SUB '已经到达最右边
N% = 1
FOR Y% = 0 TO CurBl.Hei - 1 '看是否能右移
FOR X% = 0 TO CurBl.Wid - 1
IF Xy(Blx% + X% + 1, Bly% + Y%) AND MID$(CurBl.Bit, N%, 1) = "1" THEN
EXIT SUB
END IF
N% = N% + 1
NEXT
NEXT
'方块向右移一格
CALL BlClear
Blx% = Blx% + 1
CALL BlDraw
END SUB
SUB Is.CanTurnLeft
'判断当前方块是否能够向左旋转
Turn.Left CurBl '先向左旋转看再说
'超出边界,无法旋转
IF CurBl.Hei + Bly% > Hei% THEN : Turn.Right CurBl: EXIT SUB
IF CurBl.Wid + Blx% > Wid% THEN : Turn.Right CurBl: EXIT SUB
N% = 1
FOR Y% = 0 TO CurBl.Hei - 1 '未出边界,看是否能够旋过去
FOR X% = 0 TO CurBl.Wid - 1
IF MID$(CurBl.Bit, N%, 1) = "1" AND Xy(Blx% + X%, Bly% + Y) THEN
Turn.Right CurBl '旋不过去,转回原来形状
EXIT SUB
END IF
N% = N% + 1
NEXT
NEXT
'可能旋转,将方块旋转并放到最后的位置
Turn.Right CurBl
CALL BlClear
Turn.Left CurBl
CALL BlDraw
END SUB
SUB Is.CanTurnRight
'判断当前方块是否能够向右旋转
Turn.Right CurBl '先向右转了再说
'超出边界,无法旋转,转回去
IF CurBl.Hei + Bly% > Hei% THEN : Turn.Left CurBl: EXIT SUB
IF CurBl.Wid + Blx% > Wid% THEN : Turn.Left CurBl: EXIT SUB
N% = 1
FOR Y% = 0 TO CurBl.Hei - 1 '未出边界,看是否可能转
FOR X% = 0 TO CurBl.Wid - 1
IF MID$(CurBl.Bit, N%, 1) = "1" AND Xy(Blx% + X%, Bly% + Y) THEN
Turn.Left CurBl '有方块挡着,转回去
EXIT SUB
END IF
N% = N% + 1
NEXT
NEXT
'可能旋转,旋转后并把方块放到最后位置
Turn.Left CurBl
CALL BlClear
Turn.Right CurBl
CALL BlDraw
END SUB
FUNCTION MsgBox (stil$)
N% = LEN(stil$) * 8
LINE (bordx% + 100, 220)-(bordx% + N% + 116, 244), 14, B
PAINT (bordx% + 102, 222), 9, 14
MyPrn bordx% + 108, 224, stil$, 15, 0, 0
WHILE Quit% = 0
ikey$ = INKEY$
IF ikey$ = CHR$(27) THEN EXIT FUNCTION
IF ikey$ = CHR$(32) THEN MsgBox = -1: EXIT FUNCTION
WEND
END FUNCTION
SUB MyPrn (X%, Y%, st$, bfclr%, bkclr%, over%)
CONST Hz$ = "→←↓你失败了按继续退出关卡积分加快减慢下落右移左俄罗斯方块秋风暂停开始旋一"
CONST Dig$ = "0123456789,=/.():SpaceEsPgUDnCoyRihtAV"
STATIC Digs() AS INTEGER, Hzs() AS INTEGER
'76.37
IF LEN(st$) = 0 THEN EXIT SUB
Slen% = LEN(st$)
IF over% <> 0 THEN LINE (X%, Y%)-(X% + Slen% * 8, Y% + 16), bkclr%, BF
'************************************************************************
STATIC Lc%
IF Lc% = 0 THEN
N% = LEN(Hz$) / 2: M% = LEN(Dig$): Lc% = 1
REDIM Hzs(N%, 32) AS INTEGER, Digs(M%, 16) AS INTEGER
FOR i% = 0 TO N% - 1
FOR J% = 0 TO 31: READ Hzs(i%, J%): NEXT
NEXT
FOR i% = 0 TO M% - 1
FOR J% = 0 TO 15: READ Digs(i%, J%): NEXT
NEXT
END IF
'************************************************************************
Rx% = X%: N% = 1
WHILE N% <= Slen%
B$ = MID$(st$, N%, 1)
Byte% = ASC(B$)
IF Byte% < 161 AND Byte% > 32 THEN
Nober% = INSTR(Dig$, B$) - 1
FOR i% = 0 TO 15
LINE (Rx%, Y% + i%)-(Rx% + 7, Y% + i%), bfclr%, B, Digs(Nober%, i%)
NEXT
END IF
'===================================================================
IF Byte% >= 161 AND N% <> Slen% THEN
T$ = MID$(st$, N%, 2)
Nober% = (INSTR(Hz$, T$) - 1) / 2
FOR i% = 0 TO 15
LINE (Rx%, Y% + i%)-(Rx% + 7, Y% + i%), bfclr%, B, Hzs(Nober%, i% * 2)
LINE (Rx% + 8, Y% + i%)-(Rx% + 15, Y% + i%), bfclr%, B, Hzs(Nober%, i% * 2 + 1)
NEXT
N% = N% + 1: Rx% = Rx% + 8
END IF
N% = N% + 1: Rx% = Rx% + 8
WEND
END SUB
SUB Set.Palete
'设置调色板
STATIC rgb() AS INTEGER
STATIC Lc%
IF Lc% = 0 THEN
Lc% = 1
REDIM rgb(16, 3) AS INTEGER
OUT &H3C6, 255
FOR i = 0 TO 15
OUT &H3C7, i
rgb(i, 0) = INP(&H3C9)
rgb(i, 1) = INP(&H3C9)
rgb(i, 2) = INP(&H3C9)
NEXT
Clr# = 63 / 13
FOR i% = 1 TO 13
OUT &H3C8, i%
OUT &H3C9, i% * Clr#
OUT &H3C9, i% * Clr#
OUT &H3C9, i% * Clr#
NEXT
'-----------------
OUT &H3C8, 14
OUT &H3C9, 63
OUT &H3C9, 0
OUT &H3C9, 0
'-----------------
OUT &H3C8, 15
OUT &H3C9, 10
OUT &H3C9, 10
OUT &H3C9, 63
'-----------------
EXIT SUB
END IF
OUT &H3C6, 255
FOR i = 0 TO 15
OUT &H3C8, i
OUT &H3C9, rgb(i, 0)
OUT &H3C9, rgb(i, 1)
OUT &H3C9, rgb(i, 2)
NEXT
END SUB
SUB SysInit
'初始化程序
Set.Palete
'-------------------------
'先画一个方块图形保存起来
LINE (0, 0)-(15, 15), 15, B
PAINT (1, 1), 9, 15
FOR i% = 1 TO 13 STEP 3
Up.Pset i%, 1
Up.Pset i%, 13
NEXT
FOR i% = 1 TO 13 STEP 3
Up.Pset 1, i%
Up.Pset 13, i%
NEXT
GET (0, 0)-(15, 15), BPic
'这是方块的形状,共有11个
'==========================================================================
' [] [] [] [] [] [][] [] [][] [][]
'[][][][] [][][] [][][] [] [][][] [][][] [][] [][] [] [][] [][]
'(0) (1) (2) (3) (4) (5) (6) (7) (8) (9) (10)
'==========================================================================
'下面是各个方块形状的数据
Bl(0).Wid = 4: Bl(0).Hei = 1: Bl(0).Bit = "1111"
Bl(1).Wid = 3: Bl(1).Hei = 2: Bl(1).Bit = "001111"
Bl(2).Wid = 3: Bl(2).Hei = 2: Bl(2).Bit = "100111"
Bl(3).Wid = 1: Bl(3).Hei = 1: Bl(3).Bit = "1"
Bl(4).Wid = 3: Bl(4).Hei = 2: Bl(4).Bit = "010111"
Bl(5).Wid = 3: Bl(5).Hei = 2: Bl(5).Bit = "101111"
Bl(6).Wid = 2: Bl(6).Hei = 1: Bl(6).Bit = "11"
Bl(7).Wid = 2: Bl(7).Hei = 2: Bl(7).Bit = "1111"
Bl(8).Wid = 2: Bl(8).Hei = 2: Bl(8).Bit = "0110"
Bl(9).Wid = 3: Bl(9).Hei = 2: Bl(9).Bit = "011110"
Bl(10).Wid = 3: Bl(10).Hei = 2: Bl(10).Bit = "110011"
'==========================================================================
'先画好桶
CLS
FOR i% = 2 TO 6
LINE (50 - i%, 10 - i%)-(550 + i%, 470 + i%), 11 - i%, B
NEXT
PAINT (100, 100), BackClr%, 9
LINE (bordx% - 1, Bordy% - 1)-(bordx% + 384, Bordy% + 384), 0, BF
FOR i% = 2 TO 6
LINE (bordx% - i%, Bordy% - 1)-(bordx% - i%, Bordy% + Hei% * Pexy% + i% - 1), i% + 3
LINE (bordx% + i% + Wid% * Pexx% - 1, Bordy% - 1)-(bordx% + i% + Wid% * Pexx% - 1, Bordy% + Hei% * Pexy% + i% - 1), i% + 3
NEXT
FOR i% = 2 TO 6
LINE (bordx% - i% + 1, Bordy% + Hei% * Pexy% + i% - 1)-(bordx% + Wid% * Pexx% + i% - 1, Bordy% + Hei% * Pexy% + i% - 1), i% + 3
NEXT
'==========================================================================
'界面
MyPrn 130, 20, "俄罗斯方块 V1.0 秋风 CopyRight(C) 2005.1", 13, 0, 0
MyPrn 129, 19, "俄罗斯方块 V1.0 秋风 CopyRight(C) 2005.1", 4, 0, 0
MyPrn 180, 445, "SPACE 暂停/开始", 13, 0, 0
MyPrn 179, 444, "SPACE 暂停/开始", 0, 0, 0
MyPrn 460, 50, "下一方块", 13, 0, 0
MyPrn 459, 49, "下一方块", 3, 0, 0
MyPrn 461, 151, " A 左旋", 13, 0, 0
MyPrn 460, 150, " A 左旋", 4, 0, 0
MyPrn 461, 181, " S 右旋", 13, 0, 0
MyPrn 460, 180, " S 右旋", 4, 0, 0
MyPrn 461, 211, "← 左移", 13, 0, 0
MyPrn 460, 210, "← 左移", 4, 0, 0
MyPrn 461, 241, "→ 右移", 13, 0, 0
MyPrn 460, 240, "→ 右移", 4, 0, 0
MyPrn 461, 271, "↓ 下落", 13, 0, 0
MyPrn 460, 270, "↓ 下落", 4, 0, 0
MyPrn 461, 301, "PgUp 加快", 13, 0, 0
MyPrn 460, 300, "PgUp 加快", 4, 0, 0
MyPrn 461, 331, "PgDn 减慢", 13, 0, 0
MyPrn 460, 330, "PgDn 减慢", 4, 0, 0
MyPrn 461, 361, "积分=0", 13, 0, 0
MyPrn 460, 360, "积分=0", 4, 0, 0
M$ = LTRIM$(RTRIM$(STR$(10 - Fast%)))
MyPrn 461, 391, "关卡=" + M$, 13, 0, 0
MyPrn 460, 390, "关卡=" + M$, 4, 0, 0
END SUB
SUB Turn.Left (e AS BlType)
'将方块向左旋转
DIM T AS STRING * 6
N% = 1
FOR i% = 1 TO e.Hei
FOR J% = 1 TO e.Wid
M% = (e.Wid - J%) * e.Hei + i%
IF MID$(e.Bit, N%, 1) = "1" THEN
MID$(T$, M%, 1) = "1"
ELSE
MID$(T$, M%, 1) = "0"
END IF
N% = N% + 1
NEXT
NEXT
SWAP e.Hei, e.Wid
e.Bit = T$
END SUB
SUB Turn.Right (e AS BlType)
'将方块向右旋转
DIM T AS STRING * 6
N% = 1
FOR i% = 1 TO e.Hei
FOR J% = 1 TO e.Wid
M% = J% * e.Hei - i% + 1
IF MID$(e.Bit, N%, 1) = "1" THEN
MID$(T$, M%, 1) = "1"
ELSE
MID$(T$, M%, 1) = "0"
END IF
N% = N% + 1
NEXT
NEXT
SWAP e.Hei, e.Wid
e.Bit = T$
END SUB
SUB Up.Pset (X%, Y%)
PSET (X%, Y%), 12
PSET (X%, Y% + 1), 6
PSET (X% + 1, Y%), 5
PSET (X% + 1, Y% + 1), 0
END SUB
SUB XYClear
'判断当前方块填充后是否已满
FOR Y% = Bly% + CurBl.Hei - 1 TO Bly% STEP -1 '只看当前方块高度
N% = 0
FOR X% = 0 TO Wid - 1
IF Xy(X%, Y%) THEN N% = N% + 1
NEXT
IF N% = Wid% THEN '满了,清除并下移上面的方块
Works& = Works& + 35
M$ = LTRIM$(RTRIM$(STR$(Works&)))
LINE (500, 360)-(550, 377), BackClr%, BF
MyPrn 501, 361, M$, 13, BackClr%, 0
MyPrn 500, 360, M$, 4, 0, 0
IF Works& MOD 700 = 0 THEN
Fast% = Fast% - 1
M$ = LTRIM$(RTRIM$(STR$(10 - Fast%)))
LINE (500, 390)-(520, 407), BackClr%, BF
MyPrn 501, 391, M$, 13, BackClr%, 0
MyPrn 500, 390, M$, 4, 0, 0
END IF
IF Fast% = 0 THEN
END IF
FOR i% = Y% TO 1 STEP -1
FOR J% = 0 TO Wid% - 1
Xy(J%, i%) = Xy(J%, i% - 1)
Rx% = J% * Pexx% + bordx%
Ry% = i% * Pexy% + Bordy%
IF Xy(J%, i%) THEN
PUT (Rx%, Ry%), BPic, PSET
ELSE
LINE (Rx%, Ry%)-(Rx% + 15, Ry% + 15), 0, BF
END IF
NEXT
NEXT
Y% = Y% + 1
END IF
NEXT
END SUB
SUB XYSet
'方块最后停在这个位置,把数据写到数组
N% = 1
FOR Y% = 0 TO CurBl.Hei - 1
FOR X% = 0 TO CurBl.Wid - 1
IF MID$(CurBl.Bit, N%, 1) = "1" THEN
Xy(X% + Blx%, Y% + Bly%) = 1
END IF
N% = N% + 1
NEXT
NEXT
END SUB