====== TETRIS ====== {{:otros:Tetris_p1.jpg?690|}} ===== Info ===== ^ Author | ??????? | ^ Computer | Amstrad PCW 8256 / 8512 / 9512 | ^ Year | ???? | ^ Gender | Strategy | ^ Controls | Keyboard | ^ Languages | English | ^ Status | [[preserved|Preserved]] | ===== Screenshots ===== {{:otros:Tetris_basic_screenshot01.png?220}} {{:otros:Tetris_basic_screenshot02.png?220}} {{:otros:Tetris_basic_screenshot03.png?220}} {{:otros:Tetris_basic_screenshot04.png?220}} ===== Description ===== The objective of the game is to place the various tiles with different shapes avoiding the accumulation of holes. As they fall, you can move blocks left or right or even rotate them with the cursor keys. When a layer is completed, it disappears and points will be added. This in turn helps us to access spaces left earlier in the game. If we fill the entire frame then the game will be over. The lower right window gives a preview of the block that will fall after the one on the screen. The better results we get, the faster the game will run, and the better the score will be too. We can press exit at any time of the game to leave it. To start the game we will see a blinking indicator where the game level is chosen (1 to 9). The scores are continuously updated on the screen. We will be able to save the record to disk along with the player's name and it will then be displayed on the screen in future games with the position reset. ===== Listing ===== * **__Listing 1 - TETRIS.BAS__** 10 DIM b(8,10):h!=HIMEM:MEMORY &HBFFE:FOR x=&HC070 TO &HC098:READ pk:POKE x,pk:NEXT x 20 DATA 243,62,129,211,241,62,130,211,242,175,95,103,22,184,58,153,192,111,41,41 30 DATA 41,25,17,154,192,235,1,8,0,237,176,62,133,211,241,62,134,211,242,251,201 40 CHAR=248:count=8:ch=CHAR:WHILE char * **__Listing 2 - TETRIS.SCR__** 10 OPTION RUN 12 h!=HIMEM:MEMORY,10000 20 ee$=CHR$(27):con$=ee$+"e":cof$=ee$+"f":PRINT cof$ 30 ul$=ee$+"r":nul$=ee$+"u" 40 DEF FNat$(x,y)=ee$+"Y"+CHR$(32+x)+CHR$(32+y) 50 DEF FNd$(h,g)=STRING$(h,249+g) 60 c$=ee$+"E":PRINT c$ ee$ "0" 70 rev$=ee$+"p":rof$=ee$+"q" 80 RANDOMIZE(PEEK(64504!)) 90 DEFINT a-z:DEFSTR a,b,c,e,k 100 er=CHR$(248)+" " 110 DIM z(22,15),E(19),A(19),B(19),L(20),N$(12),s(12) 120 FOR x=0 TO 20:FOR y=0 TO 11 STEP 11:z(x,y)=1:NEXT:NEXT:FOR y=0 TO 11:z(21,y)=1:NEXT 130 FOR i=0 TO 6:x(i)=i:NEXT 140 TOP=1:GOSUB 450 150 n=(RND*19):IF n=0 THEN 150 160 GOSUB 1030 170 PRINT rev$ FNat$(7,31)" "CHR$(150)+STRING$(24,154)+CHR$(156)" " 180 FOR x=8 TO 30:PRINT FNat(x,31)" "CHR$(149)CHR$(149)" "ROF$:FOR y=35 TO 57 STEP 2:PRINT FNat$(x,y)ER:NEXT:PRINT FNat$(X,55)REV$ " "CHR$(149)CHR$(149)" ":NEXT 190 PRINT rev$ FNat$(8,33)CHR$(150)+CHR$(154)ul$+STRING$(20,154)+nul$+CHR$(154)+CHR$(156) 200 PRINT FNat$(29,33)CHR$(147)+STRING$(22,154)+CHR$(153) 210 PRINT FNat$(30,31)" "CHR$(147)+STRING$(24,154)+CHR$(153)" " 220 PRINT rof$ FNAT$(5,0)CHR$(134)+STRING$(10,138)+CHR$(140)" "CHR$(134)+STRING$(3,138)+CHR$(140) 230 PRINT FNat$(6,0)CHR$(133)" "CHR$(133)" "CHR$(133)" "CHR$(133) 240 PRINT FNAT$(7,0)CHR$(131)+STRING$(10,138)+CHR$(137)" "CHR$(131)+STRING$(3,138)+CHR$(137) 250 PRINT FNat$(8,0)rof$"TOTAL SCORE LEVEL" 260 PRINT FNAT$(24,67)CHR$(134)+STRING$(20,138)+CHR$(140) 270 PRINT FNAT$(5,67)CHR$(134)+STRING$(20,138)+CHR$(140) 280 PRINT FNat$(6,68)" PREVIOUS HI-SCORES" 290 FOR x=25 TO 29:PRINT FNat$(x,67)CHR$(133)" "er er er er er er er er er " " CHR$(133):NEXT 300 FOR x=6 TO 20:FOR y=67 TO 88 STEP 21:PRINT FNat$(x,y)CHR$(133):NEXT:NEXT 310 PRINT FNAT$(30,67)CHR$(131)+STRING$(20,138)+CHR$(137) 320 PRINT FNAT$(21,67)CHR$(131)+STRING$(20,138)+CHR$(137) 330 PRINT FNAT$(9,0)CHR$(134)+STRING$(20,138)+CHR$(140) 340 FOR x=10 TO 29:FOR y=0 TO 21 STEP 21:PRINT FNat$(x,y)CHR$(133):NEXT:NEXT 350 PRINT FNAT$(30,0)CHR$(131)+STRING$(20,138)+CHR$(137) 360 PRINT FNat$(10,2)B(1) 370 PRINT FNat$(13,2)B(2) 380 PRINT FNat$(15,2)B(4) 390 PRINT FNat$(18,2)B(8) 400 PRINT FNat$(21,2)B(12) 410 PRINT FNat$(24,2)B(16) 420 PRINT FNat$(27,4)B(18) 430 'PRINT FNat$(26,75) b(n) 440 MEMORY h!:RUN "TETRIS.OVL 450 c1=STRING$(2,8)+CHR$(10):c2=STRING$(4,8)+CHR$(10):c3=STRING$(6,8)+CHR$(10):b(1)=FNd$(4,0)+c2+FNd$(4,0) 460 a(1)=er+er+c2+er+er 470 e(1)=er+er 480 b(2)=FNd$(8,1) 490 a(2)=er+er+er+er 500 e(2)=er+er+er+er 510 b(3)=FNd$(2,1)+C1+FNd$(2,1)+c1+FNd$(2,1)+c1+FND$(2,1) 520 a(3)=er+C1+er+c1+er+c1+er 530 e(3)=er 540 b(4)=FNd$(6,2)+c1+FNd$(2,2) 550 a(4)=er+er+er+c1+er 560 e(4)=er+er+er 570 b(5)=FNd$(2,2)+c1+FNd$(2,2)+c2+FNd$(4,2) 580 a(5)=er+c1+er+c2+er+er 590 e(5)=er+c1+c1+er 600 b(6)=FNd$(2,2)+c1+FNd$(6,2) 610 a(6)=er+c1+er+er+er 620 e(6)=er+CHR$(10)+er+er 630 b(7)=FNd$(4,2)+c2+FNd$(2,2)+C1+FNd$(2,2) 640 a(7)=er+er+c2+er+C1+er 650 e(7)=er+er 660 b(8)=FNd$(6,3)+c3+FNd$(2,3) 670 a(8)=er+er+er+c3+er 680 e(8)=er+er+er 690 b(9)=FNd$(4,3)+c1+FNd$(2,3)+C1+FNd$(2,3) 700 a(9)=er+er+c1+er+C1+er 710 e(9)=er+er 720 b(10)=FNd$(2,3)+c3+FNd$(6,3) 730 a(10)=er+c3+er+er+er 740 e(10)=er+c3+er+er 750 b(11)=FNd$(2,3)+c1+FNd$(2,3)+c1+FNd$(4,3) 760 a(11)=er+c1+er+c1+er+er 770 e(11)=er+STRING$(2,10)+er 780 b(12)=FNd$(6,4)+c2+FNd$(2,4) 790 a(12)=er+er+er+c2+er 800 e(12)=er+er+er 810 b(13)=FNd$(2,4)+c2+FNd$(4,4)+c1+FNd$(2,4) 820 a(13)=er+c2+er+er+c1+er 830 e(13)=er+c2+er 840 b(14)=FNd$(2,4)+c2+FNd$(6,4) 850 a(14)=er+c2+er+er+er 860 e(14)=er+c2+er+FNd$(2,4)+er 870 b(15)=FNd$(2,4)+c1+FNd$(4,4)+c2+FNd$(2,4) 880 a(15)=er+c1+er+er+c2+er 890 e(15)=er+CHR$(10)+er 900 b(16)=FNd$(4,5)+c1+FNd$(4,5) 910 a(16)=er+er+c1+er+er 920 e(16)=er+er+CHR$(10)+er 930 b(17)=FNd$(2,5)+c2+FNd$(4,5)+c2+FNd$(2,5) 940 a(17)=er+c2+er+er+c2+er 950 e(17)=er+c2+er 960 b(18)=FNd$(4,6)+c3+FNd$(4,6) 970 a(18)=er+er+c3+er+er 980 e(18)=er+er+c3+er 990 b(19)=FNd$(2,6)+c1+FNd$(4,6)+c1+FNd$(2,6) 1000 a(19)=er+c1+er+er+c1+er 1010 e(19)=er+CHR$(10)+er 1020 RETURN 1030 banner(1)=FNd$(6,x(1))+" "+FNd$(6,x(1))+" "+FNd$(6,x(1))+" "+FNd$(6,x(1))+" "+FNd$(2,x(1))+" "+FNd$(6,x(1)) 1040 banner(2)=" "+FNd$(2,x(2))+" "+FNd$(2,x(2))+" "+FNd$(2,x(2))+" "+FNd$(2,x(2))+" "+FNd$(2,x(2))+" "+FNd$(2,x(2))+" "+FNd$(2,x(2)) 1050 banner(3)=" "+FNd$(2,x(3))+" "+FNd$(4,x(3))+" "+FNd$(2,x(3))+" "+FNd$(5,X(3))+" "+FNd$(2,x(3))+" "+FNd$(6,x(3)) 1060 banner(4)=" "+FNd$(2,x(4))+" "+FNd$(2,x(4))+" "+FNd$(2,x(4))+" "+FNd$(2,x(4))+" "+FNd$(2,x(4))+" "+FNd$(2,x(4))+" "+FNd$(2,x(4)) 1070 banner(5)=" "+FNd$(2,x(5))+" "+FNd$(6,x(5))+" "+FNd$(2,x(5))+" "+FNd$(2,x(5))+" "+FNd$(2,x(5))+" "+FNd$(2,x(5))+" "+FNd$(6,x(5)) 1080 FOR x=5 TO 1 STEP -1:PRINT FNat$(x-1,26)banner(x):NEXT 1090 RETURN * **__Listing 3 - TETRIS.OVL__** 10 OPTION RUN:h!=HIMEM:MEMORY,10000 20 ee$=CHR$(27):con$=ee$+"e" 30 ul$=ee$+"r":nul$=ee$+"u" 40 DEF FNat$(x,y)=ee$+"Y"+CHR$(32+x)+CHR$(32+y) 50 DEF FNd$(h,g)=STRING$(h,249+g) 70 rev$=ee$+"p":rof$=ee$+"q" 80 RANDOMIZE(PEEK(64504!)) 90 DEFINT a-z:DEFSTR a,b,c,e,k 100 er=CHR$(248)+" " 110 DIM z(22,15),E(19),A(19),B(19),L(20),N$(12),s(12) 120 FOR x=0 TO 20:FOR y=0 TO 11 STEP 11:z(x,y)=1:NEXT:NEXT:FOR y=0 TO 11:z(21,y)=1:z(22,y)=1:NEXT 130 FOR i=0 TO 6:x(i)=i:NEXT 140 TOP=1:GOSUB 1760 150 n=(RND*19):IF n=0 THEN 150 440 GOSUB 2500 450 i=0:k="" 460 WHILE k="":k=INKEY$:GOSUB 2630:PRINT FNat$(6,18)" ":GOSUB 2630:PRINT FNat$(6,18)rev$" ? "rof$:WEND 470 IF INSTR("-.*=+",k)>0 THEN k="":GOTO 460 480 r=VAL(k):IF r=0 THEN r=5 490 PRINT FNat$(6,18)USING "*#*";r 500 x1=1:x=1:y1=4:y=4 510 PRINT FNat$(26,75)a(n) 520 p=t:t=n:n=RND*19 530 IF n=0 THEN n=2 540 PRINT FNat$(26,75)b(n) 550 GOSUB 1240 560 GOSUB 1550 570 ok=FRE(""):IF r<9 THEN FOR delay=1 TO 8191 STEP (2^(r*1.5)):NEXT 580 k=INKEY$:IF k="" THEN 590 ELSE I=INSTR(CHR$(1)+CHR$(6)+CHR$(31)+CHR$(30)+CHR$(27),k):IF I>0 THEN 610 590 k=INKEY$:x=x+1:GOSUB 1240:GOSUB 1280 600 GOTO 570 610 ON I GOTO 620,760,950,1200,2340 620 ON T GOTO 630,640,650,660,670,630,680,630,690,700,680,710,720,730,680,710,740,730,750 630 IF z(x,y-1) OR z(x+1,y-1) THEN 590 ELSE GOTO 1180 640 IF z(x,y-1) THEN 590 ELSE GOTO 1180 650 IF z(x,y-1) OR z(x+1,y-1) OR z(x+2,y-1) OR z(x+3,y-1) THEN 590 ELSE GOTO 1180 660 IF z(x,y-1) OR z(x+1,y+1) THEN 590 ELSE GOTO 1180 670 IF z(x,y-1) OR z(x+1,y-1) OR z(x+2,y-2) THEN 590 ELSE GOTO 1180 680 IF z(x,y-1) OR z(x+1,y-1) OR z(x+2,y-1) THEN 590 ELSE GOTO 1180 690 IF z(x,y-1) OR z(x+1,y) OR z(x+2,y) THEN 590 ELSE 1180 700 IF z(x,y-1) OR z(x+1,y-3) THEN 590 ELSE 1180 710 IF z(x,y-1) OR z(x+1,y) THEN 590 ELSE 1180 720 IF z(x,y-1) OR z(x+1,y-2) OR z(x+2,y-1) THEN 590 ELSE 1180 730 IF z(x,y-1) OR z(x+1,y-2) THEN 590 ELSE 1180 740 IF z(x,y-1) OR z(x+1,y-2) OR z(x+2,y-2) THEN 590 ELSE 1180 750 IF z(x,y-1) OR z(x+1,y-1) OR z(x+2,y) THEN 590 ELSE 1180 760 ON T GOTO 770,780,790,800,810,820,830,840,850,860,870,880,810,890,900,910,920,930,940 770 IF z(x,y+2) OR z(x+1,y+2) THEN 590 ELSE GOTO 1190 780 IF z(x,y+4) THEN 590 ELSE GOTO 1190 790 IF z(x,y+1) OR z(x+1,y+1) OR z(x+2,y+1) OR z(x+3,y+1) THEN 590 ELSE GOTO 1190 800 IF z(x,y+3) OR z(x+1,y+3) THEN 590 ELSE GOTO 1190 810 IF z(x,y+1) OR z(x+1,y+1) OR z(x+2,y+1) THEN 590 ELSE GOTO 1190 820 IF z(x,y+1) OR z(x+1,y+3) THEN 590 ELSE GOTO 1190 830 IF z(x,y+2) OR z(x+1,y+1) OR z(x+2,y+1) THEN 590 ELSE 1190 840 IF z(x,y+3) OR z(x+1,y+1) THEN 590 ELSE 1190 850 IF z(x,y+2) OR z(x+1,y+2) OR z(x+2,y+2) THEN 590 ELSE 1190 860 IF z(x,y+1) OR z(x+1,y+1) THEN 590 ELSE 1190 870 IF z(x,y+1) OR z(x+1,y+1) OR z(x+2,y+2) THEN 590 ELSE 1190 880 IF z(x,y+3) OR z(x+1,y+2) THEN 590 ELSE 1190 890 IF z(x,y+1) OR z(x+1,y+2) THEN 590 ELSE 1190 900 IF z(x,y+1) OR z(x+1,y+2) OR z(x+2,y+1) THEN 590 ELSE GOTO 1190 910 IF z(x,y+2) OR z(x+1,y+3) THEN 590 ELSE 1190 920 IF z(x,y+1) OR z(x+1,y+1) OR z(x+2,y) THEN 590 ELSE GOTO 1190 930 IF z(x,y+2) OR z(x+1,y+1) THEN 590 ELSE 1190 940 IF z(x,y+1) OR z(x+1,y+2) OR z(x+2,y+2) THEN 590 ELSE GOTO 1190 950 ON t GOTO 590,960,970,980,990,1000,1010,1020,1029,1040,1050,1060,1070,1080,1090,1100,1110,1120,1130:RETURN 960 IF z(x+1,y) OR z(x+2,y) OR z(x+3,y) THEN 590 ELSE p=t:t=3:GOTO 1140 970 IF z(x,y+1) OR z(x,y+2) OR z(x,y+3) THEN 590 ELSE p=t:t=2:GOTO 1140 980 IF z(x+1,y) OR z(x+2,y) OR z(x+2,y-1) THEN 590 ELSE p=t:t=5:GOTO 1140 990 IF z(x+1,y+1) OR z(x+2,y+2) THEN 590 ELSE p=t:t=6:GOTO 1140 1000 IF z(x,y+1) OR z(x+2,y) THEN 590 ELSE p=t:t=7:GOTO 1140 1010 IF z(x,y+2) OR z(x+1,y+2) THEN 590 ELSE p=t:t=4:GOTO 1140 1020 IF z(x+1,y+1) OR z(x+2,y+1) THEN 590 ELSE p=t:t=9:GOTO 1140 1029 ' 1030 IF z(x+1,MAX(0,y-2)) OR z(x+1,y-1) OR z(x+1,y) THEN 590 ELSE p=t:t=10:GOTO 1140 1040 IF z(x+2,y) OR z(x+2,y+1) THEN 590 ELSE p=t:t=11:GOTO 1140 1050 IF z(x,y+2) OR z(x,y+3) THEN 590 ELSE p=t:t=8:GOTO 1140 1060 IF z(x+1,y-1) OR z(x+1,y) OR z(x+2,y) THEN 590 ELSE p=t:t=13:GOTO 1140 1070 IF z(x+1,y+1) THEN 590 ELSE p=t:t=14:GOTO 1140 1080 IF z(x+2,y) THEN 590 ELSE p=t:t=15:GOTO 1140 1090 IF z(x,y+1) OR z(x,y+2) THEN 590 ELSE p=t:t=12:GOTO 1140 1100 IF z(x+1,y) OR z(x+1,y-1) OR z(x+2,y-1) THEN 590 ELSE p=t:t=17:GOTO 1140 1110 IF z(x,y+1) OR z(x+1,y+1) OR z(x+1,y+2) THEN 590 ELSE p=t:t=16:GOTO 1140 1120 IF z(x+1,y+1) OR z(x+2,y+1) THEN 590 ELSE p=t:t=19:GOTO 1140 1130 IF z(x+1,y-1) OR z(x,y+1) THEN 590 ELSE p=t:t=18:GOTO 1140 1140 PRINT FNat$(x+8,y*2+33) a(p) 1150 PRINT FNat$(x+8,y*2+33) b(t) 1160 GOSUB 1280 1170 GOTO 590 1180 PRINT FNat$(x+8,y*2+33)a(t):y=y-1:GOSUB 1250:GOSUB 1280:GOTO 590 1190 PRINT FNat$(x+8,y*2+33)a(t):y=y+1:GOSUB 1250:GOSUB 1280:GOTO 590 1200 drop=1:x=x+1:GOSUB 1280:IF landed=0 THEN GOTO 1200 1210 PRINT FNat$(x1+8,y1*2+33) a(t) 1220 PRINT FNat$(x+8,y*2+33) b(t) 1230 landed=0:GOSUB 1280 1240 PRINT FNat$(x1+8,y1*2+33)E(T) 1250 PRINT FNat$(x+8,y*2+33)B(T) 1260 x1=x:y1=y 1270 RETURN 1280 ON t GOSUB 1290,1300,1310,1320,1330,1340,1350,1360,1370,1380,1390,1400,1410,1420,1430,1440,1450,1460,1470:RETURN 1290 IF z(x+2,y) OR z(x+2,y+1) THEN z(x,y)=1:z(x,y+1)=1:z(x+1,y)=1:z(x+1,y+1)=1:GOTO 1480 ELSE RETURN 1300 IF z(x+1,y) OR z(x+1,y+1) OR z(x+1,y+2) OR z(x+1,y+3) THEN z(x,y)=2:z(x,y+1)=2:z(x,y+2)=2:z(x,y+3)=2:GOTO 1480 ELSE RETURN 1310 IF z(x+4,y) THEN z(x,y)=2:z(x+1,y)=2:z(x+2,y)=2:z(x+3,y)=2:GOTO 1480 ELSE RETURN 1320 IF z(x+1,y) OR z(x+1,y+1) OR z(x+2,y+2) THEN z(x,y)=3:z(x,y+1)=3:z(x,y+2)=3:z(x+1,y+2)=3:GOTO 1480 ELSE RETURN 1330 IF z(x+3,y-1) OR z(x+3,y) THEN z(x,y)=3:z(x+1,y)=3:z(x+2,y-1)=3:z(x+2,y)=3:GOTO 1480 ELSE RETURN 1340 IF z(x+2,y) OR z(x+2,y+1) OR z(x+2,y+2) THEN z(x,y)=3:z(x+1,y)=3:z(x+1,y+1)=3:z(x+1,y+2)=3:GOTO 1480 ELSE RETURN 1350 IF z(x+3,y) OR z(x+1,y+1) THEN z(x,y)=3:z(x,y+1)=3:z(x+1,y)=3:z(x+2,y)=3:GOTO 1480 ELSE RETURN 1360 IF z(x+2,y) OR z(x+1,y+1) OR z(x+1,y+2) THEN z(x,y)=4:z(x,y+1)=4:z(x,y+2)=4:z(x+1,y)=4:GOTO 1480 ELSE RETURN 1370 IF z(x+1,y) OR z(x+3,y+1) THEN z(x,y)=4:z(x,y+1)=4:z(x+1,y+1)=4:z(x+2,y+1)=4:GOTO 1480 ELSE RETURN 1380 IF z(x+2,y-2) OR z(x+2,y-1) OR z(x+2,y) THEN z(x,y)=4:z(x+1,y-2)=4:z(x+1,y-1)=4:z(x+1,y)=4:GOTO 1480 ELSE RETURN 1390 IF z(x+3,y) OR z(x+3,y+1) THEN z(x,y)=4:z(x+1,y)=4:z(x+2,y)=4:z(x+2,y+1)=4:GOTO 1480 ELSE RETURN 1400 IF z(x+1,y) OR z(x+2,y+1) OR z(x+1,y+2) THEN z(x,y)=5:z(x,y+1)=5:z(x,y+2)=5:z(x+1,y+1)=5:GOTO 1480 ELSE RETURN 1410 IF z(x+2,y-1) OR z(x+3,y) THEN z(x,y)=5:z(x+1,y-1)=5:z(x+1,y)=5:z(x+2,y)=5:GOTO 1480 ELSE RETURN 1420 IF z(x+2,y-1) OR z(x+2,y) OR z(x+2,y+1) THEN z(x,y)=5:z(x+1,y-1)=5:z(x+1,y)=5:z(x+1,y+1)=5:GOTO 1480 ELSE RETURN 1430 IF z(x+3,y) OR z(x+2,y+1) THEN z(x,y)=5:z(x+1,y)=5:z(x+1,y+1)=5:z(x+2,y)=5:GOTO 1480 ELSE RETURN 1440 IF z(x+1,y) OR z(x+2,y+1) OR z(x+2,y+2) THEN z(x,y)=6:z(x,y+1)=6:z(x+1,y+1)=6:z(x+1,y+2)=6:GOTO 1480 ELSE RETURN 1450 IF z(x+3,y-1) OR z(x+2,y) THEN z(x,y)=6:z(x+1,y-1)=6:z(x+1,y)=6:z(x+2,y-1)=6:GOTO 1480 ELSE RETURN 1460 IF z(x+2,y-1) OR z(x+2,y) OR z(x+1,y+1) THEN z(x,y)=7:z(x,y+1)=7:z(x+1,y-1)=7:z(x+1,y)=7:GOTO 1480 ELSE RETURN 1470 IF z(x+2,y) OR z(x+3,y+1) THEN z(x,y)=7:z(x+1,y)=7:z(x+1,y+1)=7:z(x+2,y+1)=7:GOTO 1480 ELSE RETURN 1480 IF x<3 THEN k=INKEYS$:k=INKEY$:GOTO 2340 1490 IF drop THEN drop=0:landed=1:RETURN 1500 TOP=MIN(TOP,x):FOR xx=x TO 20:l(xx)=0:FOR yy=1 TO 10 1510 IF z(xx,yy) THEN l(xx)=l(xx)+1 1520 NEXT:NEXT 1530 FOR XX=x TO 20:IF L(xx)=10 THEN PRINT CHR$(7):GOSUB 1700 1540 NEXT:GOTO 500 1550 ON t GOSUB 1630,1640,1640,1650,1650,1650,1650,1660,1660,1660,1660,1670,1670,1670,1670,1680,1680,1690,1690:d(8)=d(8)+1:PRINT FNat$(29,14) USING "####";d(8):PRINT FNat$(6,2) USING "#######";s 1560 IF s>500 AND r<2 THEN r=2 1570 IF s>1000 AND r<3 THEN r=3 1572 IF s>1250 AND r<4 THEN r=4 1580 IF s>1500 AND r<5 THEN r=5 1582 IF s>1750 AND r<6 THEN r=6 1590 IF s>2000 AND r<7 THEN r=7 1592 IF s>2500 AND r<8 THEN r=8 1600 IF s>3000 AND r<9 THEN r=9 1610 PRINT FNat$(6,18) USING "*#*";r 1620 RETURN 1630 s=s+15+(r/2):d(1)=d(1)+1:PRINT FNat$(11,15) USING "###";d(1):RETURN 1640 s=s+15+(r/2):d(2)=d(2)+1:PRINT FNat$(13,15) USING "###";d(2):RETURN 1650 s=s+17+(r/2):d(3)=d(3)+1:PRINT FNat$(15,15) USING "###";d(3):RETURN 1660 s=s+17+(r/2):d(4)=d(4)+1:PRINT FNat$(18,15) USING "###";d(4):RETURN 1670 s=s+19+(r/2):d(5)=d(5)+1:PRINT FNat$(21,15) USING "###";d(5):RETURN 1680 s=s+19+(r/2):d(6)=d(6)+1:PRINT FNat$(24,15) USING "###";d(6):RETURN 1690 s=s+19+(r/2):d(7)=d(7)+1:PRINT FNat$(27,15) USING "###";d(7):RETURN 1700 FOR ya=1 TO 10:FOR xa=xx TO TOP STEP -1 1710 IF z(xa,ya)=z(xa-1,ya) THEN 1740 1720 z(xa,ya)=z(xa-1,ya) 1730 IF z(xa,ya) THEN PRINT FNat$(xa+8,ya*2+33) FNd$(2,(z(xa,ya)-1)) ELSE PRINT FNat$(xa+8,ya*2+33)er 1740 NEXT:NEXT 1750 TOP=TOP+1:s=s+(r*4):PRINT FNat$(6,2) USING "#######";s :RETURN 1760 c1=STRING$(2,8)+CHR$(10):c2=STRING$(4,8)+CHR$(10):c3=STRING$(6,8)+CHR$(10):b(1)=FNd$(4,0)+c2+FNd$(4,0) 1770 a(1)=er+er+c2+er+er 1780 e(1)=er+er 1790 b(2)=FNd$(8,1) 1800 a(2)=er+er+er+er 1810 e(2)=er+er+er+er 1820 b(3)=FNd$(2,1)+C1+FNd$(2,1)+c1+FNd$(2,1)+c1+FND$(2,1) 1830 a(3)=er+C1+er+c1+er+c1+er 1840 e(3)=er 1850 b(4)=FNd$(6,2)+c1+FNd$(2,2) 1860 a(4)=er+er+er+c1+er 1870 e(4)=er+er+er 1880 b(5)=FNd$(2,2)+c1+FNd$(2,2)+c2+FNd$(4,2) 1890 a(5)=er+c1+er+c2+er+er 1900 e(5)=er+c1+c1+er 1910 b(6)=FNd$(2,2)+c1+FNd$(6,2) 1920 a(6)=er+c1+er+er+er 1930 e(6)=er+CHR$(10)+er+er 1940 b(7)=FNd$(4,2)+c2+FNd$(2,2)+C1+FNd$(2,2) 1950 a(7)=er+er+c2+er+C1+er 1960 e(7)=er+er 1970 b(8)=FNd$(6,3)+c3+FNd$(2,3) 1980 a(8)=er+er+er+c3+er 1990 e(8)=er+er+er 2000 b(9)=FNd$(4,3)+c1+FNd$(2,3)+C1+FNd$(2,3) 2010 a(9)=er+er+c1+er+C1+er 2020 e(9)=er+er 2030 b(10)=FNd$(2,3)+c3+FNd$(6,3) 2040 a(10)=er+c3+er+er+er 2050 e(10)=er+c3+er+er 2060 b(11)=FNd$(2,3)+c1+FNd$(2,3)+c1+FNd$(4,3) 2070 a(11)=er+c1+er+c1+er+er 2080 e(11)=er+STRING$(2,10)+er 2090 b(12)=FNd$(6,4)+c2+FNd$(2,4) 2100 a(12)=er+er+er+c2+er 2110 e(12)=er+er+er 2120 b(13)=FNd$(2,4)+c2+FNd$(4,4)+c1+FNd$(2,4) 2130 a(13)=er+c2+er+er+c1+er 2140 e(13)=er+c2+er 2150 b(14)=FNd$(2,4)+c2+FNd$(6,4) 2160 a(14)=er+c2+er+er+er 2170 e(14)=er+c2+er+FNd$(2,4)+er 2180 b(15)=FNd$(2,4)+c1+FNd$(4,4)+c2+FNd$(2,4) 2190 a(15)=er+c1+er+er+c2+er 2200 e(15)=er+CHR$(10)+er 2210 b(16)=FNd$(4,5)+c1+FNd$(4,5) 2220 a(16)=er+er+c1+er+er 2230 e(16)=er+er+CHR$(10)+er 2240 b(17)=FNd$(2,5)+c2+FNd$(4,5)+c2+FNd$(2,5) 2250 a(17)=er+c2+er+er+c2+er 2260 e(17)=er+c2+er 2270 b(18)=FNd$(4,6)+c3+FNd$(4,6) 2280 a(18)=er+er+c3+er+er 2290 e(18)=er+er+c3+er 2300 b(19)=FNd$(2,6)+c1+FNd$(4,6)+c1+FNd$(2,6) 2310 a(19)=er+c1+er+er+c1+er 2320 e(19)=er+CHR$(10)+er 2330 RETURN 2340 FOR q=1 TO 12:IF s>s(q) THEN 2360 2350 NEXT:GOTO 2410 2360 PRINT FNat$(20,68)" PLEASE INSERT NAME" 2370 FOR qq=12 TO q+1 STEP -1:n$(qq)=n$(qq-1):s(qq)=s(qq-1):NEXT:n$(q)=" ":s(q)=s 2380 FOR qq=1 TO 12:PRINT FNat$(7+qq,70) n$(qq) :PRINT FNat$(7+qq,81) USING "#####";s(qq):NEXT 2390 PRINT FNat$(q+7,70);:INPUT"",n$(q):n$(q)=UPPER$(LEFT$(n$(q),10)) 2400 PRINT FNat$(7+q,70) n$(q)+SPACE$(11-LEN(n$(q))):PRINT FNat$(7+q,81) USING "#####";s(q) 2410 PRINT FNat$(20,68)" PLAY AGAIN Y/N? " 2420 k=UPPER$(INPUT$(1)):PRINT FNat$(20,68)" ":IF k="Y" THEN ERASE z,e,b,l,d:GOTO 2560 2430 IF k="N" THEN PRINT CHR$(7) ELSE GOTO 2410 2440 OPEN "O",#1,"TETRIS.REC" 2450 FOR q=1 TO 12 2460 WRITE #1, n$(q),s(q) 2470 NEXT 2480 CLOSE 2490 MEMORY h!:end 2500 IF FIND$("TETRIS.REC")<>"" THEN OPEN "I",#1,"TETRIS.REC" ELSE PRINT FNat$(8,70)"NO RECORDS YET":GOTO 2550 2510 FOR q=1 TO 12 2520 INPUT #1, n$(q),s(q) 2530 PRINT FNat$(7+q,70) n$(q) FNat$(7+q,81) USING "#####";s(q):NEXT 2540 CLOSE 2550 RETURN 2560 DIM z(22,15),E(19),B(19),L(20) 2570 FOR x=1 TO 20 2580 PRINT FNat$(x+8,35)er er er er er er er er er er 2590 PRINT FNat$(x+9,10)" " 2600 NEXT:s=0 2610 FOR x=0 TO 20:FOR y=0 TO 11 STEP 11:z(x,y)=1:NEXT:NEXT:FOR y=0 TO 11:z(21,y)=1:NEXT 2620 GOSUB 1760:GOTO 450 2630 SWAP x(1),x(2):SWAP x(2),x(3):SWAP x(3),x(4):SWAP x(4),x(5):SWAP x(5),X(6):SWAP x(6),x(7) 2640 banner(1)=FNd$(6,x(1))+" "+FNd$(6,x(1))+" "+FNd$(6,x(1))+" "+FNd$(6,x(1))+" "+FNd$(2,x(1))+" "+FNd$(6,x(1)) 2650 banner(2)=" "+FNd$(2,x(2))+" "+FNd$(2,x(2))+" "+FNd$(2,x(2))+" "+FNd$(2,x(2))+" "+FNd$(2,x(2))+" "+FNd$(2,x(2))+" "+FNd$(2,x(2)) 2660 banner(3)=" "+FNd$(2,x(3))+" "+FNd$(4,x(3))+" "+FNd$(2,x(3))+" "+FNd$(5,X(3))+" "+FNd$(2,x(3))+" "+FNd$(6,x(3)) 2670 banner(4)=" "+FNd$(2,x(4))+" "+FNd$(2,x(4))+" "+FNd$(2,x(4))+" "+FNd$(2,x(4))+" "+FNd$(2,x(4))+" "+FNd$(2,x(4))+" "+FNd$(2,x(4)) 2680 banner(5)=" "+FNd$(2,x(5))+" "+FNd$(6,x(5))+" "+FNd$(2,x(5))+" "+FNd$(2,x(5))+" "+FNd$(2,x(5))+" "+FNd$(2,x(5))+" "+FNd$(6,x(5)) 2690 FOR x=5 TO 1 STEP -1:PRINT FNat$(x-1,26)banner(x):NEXT 2700 RETURN ===== Controls ===== ↑ = ROTATE TOKEN ↓ = SPEED DOWN → = RIGHT ← = LEFT EXIT = LEAVE GAME ===== Loading the program ===== 1.- Insert the CP/M disc on side 2 2.- Write BASIC and wait for it to load 3.- Remove the CP/M disk and insert the disk containing the Tetris game 4.- Type run "Tetris" and press the "ENTER" key ===== Download ===== * {{:otros:Tetris (Basic).zip|Tetris }}(game in dsk format, compressed with zip)