回 帖 发 新 帖 刷新版面

主题:[原创]俄罗斯方块

献丑写了一个,源码加些注释稍后贴上
http://upload.programfan.com/2005117720block.rar

回复列表 (共15个回复)

11 楼


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 楼


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 楼

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 楼

太多了,放不下!!

15 楼

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

我来回复

您尚未登录,请登录后再回复。点此登录或注册