主题:[原创]俄罗斯方块
QB71
[专家分:1300] 发布于 2005-01-17 10:27:00
献丑写了一个,源码加些注释稍后贴上
http://upload.programfan.com/2005117720block.rar
回复列表 (共15个回复)
11 楼
gadenflm [专家分:150] 发布于 2009-03-30 20:00:00
SUB CleanSPRITE (UnitInfor AS SPRITE, addX AS INTEGER, addY AS INTEGER)
DIM xTemp AS INTEGER, yTemp AS INTEGER, xPoint AS INTEGER, yPoint AS INTEGER
TempSprite = UnitInfor
SPRITEDirectionChange
xTemp = TempSprite.w: yTemp = TempSprite.h
FOR i = 0 TO yTemp - 1: FOR j = 0 TO xTemp - 1
xPoint = addX + (j + TempSprite.Left - 1) * perWide
yPoint = addY + (i + TempSprite.Top - 1) * perHigh
IF BasePic(TempSprite.sPoint + i * xTemp + j) = 1 THEN LINE (xPoint, yPoint)-(xPoint + perWide, yPoint + perHigh), Grey, BF
NEXT: NEXT
END SUB
12 楼
gadenflm [专家分:150] 发布于 2009-03-30 20:03:00
SUB Control
DIM Time AS SINGLE
DIM cDown AS INTEGER, cLeft AS INTEGER, cRight AS INTEGER
DIM Temp AS INTEGER, ActiveLevel AS INTEGER
DIM TName AS STRING * 6
RANDOMIZE TIMER
NowUnit = PicUnit(CINT(RND * UnitMax))
NextUnit = PicUnit(CINT(RND * UnitMax))
NowUnit.Left = (Wide - NowUnit.w) / 2
NowUnit.Top = 1
NextUnit.Left = 1: NextUnit.Top = 1
CALL DrawBox(Left + 300 - 2, Top + 20 - 2, NextUnit.w * perWide + 4, NextUnit.h * perHigh + 4, TypeLow)
CALL ShowSPRITE(NowUnit, Left, Top)
CALL ShowSPRITE(NextUnit, Left + 300, Top + 20)
DO
Time = 0
isTrue = FALSE
DO
TName = NameCustom
i = isNext
IF i >= 4 THEN cLeft = FALSE: i = i - 4 ELSE cLeft = TRUE
IF i >= 2 THEN cRight = FALSE: i = i - 2 ELSE cRight = TRUE
IF i = 1 THEN cDown = FALSE ELSE cDown = TRUE
SELECT CASE GetKey(GetLast)
CASE KeyUp: CALL CurInfo(2): i = GetMassage(275, 220, "Pause", Red, KeyANY): CALL CurInfo(0)
CASE KeyDown
IF cDown = TRUE THEN
CALL CleanSPRITE(NowUnit, Left, Top)
NowUnit.Top = NowUnit.Top + 1
CALL ShowSPRITE(NowUnit, Left, Top)
END IF
CASE KeyLeft
IF cLeft = TRUE THEN
CALL CleanSPRITE(NowUnit, Left, Top)
NowUnit.Left = NowUnit.Left - 1
CALL ShowSPRITE(NowUnit, Left, Top)
END IF
CASE KeyRight
IF cRight = TRUE THEN
CALL CleanSPRITE(NowUnit, Left, Top)
NowUnit.Left = NowUnit.Left + 1
CALL ShowSPRITE(NowUnit, Left, Top)
END IF
CASE KeyEnter
IF isDirect = TRUE THEN
CALL CleanSPRITE(NowUnit, Left, Top)
NowUnit.Direction = (NowUnit.Direction + 1) MOD 4
CALL ShowSPRITE(NowUnit, Left, Top)
END IF
CASE ASC("h"): Help
CASE ASC("H"): Help
CASE ASC("r"): IF Record%(ReadRecord) <> NewRecord THEN CALL ShowRecord(AttribCustom)
CASE ASC("R"): IF Record%(ReadRecord) <> NewRecord THEN CALL ShowRecord(AttribCustom)
CASE ASC("l"): NameCustom = GetName$(6, 55, 17, Red, "Load Name:", 0, 255, Normal): i = Record%(ReadOther): CALL DialogBox(0): IF i <> NewRecord THEN CALL ShowRecord(i)
CASE ASC("d"): i = Record%(DeleteRecord)
CASE ASC("D"): i = Record%(DeleteRecord)
'CASE KeySpace: CLS : END
CASE KeyESC
IF Choose(55, 17, "Exit", Red) = TRUE THEN
LevelCustom = 0
ScoreCustom = 0
Diffcult = 0
isTrue = TRUE
EXIT SUB
END IF
END SELECT
Time = Time + 1
NameCustom = TName
LOOP UNTIL INT(Time) >= MoveDelay(Diffcult)
13 楼
gadenflm [专家分:150] 发布于 2009-03-30 20:04:00
IF cDown = TRUE THEN
CALL CleanSPRITE(NowUnit, Left, Top)
NowUnit.Top = NowUnit.Top + 1
CALL ShowSPRITE(NowUnit, Left, Top)
ELSE
IF NowUnit.Top = 1 OR Diffcult = MaxDiffcult - 1 THEN
IF NowUnit.Top = 1 THEN t$ = "GAME OVER" ELSE t$ = "YOU WIN"
CALL CurInfo(2): i = GetMassage(275, 220, t$, Red, KeyANY): CALL CurInfo(0)
IF Choose(55, 17, "Save", Red) = TRUE THEN
TempRecord.Score = ScoreCustom
TempRecord.Level = LevelCustom
TempRecord.Names = NameCustom
i = Record%(SaveHighest)
END IF
LevelCustom = 0
ScoreCustom = 0
Diffcult = 0
isTrue = FALSE: EXIT SUB
END IF
TempSprite = NowUnit
SPRITEDirectionChange
FOR i = 0 TO TempSprite.h - 1: FOR j = 0 TO TempSprite.w - 1
IF Table(TempSprite.Top + i, TempSprite.Left + j) = FALSE THEN Table(TempSprite.Top + i, TempSprite.Left + j) = BasePic(TempSprite.sPoint + i * TempSprite.w + j)
NEXT: NEXT
RefurbishScreen
Temp = RefurbishTable
isTrue = TRUE
FOR i = 1 TO Wide
IF Table(High, i) = 1 THEN isTrue = FALSE: EXIT FOR
NEXT
ActiveLevel = ActiveLevel + Temp
IF ActiveLevel >= perLevel THEN ActiveLevel = ActiveLevel - perLevel: Diffcult = Diffcult + 1
LevelCustom = LevelCustom + Temp
ScoreCustom = ScoreCustom + Temp * Temp * (Diffcult + 1)
IF isTrue = TRUE THEN ScoreCustom = ScoreCustom + 20 * (Diffcult + 1)
NowUnit = NextUnit
NowUnit.Left = (Wide - NowUnit.w) / 2
NowUnit.Top = 1
CALL CleanSPRITE(NextUnit, Left + 300, Top + 20)
CALL DrawBox(Left + 300 - 2, Top + 20 - 2, NextUnit.w * perWide + 4, NextUnit.h * perHigh + 4, TypeNothing)
NextUnit = PicUnit(CINT(RND * UnitMax))
NextUnit.Left = 1: NextUnit.Top = 1
CALL DrawBox(Left + 300 - 2, Top + 20 - 2, NextUnit.w * perWide + 4, NextUnit.h * perHigh + 4, TypeLow)
CALL ShowSPRITE(NowUnit, Left, Top)
CALL ShowSPRITE(NextUnit, Left + 300, Top + 20)
COLOR Pin
LOCATE 8, 2: PRINT ScoreCustom
LOCATE 11, 2: PRINT LevelCustom
LOCATE 14, 2: PRINT Diffcult
END IF
LOOP
END SUB
14 楼
gadenflm [专家分:150] 发布于 2009-03-30 20:05:00
太多了,放不下!!
15 楼
甜甜蜜蜜水蜜桃 [专家分:0] 发布于 2009-06-13 19:44:00
IF cDown = TRUE THEN
CALL CleanSPRITE(NowUnit, Left, Top)
NowUnit.Top = NowUnit.Top + 1
CALL ShowSPRITE(NowUnit, Left, Top)
ELSE
IF NowUnit.Top = 1 OR Diffcult = MaxDiffcult - 1 THEN
IF NowUnit.Top = 1 THEN t$ = "GAME OVER" ELSE t$ = "YOU WIN"
CALL CurInfo(2): i = GetMassage(275, 220, t$, Red, KeyANY): CALL CurInfo(0)
IF Choose(55, 17, "Save", Red) = TRUE THEN
TempRecord.Score = ScoreCustom
TempRecord.Level = LevelCustom
TempRecord.Names = NameCustom
i = Record%(SaveHighest)
END IF
LevelCustom = 0
ScoreCustom = 0
Diffcult = 0
isTrue = FALSE: EXIT SUB
END IF
TempSprite = NowUnit
SPRITEDirectionChange
FOR i = 0 TO TempSprite.h - 1: FOR j = 0 TO TempSprite.w - 1
IF Table(TempSprite.Top + i, TempSprite.Left + j) = FALSE THEN Table(TempSprite.Top + i, TempSprite.Left + j) = BasePic(TempSprite.sPoint + i * TempSprite.w + j)
NEXT: NEXT
RefurbishScreen
Temp = RefurbishTable
isTrue = TRUE
FOR i = 1 TO Wide
IF Table(High, i) = 1 THEN isTrue = FALSE: EXIT FOR
NEXT
ActiveLevel = ActiveLevel + Temp
IF ActiveLevel >= perLevel THEN ActiveLevel = ActiveLevel - perLevel: Diffcult = Diffcult + 1
LevelCustom = LevelCustom + Temp
ScoreCustom = ScoreCustom + Temp * Temp * (Diffcult + 1)
IF isTrue = TRUE THEN ScoreCustom = ScoreCustom + 20 * (Diffcult + 1)
NowUnit = NextUnit
NowUnit.Left = (Wide - NowUnit.w) / 2
NowUnit.Top = 1
CALL CleanSPRITE(NextUnit, Left + 300, Top + 20)
CALL DrawBox(Left + 300 - 2, Top + 20 - 2, NextUnit.w * perWide + 4, NextUnit.h * perHigh + 4, TypeNothing)
NextUnit = PicUnit(CINT(RND * UnitMax))
NextUnit.Left = 1: NextUnit.Top = 1
CALL DrawBox(Left + 300 - 2, Top + 20 - 2, NextUnit.w * perWide + 4, NextUnit.h * perHigh + 4, TypeLow)
CALL ShowSPRITE(NowUnit, Left, Top)
CALL ShowSPRITE(NextUnit, Left + 300, Top + 20)
COLOR Pin
LOCATE 8, 2: PRINT ScoreCustom
LOCATE 11, 2: PRINT LevelCustom
LOCATE 14, 2: PRINT Diffcult
END IF
LOOP
END SUB
我来回复