Tässä oma versioni tetriksestä.
Pitäisi toimia kaikilla qb-versioilla.
Päivitetty 27.7.07: korjattu palikan ujutusongelma(lisätty aliohjelma nimeltä pohja).
Päivitetty 19.4.11: pientä koodin ja ulkoasun viilausta, lisätty varjopalikka
'
'  T E R Z I S  versio 0.8
'
'  Pelataan nuolinäppäimillä, esc lopettaa
'  Tehnyt Tero Ristolainen 2007-2011
'
'_FULLSCREEN 'qb64-komento
RANDOMIZE TIMER
Aleveys% = 12 ' Kentän leveys
AKorkeus% = 22 ' Kentän korkeus
Tyhjarivi$ = "XXXX" + SPACE$(Aleveys%) + "XXXX"
DIM f%(AKorkeus%)
DIM K$(AKorkeus% + 4)
DIM P$(28)
Alku:
SCREEN 12: CLS
blue = 43: green = 0: red = 0 ' määritetään värit
PALETTE 1, 65536 * blue + 256 * green + red ' sininen
blue = 63: green = 0: red = 0
PALETTE 6, 65536 * blue + 256 * green + red
blue = 0: green = 0: red = 43
PALETTE 2, 65536 * blue + 256 * green + red ' punainen
blue = 0: green = 0: red = 60
PALETTE 7, 65536 * blue + 256 * green + red
blue = 0: green = 43: red = 43
PALETTE 3, 65536 * blue + 256 * green + red ' keltainen
blue = 0: green = 63: red = 63
PALETTE 8, 65536 * blue + 256 * green + red
blue = 0: green = 43: red = 0
PALETTE 4, 65536 * blue + 256 * green + red ' vihreä
blue = 0: green = 63: red = 0
PALETTE 9, 65536 * blue + 256 * green + red
blue = 43: green = 0: red = 43
PALETTE 5, 65536 * blue + 256 * green + red ' violetti
blue = 63: green = 0: red = 63
PALETTE 10, 65536 * blue + 256 * green + red
P$(1) = "0000000000000000" ' palikat
P$(2) = "0110011001100110"
P$(3) = "0110011001100110"
P$(4) = "0000000000000000"
P$(5) = "0100111101001111"
P$(6) = "0100000001000000"
P$(7) = "0100000001000000"
P$(8) = "0100000001000000"
P$(9) = "0000001000100100"
P$(10) = "0111011001110110"
P$(11) = "0010001000000100"
P$(12) = "0000000000000000"
P$(13) = "0111001001000110"
P$(14) = "0001001001110100"
P$(15) = "0000011000000100"
P$(16) = "0000000000000000"
P$(17) = "0010000000100000"
P$(18) = "0110110001101100"
P$(19) = "0100011001000110"
P$(20) = "0000000000000000"
P$(21) = "0100000001000000"
P$(22) = "0110011001100110"
P$(23) = "0010110000101100"
P$(24) = "0000000000000000"
P$(25) = "0111011000010100"
P$(26) = "0100001001110100"
P$(27) = "0000001000000110"
P$(28) = "0000000000000000"
ns = .4 ' Nopeus
nopeus = ns
Pkoko% = 20 ' Palikan koko
level% = 1 ' Taso
score% = 0 ' Pisteet
lines% = 0 ' Poistetut rivit
r% = 15 ' Ruudukon väri
laske% = 0 ' Laske montako riviä
LOCATE 2, 43: PRINT "T E R Z I S  0.8"
LOCATE 4, 34: PRINT "N"
LOCATE 5, 34: PRINT "E"
LOCATE 6, 34: PRINT "X"
LOCATE 7, 34: PRINT "T"
LOCATE 9, 27: PRINT "SCORE"
LOCATE 10, 28: PRINT USING "#####"; score%
LOCATE 12, 27: PRINT "LINES"
LOCATE 13, 28: PRINT USING "#####"; lines%
LOCATE 15, 27: PRINT "LEVEL"
LOCATE 16, 28: PRINT USING "#####"; level%
LINE (200, 124)-(280, 160), 15, B
LINE (200, 172)-(280, 208), 15, B
LINE (200, 220)-(280, 256), 15, B
FOR y% = 1 TO AKorkeus% + 4
    K$(y%) = Tyhjarivi$
NEXT y%
K$(AKorkeus% + 1) = STRING$(Aleveys% + 8, "X")
ReunaX% = 320 - (Pkoko% * Aleveys%) / 2
ReunaY% = 240 - (Pkoko% * AKorkeus%) / 2
LINE (ReunaX% + 4 * Pkoko% - 1, ReunaY% + Pkoko% - 1)-(ReunaX% + Pkoko% * (Aleveys% + 4), ReunaY% + Pkoko% * AKorkeus%), 15, B
FOR x% = 4 TO Aleveys% + 3
    FOR y% = 2 TO AKorkeus%
        LINE (ReunaX% + x% * Pkoko% + Pkoko% - 1, ReunaY% + y% * Pkoko% - Pkoko%)-(ReunaX% + x% * Pkoko%, ReunaY% + y% * Pkoko% - 1), r%, BF
    NEXT
NEXT
GOSUB Seuraava
DO
    GOSUB Seuraava
    x% = Aleveys% / 2 + 2 ' Palikan x-koordinaatti
    FOR y% = 1 TO AKorkeus%
        GOSUB Varjopalikka
        GOSUB Piirto
        t = TIMER
        DO
            A$ = INKEY$
            IF A$ <> "" THEN
                IF A$ = CHR$(27) THEN END ' Escillä lopettaa
                IF A$ = CHR$(0) + "K" THEN ' Nuoli vasemmalle
                    GOSUB Poisto
                    x% = x% - 1: GOSUB Tarkista
                    IF Tark% = 1 THEN
                        x% = x% + 1
                    END IF
                    GOSUB Varjopalikka: GOSUB Piirto
                END IF
                IF A$ = CHR$(0) + "M" THEN ' Nuoli oikealle
                    GOSUB Poisto
                    x% = x% + 1: GOSUB Tarkista
                    IF Tark% = 1 THEN
                        x% = x% - 1
                    END IF
                    GOSUB Varjopalikka: GOSUB Piirto
                END IF
                IF A$ = CHR$(0) + "H" THEN ' Nuoli ylös
                    GOSUB Poisto
                    s% = s% + 1
                    IF s% = 5 THEN s% = 1
                    GOSUB Tarkista
                    IF Tark% = 1 THEN
                        s% = s% - 1
                        IF s% = 0 THEN s% = 4
                    END IF
                    GOSUB Varjopalikka: GOSUB Piirto
                END IF
                IF A$ = CHR$(0) + "P" AND turbo% = 0 THEN ' nuoli alas
                    nopeus = .01: turbo% = 1
                END IF
            END IF
        LOOP UNTIL TIMER - t > nopeus
        GOSUB Pohja
        IF toks% = 1 THEN EXIT FOR
        GOSUB Poisto
    NEXT y%
    loppuko% = y%: turbo% = 0
    GOSUB Rivit
    IF laske% >= 20 THEN
        laske% = 0: level% = level% + 1: ns = ns - .05
        LOCATE 16, 28: PRINT USING "#####"; level%
    END IF
    nopeus = ns
    IF loppuko% < 2 THEN
        LOCATE 2, 42: PRINT "G A M E   O V E R";
        DO
            go$ = INPUT$(1)
            SELECT CASE go$
                CASE CHR$(27): END
                CASE CHR$(13): EXIT DO
                CASE ELSE
                    LOCATE 25, 10: PRINT "Enter = new game"
                    LOCATE 26, 10: PRINT "Esc = quit game"
            END SELECT
        LOOP
        GOTO Alku
    END IF
LOOP
Taulukkoon: ' Sijoitetaan palikka taulukkoon
FOR qy% = 1 TO 4
    FOR qx% = 1 TO 4
        IF MID$(P$(n% * 4 - 4 + qy%), s% * 4 - 4 + qx%, 1) = "1" THEN
            MID$(K$(y% + qy%), x% + qx%, 1) = LTRIM$(STR$(v%))
        END IF
    NEXT
NEXT
RETURN
Poisto: ' poistetaan palikka & varjopalikka
FOR zy% = 1 TO 4
    FOR zx% = 1 TO 4
        IF MID$(P$(n% * 4 - 4 + zy%), s% * 4 - 4 + zx%, 1) = "1" THEN
            LINE (ReunaX% + (x% + zx%) * Pkoko% - Pkoko%, ReunaY% + (y% + zy%) * Pkoko% - Pkoko%)-(ReunaX% + (x% + zx%) * Pkoko% - 1, ReunaY% + (y% + zy%) * Pkoko% - 1), r%, BF
            LINE (ReunaX% + (x% + zx%) * Pkoko% - Pkoko%, ReunaY% + (varjoy% + zy%) * Pkoko% - Pkoko%)-(ReunaX% + (x% + zx%) * Pkoko% - 1, ReunaY% + (varjoy% + zy%) * Pkoko% - 1), r%, B
        END IF
    NEXT
NEXT
RETURN
Piirto: ' Piirretään palikka
FOR zy% = 1 TO 4
    FOR zx% = 1 TO 4
        IF MID$(P$(n% * 4 - 4 + zy%), s% * 4 - 4 + zx%, 1) = "1" THEN
            LINE (ReunaX% + (x% + zx%) * Pkoko% - Pkoko%, ReunaY% + (y% + zy%) * Pkoko% - Pkoko%)-(ReunaX% + (x% + zx%) * Pkoko% - 1, ReunaY% + (y% + zy%) * Pkoko% - 1), v%, B
            LINE (ReunaX% + (x% + zx%) * Pkoko% - Pkoko% + 1, ReunaY% + (y% + zy%) * Pkoko% - Pkoko% + 1)-(ReunaX% + (x% + zx%) * Pkoko% - 2, ReunaY% + (y% + zy%) * Pkoko% - 2), v2%, BF
            IF zy% > 1 AND MID$(P$(n% * 4 - 4 + zy% - 1), s% * 4 - 4 + zx%, 1) = "1" THEN
                LINE (ReunaX% + (x% + zx%) * Pkoko% - Pkoko% + 1, ReunaY% + (y% + zy%) * Pkoko% - Pkoko%)-(ReunaX% + (x% + zx%) * Pkoko% - 2, ReunaY% + (y% + zy%) * Pkoko% - Pkoko%), v2%
            END IF
            IF zy% < 4 AND MID$(P$(n% * 4 - 4 + zy% + 1), s% * 4 - 4 + zx%, 1) = "1" THEN
                LINE (ReunaX% + (x% + zx%) * Pkoko% - Pkoko% + 1, ReunaY% + (y% + zy%) * Pkoko% - 1)-(ReunaX% + (x% + zx%) * Pkoko% - 2, ReunaY% + (y% + zy%) * Pkoko% - 1), v2%
            END IF
            IF zx% > 1 AND MID$(P$(n% * 4 - 4 + zy%), s% * 4 - 4 + zx% - 1, 1) = "1" THEN
                LINE (ReunaX% + (x% + zx%) * Pkoko% - Pkoko%, ReunaY% + (y% + zy%) * Pkoko% - Pkoko% + 1)-(ReunaX% + (x% + zx%) * Pkoko% - Pkoko%, ReunaY% + (y% + zy%) * Pkoko% - 2), v2%
            END IF
            IF zx% < 4 AND MID$(P$(n% * 4 - 4 + zy%), s% * 4 - 4 + zx% + 1, 1) = "1" THEN
                LINE (ReunaX% + (x% + zx%) * Pkoko% - 1, ReunaY% + (y% + zy%) * Pkoko% - Pkoko% + 1)-(ReunaX% + (x% + zx%) * Pkoko% - 1, ReunaY% + (y% + zy%) * Pkoko% - 2), v2%
            END IF
        END IF
    NEXT
NEXT
RETURN
Pohja: ' Tarkistetaan tuleeko pohjakosketus
toks% = 0
FOR zy% = 1 TO 4
    FOR zx% = 1 TO 4
        IF MID$(P$(n% * 4 - 4 + zy%), s% * 4 - 4 + zx%, 1) = "1" THEN
            IF MID$(K$(y% + zy% + 1), x% + zx%, 1) <> " " THEN GOSUB Taulukkoon: toks% = 1
        END IF
    NEXT
NEXT
RETURN
Tarkista: ' tarkistetaan onko palikan alla tilaa
Tark% = 0
FOR qy% = 1 TO 4
    FOR qx% = 1 TO 4
        IF MID$(K$(y% + qy%), x% + qx%, 1) <> " " THEN
            IF MID$(P$(n% * 4 - 4 + qy%), s% * 4 - 4 + qx%, 1) = "1" THEN Tark% = 1
        END IF
    NEXT
NEXT
RETURN
Rivit:
rivi% = 0: lns% = 0
FOR y% = 1 TO AKorkeus% ' Valaistaan poistettava rivi...
    f%(y%) = 0
    FOR x% = 5 TO Aleveys% + 4
        IF MID$(K$(y%), x%, 1) = " " THEN f%(y%) = 1
    NEXT x%
    IF f%(y%) = 0 THEN
        LINE (ReunaX% + 4 * Pkoko%, ReunaY% + Pkoko% * y% - 1)-(ReunaX% + (Aleveys% + 3) * Pkoko% + Pkoko% - 1, ReunaY% + Pkoko% * y% - Pkoko%), 15, BF
        rivi% = 1: lns% = lns% + 1: lines% = lines% + 1: laske% = laske% + 1
    END IF
NEXT y%
IF rivi% = 1 THEN
    IF lns% = 1 THEN score% = score% + 10 * level% ' Annetaan pisteitä
    IF lns% = 2 THEN score% = score% + 30 * level%
    IF lns% = 3 THEN score% = score% + 60 * level%
    IF lns% = 4 THEN score% = score% + 100 * level%
    LOCATE 10, 28: PRINT USING "#####"; score%
    LOCATE 13, 28: PRINT USING "#####"; lines%
    t2 = TIMER
    DO
    LOOP UNTIL TIMER - t2 > .5 ' Odotetaan puoli sekuntia
    FOR y% = 1 TO AKorkeus% ' ...ja poistetaan se
        IF f%(y%) = 0 THEN
            K$(y%) = Tyhjarivi$
            LINE (ReunaX% + 4 * Pkoko%, ReunaY% + Pkoko% * y% - 1)-(ReunaX% + (Aleveys% + 3) * Pkoko% + Pkoko% - 1, ReunaY% + Pkoko% * y% - Pkoko%), r%, BF
        END IF
    NEXT y%
    FOR y% = 1 TO AKorkeus% ' pudotetaan rivejä alaspäin
        IF f%(y%) = 0 THEN
            REDIM Tiputus%(25000)
            GET (ReunaX% + 4 * Pkoko%, ReunaY% + Pkoko% * 2 - 1)-(ReunaX% + (Aleveys% + 3) * Pkoko% + Pkoko% - 1, ReunaY% + Pkoko% * y% - Pkoko% - 1), Tiputus%()
            PUT (ReunaX% + 4 * Pkoko%, ReunaY + Pkoko% * 3 + Pkoko% - 1), Tiputus%(), PSET
        END IF
    NEXT y%
    FOR Putoo% = 1 TO AKorkeus%
        FOR y% = AKorkeus% TO 1 STEP -1 ' pudotetaan rivejä alaspäin taulukossa
            IF K$(y%) = Tyhjarivi$ THEN
                FOR y2% = y% TO 2 STEP -1
                    K$(y2%) = K$(y2% - 1)
                NEXT y2%
                K$(1) = Tyhjarivi$
            END IF
        NEXT y%
    NEXT Putoo%
END IF
RETURN
Seuraava: ' Arvotaan seuraava palikka
n% = na%
s% = sa%
v% = va%
v2% = va2%
na% = INT(RND * 7) + 1
sa% = INT(RND * 4) + 1
va% = INT(RND * 5) + 1
va2% = va% + 5
IF n% = 0 THEN n% = na%: s% = sa%: v% = va%
LINE (ReunaX% + Pkoko% - Pkoko% * 2, Pkoko% * 2)-(ReunaX% + 4 * Pkoko% - Pkoko%, 5 * Pkoko% + Pkoko%), 0, BF
backupx% = x%: x% = -1: backupy% = y%: y% = 1
backupn% = n%: n% = na%
backups% = s%: s% = sa%
backupv% = v%: v% = va%
backupv2% = v2%: v2% = va2%
GOSUB Piirto
x% = backupx%: y% = backupy%
n% = backupn%: s% = backups%: v% = backupv%: v2% = backupv2%
RETURN
Varjopalikka:
Tarkmem% = Tark%: ymem% = y%: v2mem% = v2%: v2% = r%
FOR y% = ymem% TO AKorkeus%
    GOSUB Tarkista
    IF Tark% = 1 THEN
        y% = y% - 1: GOSUB Piirto
        y% = y% + 1
        EXIT FOR
    END IF
NEXT y%
varjoy% = y% - 1
Tark% = Tarkmem%: y% = ymem%: v2% = v2mem%
RETURNKoodia en sen kummemmin katsellut mutta QB peliksi varsin onnistunut tapaus.
Tuota innostui ihan oikeasti pelaamaan. :)
Ei voi sanoa muuta kuin että pirun hyvä.
hieno...
PS. pelissä ei näköjään pysty siirtämään kenttää koskevaa palaa edes yhtä ruutua
Aihe on jo aika vanha, joten et voi enää vastata siihen.