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% RETURN
Koodia 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.