Tetris

From Rosetta Code
Tetris is a draft programming task. It is not yet considered ready to be promoted as a complete task, for reasons that should be found in its talk page.
Task

Create a playable Tetris game.

Requirements
  • a left / right key
  • a hard drop key (the current piece will be dropped and locked at once)
  • a rotation key
  • a preview piece
  • full set of 7 kinds of shapes (ITOSZJL)



Applesoft BASIC

See Tetris/Applesoft BASIC.

Bash

See Tetris/BASH.

C

Gadget

See https://github.com/DanielStuardo/Tetris

Ansi94 Forth

See Tetris/Ansi94 Forth.

Go

See Tetris/Go

Java

See Tetris/Java.

JavaScript

See Tetris/JavaScript.

Julia

See Tetris/Julia.

Mathematica/Wolfram Language

See Tetris/Mathematica.

Microsoft Small Basic

See Tetris/Microsoft Small Basic.

Atari Basic

Atari Basic. Tetris programmed in Atari Basic for Atari 65 xe computer.

1 GRAPHICS 0

2 POKE 708,194

3 POKE 709,196

4 POKE 710,198

6 COLOR 2

7 POKE 752,1

10 DIM A(10,20)

11 FOR Y=0 TO 20:FOR X=0 TO 10:A(X,Y)=0:NEXT X:NEXT Y

30 FOR Y=0 TO 20

40 POSITION 13,Y

45 ? "á"

50 POSITION 24,Y

60 ? "á"

70 NEXT Y

80 POSITION 13,20

81 ? "áááááááááááá"

82 COLOR 2

160 POSITION 0,0

161 ? "ATARI TETRIS"

162 POSITION 0,2

163 ? "MATEUSZ"

164 POSITION 0,3

165 ? "PAWLOWSKI"

201 K=5:R=1

202 KX=0:KY=0

203 RYSUJ=1

205 CZAS=0

206 DELAY=1

207 DELAY=30

208 KOLIZJA=0

209 CZASROT=0

210 KOLIZJADOWN=0

211 CZASMOV=0

212 SCORE=0

213 LOS=INT(RND(0)*5)+1

300 REM CONTROLS

301 J=STICK(0)

302 KOLIZJA=0

303 CZASROT=CZASROT+1

304 IF CZASROT=10 THEN CZASROT=0

305 KOLIZJADOWN=0

306 CZASMOV=CZASMOV+1

307 IF CZASMOV=2 THEN CZASMOV=0

308 POSITION 26,3:? "SCORE:"

309 POSITION 33,3:? SCORE

310 IF CZASMOV=0 THEN IF J=11 THEN GOSUB 360:REM LEFT

320 IF CZASMOV=0 THEN IF J=7 THEN GOSUB 375:REM RIGHT

330 IF J=13 THEN GOSUB 390:REM DOWN

340 IF CZASROT=0 THEN IF J=14 THEN GOSUB 405:REM UP

343 CZAS=CZAS+1

344 IF CZAS=DELAY THEN CZAS=0:GOSUB 390

345 RYSUJ=0:GOSUB 900:RYSUJ=1:GOSUB 900

350 GOTO 300

360 REM KOLIZJA LEFT

365 GOSUB 5000:IF KOLIZJA=0 THEN GOSUB 500:REM LEFT

370 RETURN

375 REM KOLIZJA RIGHT

380 GOSUB 6000:IF KOLIZJA=0 THEN GOSUB 600:REM RIGHT

385 RETURN

390 REM KOLIZJA DOWN

395 GOSUB 7000:IF KOLIZJADOWN=0 THEN GOSUB 700:REM DOWN

396 IF KOLIZJADOWN=1 THEN GOSUB 20000

397 IF KOLIZJADOWN=1 THEN GOSUB 30000

400 RETURN

405 REM KOLIZJA UP ROTATE

410 GOSUB 8000:IF KOLIZJA=0 THEN GOSUB 800:REM UP ROTATE

415 RETURN

500 REM LEFT

501 RYSUJ=0:GOSUB 900:RYSUJ=1:KX=KX-1:GOSUB 900

503 RETURN

600 REM RIGHT

601 RYSUJ=0:GOSUB 900:RYSUJ=1:KX=KX+1:GOSUB 900

603 RETURN

700 REM DOWN

710 RYSUJ=0:GOSUB 900:RYSUJ=1:KY=KY+1:GOSUB 900

720 RETURN

800 REM UP ROTATE

801 RYSUJ=0:GOSUB 900

802 RYSUJ=1:R=R+1

810 GOSUB 900

825 RETURN

900 REM RYSUJE KLOCEK

901 IF R=5 THEN R=1

910 IF (K=1 AND R=1) THEN GOTO 1001

911 IF (K=1 AND R=2) THEN GOTO 1030

912 IF (K=1 AND R=3) THEN GOTO 1200

913 IF (K=1 AND R=4) THEN GOTO 1400

914 IF (K=2 AND R=1) THEN GOTO 1600

915 IF (K=2 AND R=2) THEN GOTO 1800

916 IF (K=2 AND R=3) THEN GOTO 2000

917 IF (K=2 AND R=4) THEN GOTO 2200

919 IF (K=3 AND R=1) THEN GOTO 2500

920 IF (K=3 AND R=2) THEN GOTO 2700

921 IF (K=3 AND R=3) THEN GOTO 2900

922 IF (K=3 AND R=4) THEN GOTO 3100

925 IF (K=4 AND R=1) THEN GOTO 3300

926 IF (K=4 AND R=2) THEN GOTO 3500

927 IF (K=4 AND R=3) THEN GOTO 3300

928 IF (K=4 AND R=4) THEN GOTO 3500

930 IF (K=5 AND R=1) THEN GOTO 3700

931 IF (K=5 AND R=2) THEN GOTO 3700

932 IF (K=5 AND R=3) THEN GOTO 3700

933 IF (K=5 AND R=4) THEN GOTO 3700

1001 REM K=1 R=1

1002 POSITION KX+14+1,KY

1003 IF RYSUJ=0 THEN ? " "

1004 IF RYSUJ=1 THEN ? "á"

1005 POSITION KX+14+0,KY+1

1006 IF RYSUJ=0 THEN ? " "

1007 IF RYSUJ=1 THEN ? "á"

1008 POSITION KX+14+1,KY+1

1009 IF RYSUJ=0 THEN ? " "

1010 IF RYSUJ=1 THEN ? "á"

1011 POSITION KX+14+2,KY+1

1012 IF RYSUJ=0 THEN ? " "

1013 IF RYSUJ=1 THEN ? "á"

1015 RETURN

1020 REM K=1 R=2

1030 POSITION KX+14+1,KY

1040 IF RYSUJ=0 THEN ? " "

1050 IF RYSUJ=1 THEN ? "á"

1060 POSITION KX+14+1,KY+1

1070 IF RYSUJ=0 THEN ? " "

1080 IF RYSUJ=1 THEN ? "á"

1090 POSITION KX+14+2,KY+1

1100 IF RYSUJ=0 THEN ? " "

1110 IF RYSUJ=1 THEN ? "á"

1120 POSITION KX+14+1,KY+2

1130 IF RYSUJ=0 THEN ? " "

1140 IF RYSUJ=1 THEN ? "á"

1149 RETURN

1200 REM K=1 R=3

1210 POSITION KX+14+0,KY+1

1220 IF RYSUJ=0 THEN ? " "

1230 IF RYSUJ=1 THEN ? "á"

1240 POSITION KX+14+1,KY+1

1250 IF RYSUJ=0 THEN ? " "

1260 IF RYSUJ=1 THEN ? "á"

1270 POSITION KX+14+2,KY+1

1280 IF RYSUJ=0 THEN ? " "

1290 IF RYSUJ=1 THEN ? "á"

1300 POSITION KX+14+1,KY+2

1310 IF RYSUJ=0 THEN ? " "

1320 IF RYSUJ=1 THEN ? "á"

1330 RETURN

1400 REM K=1 R=4

1410 POSITION KX+14+1,KY+0

1420 IF RYSUJ=0 THEN ? " "

1430 IF RYSUJ=1 THEN ? "á"

1440 POSITION KX+14+0,KY+1

1450 IF RYSUJ=0 THEN ? " "

1460 IF RYSUJ=1 THEN ? "á"

1470 POSITION KX+14+1,KY+1

1480 IF RYSUJ=0 THEN ? " "

1490 IF RYSUJ=1 THEN ? "á"

1500 POSITION KX+14+1,KY+2

1510 IF RYSUJ=0 THEN ? " "

1520 IF RYSUJ=1 THEN ? "á"

1530 RETURN

1600 REM K=2 R=1

1610 POSITION KX+14+1,KY+0

1620 IF RYSUJ=0 THEN ? " "

1630 IF RYSUJ=1 THEN ? "á"

1640 POSITION KX+14+1,KY+1

1650 IF RYSUJ=0 THEN ? " "

1660 IF RYSUJ=1 THEN ? "á"

1670 POSITION KX+14+1,KY+2

1680 IF RYSUJ=0 THEN ? " "

1690 IF RYSUJ=1 THEN ? "á"

1700 POSITION KX+14+2,KY+2

1710 IF RYSUJ=0 THEN ? " "

1720 IF RYSUJ=1 THEN ? "á"

1730 RETURN

1800 REM K=2 R=2

1810 POSITION KX+14+0,KY+1

1820 IF RYSUJ=0 THEN ? " "

1830 IF RYSUJ=1 THEN ? "á"

1840 POSITION KX+14+1,KY+1

1850 IF RYSUJ=0 THEN ? " "

1860 IF RYSUJ=1 THEN ? "á"

1870 POSITION KX+14+2,KY+1

1880 IF RYSUJ=0 THEN ? " "

1890 IF RYSUJ=1 THEN ? "á"

1900 POSITION KX+14+0,KY+2

1910 IF RYSUJ=0 THEN ? " "

1920 IF RYSUJ=1 THEN ? "á"

1930 RETURN

2000 POSITION KX+14+1,KY+2

2010 IF RYSUJ=0 THEN ? " "

2020 IF RYSUJ=1 THEN ? "á"

2040 POSITION KX+14+1,KY+0

2050 IF RYSUJ=0 THEN ? " "

2060 IF RYSUJ=1 THEN ? "á"

2070 POSITION KX+14+1,KY+1

2080 IF RYSUJ=0 THEN ? " "

2090 IF RYSUJ=1 THEN ? "á"

2100 POSITION KX+14+0,KY+0

2110 IF RYSUJ=0 THEN ? " "

2120 IF RYSUJ=1 THEN ? "á"

2130 RETURN

2200 REM K=2 R=4

2300 POSITION KX+14+0,KY+1

2310 IF RYSUJ=0 THEN ? " "

2320 IF RYSUJ=1 THEN ? "á"

2340 POSITION KX+14+1,KY+1

2350 IF RYSUJ=0 THEN ? " "

2360 IF RYSUJ=1 THEN ? "á"

2370 POSITION KX+14+2,KY+1

2380 IF RYSUJ=0 THEN ? " "

2390 IF RYSUJ=1 THEN ? "á"

2400 POSITION KX+14+2,KY+0

2410 IF RYSUJ=0 THEN ? " "

2420 IF RYSUJ=1 THEN ? "á"

2430 RETURN

2500 REM K=3 R=1

2501 POSITION KX+14+0,KY+2

2510 IF RYSUJ=0 THEN ? " "

2520 IF RYSUJ=1 THEN ? "á"

2540 POSITION KX+14+1,KY+0

2550 IF RYSUJ=0 THEN ? " "

2560 IF RYSUJ=1 THEN ? "á"

2570 POSITION KX+14+1,KY+1

2580 IF RYSUJ=0 THEN ? " "

2590 IF RYSUJ=1 THEN ? "á"

2600 POSITION KX+14+1,KY+2

2610 IF RYSUJ=0 THEN ? " "

2620 IF RYSUJ=1 THEN ? "á"

2630 RETURN

2700 REM K=3 R=2

2701 POSITION KX+14+0,KY+1

2710 IF RYSUJ=0 THEN ? " "

2720 IF RYSUJ=1 THEN ? "á"

2740 POSITION KX+14+1,KY+1

2750 IF RYSUJ=0 THEN ? " "

2760 IF RYSUJ=1 THEN ? "á"

2770 POSITION KX+14+2,KY+1

2780 IF RYSUJ=0 THEN ? " "

2790 IF RYSUJ=1 THEN ? "á"

2800 POSITION KX+14+0,KY+0

2810 IF RYSUJ=0 THEN ? " "

2820 IF RYSUJ=1 THEN ? "á"

2830 RETURN

2900 REM K=3 R=3

2901 POSITION KX+14+2,KY+0

2910 IF RYSUJ=0 THEN ? " "

2920 IF RYSUJ=1 THEN ? "á"

2940 POSITION KX+14+1,KY+0

2950 IF RYSUJ=0 THEN ? " "

2960 IF RYSUJ=1 THEN ? "á"

2970 POSITION KX+14+1,KY+1

2980 IF RYSUJ=0 THEN ? " "

2990 IF RYSUJ=1 THEN ? "á"

3000 POSITION KX+14+1,KY+2

3010 IF RYSUJ=0 THEN ? " "

3020 IF RYSUJ=1 THEN ? "á"

3030 RETURN

3100 REM K=3 R=4

3101 POSITION KX+14+2,KY+2

3110 IF RYSUJ=0 THEN ? " "

3120 IF RYSUJ=1 THEN ? "á"

3140 POSITION KX+14+0,KY+1

3150 IF RYSUJ=0 THEN ? " "

3160 IF RYSUJ=1 THEN ? "á"

3170 POSITION KX+14+1,KY+1

3180 IF RYSUJ=0 THEN ? " "

3190 IF RYSUJ=1 THEN ? "á"

3200 POSITION KX+14+2,KY+1

3210 IF RYSUJ=0 THEN ? " "

3220 IF RYSUJ=1 THEN ? "á"

3230 RETURN

3300 REM K=4 R=1

3301 POSITION KX+14+0,KY+2

3310 IF RYSUJ=0 THEN ? " "

3320 IF RYSUJ=1 THEN ? "á"

3340 POSITION KX+14+1,KY+2

3350 IF RYSUJ=0 THEN ? " "

3360 IF RYSUJ=1 THEN ? "á"

3370 POSITION KX+14+1,KY+1

3380 IF RYSUJ=0 THEN ? " "

3390 IF RYSUJ=1 THEN ? "á"

3400 POSITION KX+14+2,KY+1

3410 IF RYSUJ=0 THEN ? " "

3420 IF RYSUJ=1 THEN ? "á"

3430 RETURN

3500 REM K=4 R=2

3501 POSITION KX+14+1,KY+0

3510 IF RYSUJ=0 THEN ? " "

3520 IF RYSUJ=1 THEN ? "á"

3540 POSITION KX+14+1,KY+1

3550 IF RYSUJ=0 THEN ? " "

3560 IF RYSUJ=1 THEN ? "á"

3570 POSITION KX+14+2,KY+1

3580 IF RYSUJ=0 THEN ? " "

3590 IF RYSUJ=1 THEN ? "á"

3600 POSITION KX+14+2,KY+2

3610 IF RYSUJ=0 THEN ? " "

3620 IF RYSUJ=1 THEN ? "á"

3630 RETURN

3700 REM K=5 R=1

3701 POSITION KX+14+0,KY+0

3710 IF RYSUJ=0 THEN ? " "

3720 IF RYSUJ=1 THEN ? "á"

3740 POSITION KX+14+1,KY+0

3750 IF RYSUJ=0 THEN ? " "

3760 IF RYSUJ=1 THEN ? "á"

3770 POSITION KX+14+0,KY+1

3780 IF RYSUJ=0 THEN ? " "

3790 IF RYSUJ=1 THEN ? "á"

3800 POSITION KX+14+1,KY+1

3810 IF RYSUJ=0 THEN ? " "

3820 IF RYSUJ=1 THEN ? "á"

3830 RETURN

5000 REM KOLIZJA LEFT

5002 IF K=1 AND R=1 THEN GOTO 5040

5003 IF K=1 AND R=2 THEN GOTO 5060

5004 IF K=1 AND R=3 THEN GOTO 5080

5005 IF K=1 AND R=4 THEN GOTO 5100

5006 IF K=2 AND R=1 THEN GOTO 5120

5007 IF K=2 AND R=2 THEN GOTO 5140

5008 IF K=2 AND R=3 THEN GOTO 5160

5009 IF K=2 AND R=4 THEN GOTO 5180

5010 IF K=3 AND R=1 THEN GOTO 5200

5011 IF K=3 AND R=2 THEN GOTO 5220

5012 IF K=3 AND R=3 THEN GOTO 5240

5013 IF K=3 AND R=4 THEN GOTO 5260

5014 IF K=4 AND R=1 THEN GOTO 5280

5015 IF K=4 AND R=2 THEN GOTO 5300

5016 IF K=4 AND R=3 THEN GOTO 5280

5017 IF K=4 AND R=4 THEN GOTO 5300

5018 IF K=5 AND R=1 THEN GOTO 5320

5019 IF K=5 AND R=2 THEN GOTO 5320

5020 IF K=5 AND R=3 THEN GOTO 5320

5021 IF K=5 AND R=4 THEN GOTO 5320

5040 REM K=1 R=1

5044 IF KX=0 THEN KOLIZJA=1

5046 IF KX>0 THEN IF A(KX+0-1,KY+1)=1 THEN KOLIZJA=1

5048 IF KX>0 THEN IF A(KX+1-1,KY+1)=1 THEN KOLIZJA=1

5050 IF KX>0 THEN IF A(KX+2-1,KY+1)=1 THEN KOLIZJA=1

5052 IF KX>0 THEN IF A(KX+1-1,KY+0)=1 THEN KOLIZJA=1

5054 RETURN

5060 REM K=1 R=2

5064 IF KX+1=0 THEN KOLIZJA=1

5066 IF KX+1>0 THEN IF A(KX+1-1,KY+0)=1 THEN KOLIZJA=1

5068 IF KX+1>0 THEN IF A(KX+1-1,KY+1)=1 THEN KOLIZJA=1

5070 IF KX+1>0 THEN IF A(KX+1-1,KY+2)=1 THEN KOLIZJA=1

5072 IF KX+1>0 THEN IF A(KX+2-1,KY+1)=1 THEN KOLIZJA=1

5074 RETURN

5080 REM K=1 R=3

5084 IF KX=0 THEN KOLIZJA=1

5086 IF KX>0 THEN IF A(KX+0-1,KY+1)=1 THEN KOLIZJA=1

5088 IF KX>0 THEN IF A(KX+1-1,KY+1)=1 THEN KOLIZJA=1

5090 IF KX>0 THEN IF A(KX+2-1,KY+1)=1 THEN KOLIZJA=1

5092 IF KX>0 THEN IF A(KX+1-1,KY+2)=1 THEN KOLIZJA=1

5094 RETURN

5100 REM K=1 R=4

5102 IF KX=0 THEN KOLIZJA=1

5104 IF KX>0 THEN IF A(KX+1-1,KY+0)=1 THEN KOLIZJA=1

5106 IF KX>0 THEN IF A(KX+1-1,KY+1)=1 THEN KOLIZJA=1

5108 IF KX>0 THEN IF A(KX+1-1,KY+2)=1 THEN KOLIZJA=1

5110 IF KX>0 THEN IF A(KX+0-1,KY+1)=1 THEN KOLIZJA=1

5112 RETURN

5120 REM K=2 R=1

5124 IF KX+1=0 THEN KOLIZJA=1

5126 IF KX+1>0 THEN IF A(KX+1-1,KY+0)=1 THEN KOLIZJA=1

5128 IF KX+1>0 THEN IF A(KX+1-1,KY+1)=1 THEN KOLIZJA=1

5130 IF KX+1>0 THEN IF A(KX+1-1,KY+2)=1 THEN KOLIZJA=1

5132 IF KX+1>0 THEN IF A(KX+2-1,KY+2)=1 THEN KOLIZJA=1

5134 RETURN

5140 REM K=2 R=2

5144 IF KX=0 THEN KOLIZJA=1

5146 IF KX>0 THEN IF A(KX+0-1,KY+1)=1 THEN KOLIZJA=1

5148 IF KX>0 THEN IF A(KX+1-1,KY+1)=1 THEN KOLIZJA=1

5150 IF KX>0 THEN IF A(KX+2-1,KY+1)=1 THEN KOLIZJA=1

5152 IF KX>0 THEN IF A(KX+0-1,KY+2)=1 THEN KOLIZJA=1

5154 RETURN

5160 REM K=2 R=3

5164 IF KX=0 THEN KOLIZJA=1

5166 IF KX>0 THEN IF A(KX+1-1,KY+0)=1 THEN KOLIZJA=1

5168 IF KX>0 THEN IF A(KX+1-1,KY+1)=1 THEN KOLIZJA=1

5170 IF KX>0 THEN IF A(KX+1-1,KY+2)=1 THEN KOLIZJA=1

5172 IF KX>0 THEN IF A(KX+0-1,KY+0)=1 THEN KOLIZJA=1

5174 RETURN

5180 REM K=2 R=4

5184 IF KX=0 THEN KOLIZJA=1

5186 IF KX>0 THEN IF A(KX+0-1,KY+1)=1 THEN KOLIZJA=1

5188 IF KX>0 THEN IF A(KX+1-1,KY+1)=1 THEN KOLIZJA=1

5190 IF KX>0 THEN IF A(KX+2-1,KY+1)=1 THEN KOLIZJA=1

5192 IF KX>0 THEN IF A(KX+2-1,KY+0)=1 THEN KOLIZJA=1

5194 RETURN

5200 REM K=3 R=1

5202 IF KX=0 THEN KOLIZJA=1

5204 IF KX>0 THEN IF A(KX+1-1,KY+0)=1 THEN KOLIZJA=1

5206 IF KX>0 THEN IF A(KX+1-1,KY+1)=1 THEN KOLIZJA=1

5208 IF KX>0 THEN IF A(KX+1-1,KY+2)=1 THEN KOLIZJA=1

5210 IF KX>0 THEN IF A(KX+0-1,KY+2)=1 THEN KOLIZJA=1

5212 RETURN

5220 REM K=3 R=2

5224 IF KX=0 THEN KOLIZJA=1

5226 IF KX>0 THEN IF A(KX+0-1,KY+1)=1 THEN KOLIZJA=1

5228 IF KX>0 THEN IF A(KX+1-1,KY+1)=1 THEN KOLIZJA=1

5230 IF KX>0 THEN IF A(KX+2-1,KY+1)=1 THEN KOLIZJA=1

5232 IF KX>0 THEN IF A(KX+0-1,KY+0)=1 THEN KOLIZJA=1

5234 RETURN

5240 REM K=3 R=3

5244 IF KX+1=0 THEN KOLIZJA=1

5246 IF KX+1>0 THEN IF A(KX+1-1,KY+0)=1 THEN KOLIZJA=1

5248 IF KX+1>0 THEN IF A(KX+1-1,KY+1)=1 THEN KOLIZJA=1

5250 IF KX+1>0 THEN IF A(KX+1-1,KY+2)=1 THEN KOLIZJA=1

5252 IF KX+1>0 THEN IF A(KX+2-1,KY+0)=1 THEN KOLIZJA=1

5254 RETURN

5260 REM K=3 R=4

5264 IF KX=0 THEN KOLIZJA=1

5266 IF KX>0 THEN IF A(KX+0-1,KY+1)=1 THEN KOLIZJA=1

5268 IF KX>0 THEN IF A(KX+1-1,KY+1)=1 THEN KOLIZJA=1

5270 IF KX>0 THEN IF A(KX+2-1,KY+1)=1 THEN KOLIZJA=1

5272 IF KX>0 THEN IF A(KX+2-1,KY+2)=1 THEN KOLIZJA=1

5274 RETURN

5280 REM K=4 R=1

5284 IF KX=0 THEN KOLIZJA=1

5286 IF KX>0 THEN IF A(KX+0-1,KY+2)=1 THEN KOLIZJA=1

5288 IF KX>0 THEN IF A(KX+1-1,KY+2)=1 THEN KOLIZJA=1

5290 IF KX>0 THEN IF A(KX+1-1,KY+1)=1 THEN KOLIZJA=1

5292 IF KX>0 THEN IF A(KX+2-1,KY+1)=1 THEN KOLIZJA=1

5294 RETURN

5300 REM K=4 R=2

5304 IF KX+1=0 THEN KOLIZJA=1

5306 IF KX+1>0 THEN IF A(KX+1-1,KY+0)=1 THEN KOLIZJA=1

5308 IF KX+1>0 THEN IF A(KX+1-1,KY+1)=1 THEN KOLIZJA=1

5310 IF KX+1>0 THEN IF A(KX+2-1,KY+1)=1 THEN KOLIZJA=1

5312 IF KX+1>0 THEN IF A(KX+2-1,KY+2)=1 THEN KOLIZJA=1

5314 RETURN

5320 REM K=5 R=1

5324 IF KX=0 THEN KOLIZJA=1

5326 IF KX>0 THEN IF A(KX+0-1,KY+0)=1 THEN KOLIZJA=1

5328 IF KX>0 THEN IF A(KX+1-1,KY+0)=1 THEN KOLIZJA=1

5330 IF KX>0 THEN IF A(KX+0-1,KY+1)=1 THEN KOLIZJA=1

5332 IF KX>0 THEN IF A(KX+1-1,KY+1)=1 THEN KOLIZJA=1

5334 RETURN

5999 RETURN

6000 REM KOLIZJA RIGHT

6002 IF K=1 AND R=1 THEN GOTO 6040

6003 IF K=1 AND R=2 THEN GOTO 6060

6004 IF K=1 AND R=3 THEN GOTO 6080

6005 IF K=1 AND R=4 THEN GOTO 6100

6006 IF K=2 AND R=1 THEN GOTO 6120

6007 IF K=2 AND R=2 THEN GOTO 6140

6008 IF K=2 AND R=3 THEN GOTO 6160

6009 IF K=2 AND R=4 THEN GOTO 6180

6010 IF K=3 AND R=1 THEN GOTO 6200

6011 IF K=3 AND R=2 THEN GOTO 6220

6012 IF K=3 AND R=3 THEN GOTO 6240

6013 IF K=3 AND R=4 THEN GOTO 6260

6014 IF K=4 AND R=1 THEN GOTO 6280

6015 IF K=4 AND R=2 THEN GOTO 6300

6016 IF K=4 AND R=3 THEN GOTO 6280

6017 IF K=4 AND R=4 THEN GOTO 6300

6018 IF K=5 AND R=1 THEN GOTO 6320

6019 IF K=5 AND R=2 THEN GOTO 6320

6020 IF K=5 AND R=3 THEN GOTO 6320

6021 IF K=5 AND R=4 THEN GOTO 6320

6040 REM K=1 R=1

6044 IF KX=7 THEN KOLIZJA=1

6046 IF KX<7 THEN IF A(KX+0+1,KY+1)=1 THEN KOLIZJA=1

6048 IF KX<7 THEN IF A(KX+1+1,KY+1)=1 THEN KOLIZJA=1

6050 IF KX<7 THEN IF A(KX+2+1,KY+1)=1 THEN KOLIZJA=1

6052 IF KX<7 THEN IF A(KX+1+1,KY+0)=1 THEN KOLIZJA=1

6054 RETURN

6060 REM K=1 R=2

6064 IF KX=7 THEN KOLIZJA=1

6066 IF KX<7 THEN IF A(KX+1+1,KY+0)=1 THEN KOLIZJA=1

6068 IF KX<7 THEN IF A(KX+1+1,KY+1)=1 THEN KOLIZJA=1

6070 IF KX<7 THEN IF A(KX+1+1,KY+2)=1 THEN KOLIZJA=1

6072 IF KX<7 THEN IF A(KX+2+1,KY+1)=1 THEN KOLIZJA=1

6074 RETURN

6080 REM K=1 R=3

6084 IF KX=7 THEN KOLIZJA=1

6086 IF KX<7 THEN IF A(KX+0+1,KY+1)=1 THEN KOLIZJA=1

6088 IF KX<7 THEN IF A(KX+1+1,KY+1)=1 THEN KOLIZJA=1

6090 IF KX<7 THEN IF A(KX+2+1,KY+1)=1 THEN KOLIZJA=1

6092 IF KX<7 THEN IF A(KX+1+1,KY+2)=1 THEN KOLIZJA=1

6094 RETURN

6100 REM K=1 R=4

6104 IF KX=8 THEN KOLIZJA=1

6106 IF KX<8 THEN IF A(KX+1+1,KY+0)=1 THEN KOLIZJA=1

6108 IF KX<8 THEN IF A(KX+1+1,KY+1)=1 THEN KOLIZJA=1

6110 IF KX<8 THEN IF A(KX+1+1,KY+2)=1 THEN KOLIZJA=1

6112 IF KX<8 THEN IF A(KX+0+1,KY+1)=1 THEN KOLIZJA=1

6114 RETURN

6120 REM K=2 R=1

6124 IF KX=7 THEN KOLIZJA=1

6126 IF KX<7 THEN IF A(KX+1+1,KY+0)=1 THEN KOLIZJA=1

6128 IF KX<7 THEN IF A(KX+1+1,KY+1)=1 THEN KOLIZJA=1

6130 IF KX<7 THEN IF A(KX+1+1,KY+2)=1 THEN KOLIZJA=1

6132 IF KX<7 THEN IF A(KX+2+1,KY+2)=1 THEN KOLIZJA=1

6133 RETURN

6140 REM K=2 R=2

6144 IF KX=7 THEN KOLIZJA=1

6146 IF KX<7 THEN IF A(KX+0+1,KY+1)=1 THEN KOLIZJA=1

6148 IF KX<7 THEN IF A(KX+1+1,KY+1)=1 THEN KOLIZJA=1

6150 IF KX<7 THEN IF A(KX+2+1,KY+1)=1 THEN KOLIZJA=1

6152 IF KX<7 THEN IF A(KX+0+1,KY+2)=1 THEN KOLIZJA=1

6154 RETURN

6160 REM K=2 R=3

6164 IF KX=8 THEN KOLIZJA=1

6166 IF KX<8 THEN IF A(KX+1+1,KY+0)=1 THEN KOLIZJA=1

6168 IF KX<8 THEN IF A(KX+1+1,KY+1)=1 THEN KOLIZJA=1

6170 IF KX<8 THEN IF A(KX+1+1,KY+2)=1 THEN KOLIZJA=1

6172 IF KX<8 THEN IF A(KX+0+1,KY+0)=1 THEN KOLIZJA=1

6174 RETURN

6180 REM K=2 R=4

6184 IF KX=7 THEN KOLIZJA=1

6186 IF KX<7 THEN IF A(KX+0+1,KY+1)=1 THEN KOLIZJA=1

6188 IF KX<7 THEN IF A(KX+1+1,KY+1)=1 THEN KOLIZJA=1

6190 IF KX<7 THEN IF A(KX+2+1,KY+1)=1 THEN KOLIZJA=1

6192 IF KX<7 THEN IF A(KX+2+1,KY+0)=1 THEN KOLIZJA=1

6194 RETURN

6200 REM K=3 R=1

6204 IF KX=8 THEN KOLIZJA=1

6206 IF KX<8 THEN IF A(KX+1+1,KY+0)=1 THEN KOLIZJA=1

6208 IF KX<8 THEN IF A(KX+1+1,KY+1)=1 THEN KOLIZJA=1

6210 IF KX<8 THEN IF A(KX+1+1,KY+2)=1 THEN KOLIZJA=1

6212 IF KX<8 THEN IF A(KX+0+1,KY+2)=1 THEN KOLIZJA=1

6214 RETURN

6220 REM K=3 R=2

6224 IF KX=7 THEN KOLIZJA=1

6226 IF KX<7 THEN IF A(KX+0+1,KY+1)=1 THEN KOLIZJA=1

6228 IF KX<7 THEN IF A(KX+1+1,KY+1)=1 THEN KOLIZJA=1

6230 IF KX<7 THEN IF A(KX+2+1,KY+1)=1 THEN KOLIZJA=1

6232 IF KX<7 THEN IF A(KX+0+1,KY+0)=1 THEN KOLIZJA=1

6234 RETURN

6240 REM K=3 R=3

6244 IF KX=7 THEN KOLIZJA=1

6246 IF KX<7 THEN IF A(KX+1+1,KY+0)=1 THEN KOLIZJA=1

6248 IF KX<7 THEN IF A(KX+1+1,KY+1)=1 THEN KOLIZJA=1

6250 IF KX<7 THEN IF A(KX+1+1,KY+2)=1 THEN KOLIZJA=1

6252 IF KX<7 THEN IF A(KX+2+1,KY+0)=1 THEN KOLIZJA=1

6254 RETURN

6260 REM K=3 R=4

6264 IF KX=7 THEN KOLIZJA=1

6266 IF KX<7 THEN IF A(KX+0+1,KY+1)=1 THEN KOLIZJA=1

6268 IF KX<7 THEN IF A(KX+1+1,KY+1)=1 THEN KOLIZJA=1

6270 IF KX<7 THEN IF A(KX+2+1,KY+1)=1 THEN KOLIZJA=1

6272 IF KX<7 THEN IF A(KX+2+1,KY+2)=1 THEN KOLIZJA=1

6274 RETURN

6280 REM K=4 R=1

6284 IF KX=7 THEN KOLIZJA=1

6286 IF KX<7 THEN IF A(KX+0+1,KY+2)=1 THEN KOLIZJA=1

6288 IF KX<7 THEN IF A(KX+1+1,KY+2)=1 THEN KOLIZJA=1

6290 IF KX<7 THEN IF A(KX+1+1,KY+1)=1 THEN KOLIZJA=1

6292 IF KX<7 THEN IF A(KX+2+1,KY+1)=1 THEN KOLIZJA=1

6294 RETURN

6300 REM K=4 R=2

6304 IF KX=7 THEN KOLIZJA=1

6306 IF KX<7 THEN IF A(KX+1+1,KY+0)=1 THEN KOLIZJA=1

6308 IF KX<7 THEN IF A(KX+1+1,KY+1)=1 THEN KOLIZJA=1

6310 IF KX<7 THEN IF A(KX+2+1,KY+1)=1 THEN KOLIZJA=1

6312 IF KX<7 THEN IF A(KX+2+1,KY+2)=1 THEN KOLIZJA=1

6314 RETURN

6320 REM K=5 R=1

6324 IF KX=8 THEN KOLIZJA=1

6326 IF KX<8 THEN IF A(KX+0+1,KY+0)=1 THEN KOLIZJA=1

6328 IF KX<8 THEN IF A(KX+1+1,KY+0)=1 THEN KOLIZJA=1

6330 IF KX<8 THEN IF A(KX+0+1,KY+1)=1 THEN KOLIZJA=1

6332 IF KX<8 THEN IF A(KX+1+1,KY+1)=1 THEN KOLIZJA=1

6334 RETURN

6999 RETURN

7000 REM KOLIZJA DOWN

7002 IF K=1 AND R=1 THEN GOTO 7040

7003 IF K=1 AND R=2 THEN GOTO 7060

7004 IF K=1 AND R=3 THEN GOTO 7080

7005 IF K=1 AND R=4 THEN GOTO 7100

7006 IF K=2 AND R=1 THEN GOTO 7120

7007 IF K=2 AND R=2 THEN GOTO 7140

7008 IF K=2 AND R=3 THEN GOTO 7160

7009 IF K=2 AND R=4 THEN GOTO 7180

7010 IF K=3 AND R=1 THEN GOTO 7200

7011 IF K=3 AND R=2 THEN GOTO 7220

7012 IF K=3 AND R=3 THEN GOTO 7240

7013 IF K=3 AND R=4 THEN GOTO 7260

7014 IF K=4 AND R=1 THEN GOTO 7280

7015 IF K=4 AND R=2 THEN GOTO 7300

7016 IF K=4 AND R=3 THEN GOTO 7280

7017 IF K=4 AND R=4 THEN GOTO 7300

7018 IF K=5 AND R=1 THEN GOTO 7320

7019 IF K=5 AND R=2 THEN GOTO 7320

7020 IF K=5 AND R=3 THEN GOTO 7320

7021 IF K=5 AND R=4 THEN GOTO 7320

7040 REM K=1 R=1

7044 IF KY=18 THEN KOLIZJADOWN=1

7046 IF KY<18 THEN IF A(KX+0,KY+1+1)=1 THEN KOLIZJADOWN=1

7048 IF KY<18 THEN IF A(KX+1,KY+1+1)=1 THEN KOLIZJADOWN=1

7050 IF KY<18 THEN IF A(KX+2,KY+1+1)=1 THEN KOLIZJADOWN=1

7052 IF KY<18 THEN IF A(KX+1,KY+0+1)=1 THEN KOLIZJADOWN=1

7054 RETURN

7060 REM K=1 R=2

7064 IF KY=17 THEN KOLIZJADOWN=1

7066 IF KY<17 THEN IF A(KX+1,KY+0+1)=1 THEN KOLIZJADOWN=1

7068 IF KY<17 THEN IF A(KX+1,KY+1+1)=1 THEN KOLIZJADOWN=1

7070 IF KY<17 THEN IF A(KX+1,KY+2+1)=1 THEN KOLIZJADOWN=1

7072 IF KY<17 THEN IF A(KX+2,KY+1+1)=1 THEN KOLIZJADOWN=1

7074 RETURN

7080 REM K=1 R=3

7084 IF KY=17 THEN KOLIZJADOWN=1

7086 IF KY<17 THEN IF A(KX+0,KY+1+1)=1 THEN KOLIZJADOWN=1

7088 IF KY<17 THEN IF A(KX+1,KY+1+1)=1 THEN KOLIZJADOWN=1

7090 IF KY<17 THEN IF A(KX+2,KY+1+1)=1 THEN KOLIZJADOWN=1

7092 IF KY<17 THEN IF A(KX+1,KY+2+1)=1 THEN KOLIZJADOWN=1

7094 RETURN

7100 REM K=1 R=4

7102 IF KY=17 THEN KOLIZJADOWN=1

7104 IF KY<17 THEN IF A(KX+1,KY+0+1)=1 THEN KOLIZJADOWN=1

7106 IF KY<17 THEN IF A(KX+1,KY+1+1)=1 THEN KOLIZJADOWN=1

7108 IF KY<17 THEN IF A(KX+1,KY+2+1)=1 THEN KOLIZJADOWN=1

7110 IF KY<17 THEN IF A(KX+0,KY+1+1)=1 THEN KOLIZJADOWN=1

7112 RETURN

7120 REM K=2 R=1

7124 IF KY=17 THEN KOLIZJADOWN=1

7126 IF KY<17 THEN IF A(KX+1,KY+0+1)=1 THEN KOLIZJADOWN=1

7128 IF KY<17 THEN IF A(KX+1,KY+1+1)=1 THEN KOLIZJADOWN=1

7130 IF KY<17 THEN IF A(KX+1,KY+2+1)=1 THEN KOLIZJADOWN=1

7132 IF KY<17 THEN IF A(KX+2,KY+2+1)=1 THEN KOLIZJADOWN=1

7134 RETURN

7140 REM K=2 R=2

7144 IF KY=17 THEN KOLIZJADOWN=1

7146 IF KY<17 THEN IF A(KX+0,KY+1+1)=1 THEN KOLIZJADOWN=1

7148 IF KY<17 THEN IF A(KX+1,KY+1+1)=1 THEN KOLIZJADOWN=1

7150 IF KY<17 THEN IF A(KX+2,KY+1+1)=1 THEN KOLIZJADOWN=1

7152 IF KY<17 THEN IF A(KX+0,KY+2+1)=1 THEN KOLIZJADOWN=1

7154 RETURN

7160 REM K=2 R=3

7164 IF KY=17 THEN KOLIZJADOWN=1

7166 IF KY<17 THEN IF A(KX+1,KY+0+1)=1 THEN KOLIZJADOWN=1

7168 IF KY<17 THEN IF A(KX+1,KY+1+1)=1 THEN KOLIZJADOWN=1

7170 IF KY<17 THEN IF A(KX+1,KY+2+1)=1 THEN KOLIZJADOWN=1

7172 IF KY<17 THEN IF A(KX+0,KY+0+1)=1 THEN KOLIZJADOWN=1

7174 RETURN

7180 REM K=2 R=4

7184 IF KY=18 THEN KOLIZJADOWN=1

7186 IF KY<18 THEN IF A(KX+0,KY+1+1)=1 THEN KOLIZJADOWN=1

7188 IF KY<18 THEN IF A(KX+1,KY+1+1)=1 THEN KOLIZJADOWN=1

7190 IF KY<18 THEN IF A(KX+2,KY+1+1)=1 THEN KOLIZJADOWN=1

7192 IF KY<18 THEN IF A(KX+2,KY+0+1)=1 THEN KOLIZJADOWN=1

7194 RETURN

7200 REM K=3 R=1

7204 IF KY=17 THEN KOLIZJADOWN=1

7206 IF KY<17 THEN IF A(KX+1,KY+0+1)=1 THEN KOLIZJADOWN=1

7208 IF KY<17 THEN IF A(KX+1,KY+1+1)=1 THEN KOLIZJADOWN=1

7210 IF KY<17 THEN IF A(KX+1,KY+2+1)=1 THEN KOLIZJADOWN=1

7212 IF KY<17 THEN IF A(KX+0,KY+2+1)=1 THEN KOLIZJADOWN=1

7214 RETURN

7220 REM K=3 R=2

7224 IF KY=18 THEN KOLIZJADOWN=1

7226 IF KY<18 THEN IF A(KX+0,KY+1+1)=1 THEN KOLIZJADOWN=1

7228 IF KY<18 THEN IF A(KX+1,KY+1+1)=1 THEN KOLIZJADOWN=1

7230 IF KY<18 THEN IF A(KX+2,KY+1+1)=1 THEN KOLIZJADOWN=1

7232 IF KY<18 THEN IF A(KX+0,KY+0+1)=1 THEN KOLIZJADOWN=1

7234 RETURN

7240 REM K=3 R=3

7244 IF KY=17 THEN KOLIZJADOWN=1

7246 IF KY<17 THEN IF A(KX+1,KY+0+1)=1 THEN KOLIZJADOWN=1

7248 IF KY<17 THEN IF A(KX+1,KY+1+1)=1 THEN KOLIZJADOWN=1

7250 IF KY<17 THEN IF A(KX+1,KY+2+1)=1 THEN KOLIZJADOWN=1

7252 IF KY<17 THEN IF A(KX+2,KY+0+1)=1 THEN KOLIZJADOWN=1

7254 RETURN

7260 REM K=3 R=4

7264 IF KY=17 THEN KOLIZJADOWN=1

7266 IF KY<17 THEN IF A(KX+0,KY+1+1)=1 THEN KOLIZJADOWN=1

7268 IF KY<17 THEN IF A(KX+1,KY+1+1)=1 THEN KOLIZJADOWN=1

7270 IF KY<17 THEN IF A(KX+2,KY+1+1)=1 THEN KOLIZJADOWN=1

7272 IF KY<17 THEN IF A(KX+2,KY+2+1)=1 THEN KOLIZJADOWN=1

7274 RETURN

7280 REM K=4 R=1

7284 IF KY=17 THEN KOLIZJADOWN=1

7286 IF KY<17 THEN IF A(KX+0,KY+2+1)=1 THEN KOLIZJADOWN=1

7288 IF KY<17 THEN IF A(KX+1,KY+2+1)=1 THEN KOLIZJADOWN=1

7290 IF KY<17 THEN IF A(KX+1,KY+1+1)=1 THEN KOLIZJADOWN=1

7292 IF KY<17 THEN IF A(KX+2,KY+1+1)=1 THEN KOLIZJADOWN=1

7294 RETURN

7300 REM K=4 R=2

7304 IF KY=17 THEN KOLIZJADOWN=1

7306 IF KY<17 THEN IF A(KX+1,KY+0+1)=1 THEN KOLIZJADOWN=1

7308 IF KY<17 THEN IF A(KX+1,KY+1+1)=1 THEN KOLIZJADOWN=1

7310 IF KY<17 THEN IF A(KX+2,KY+1+1)=1 THEN KOLIZJADOWN=1

7312 IF KY<17 THEN IF A(KX+2,KY+2+1)=1 THEN KOLIZJADOWN=1

7314 RETURN

7320 REM K=5 R=1

7324 IF KY=18 THEN KOLIZJADOWN=1

7326 IF KY<18 THEN IF A(KX+0,KY+0+1)=1 THEN KOLIZJADOWN=1

7328 IF KY<18 THEN IF A(KX+1,KY+0+1)=1 THEN KOLIZJADOWN=1

7330 IF KY<18 THEN IF A(KX+0,KY+1+1)=1 THEN KOLIZJADOWN=1

7332 IF KY<18 THEN IF A(KX+1,KY+1+1)=1 THEN KOLIZJADOWN=1

7334 RETURN

7999 RETURN

8000 REM KOLIZJA UP ROTATE

8999 RETURN

20000 REM RZUTOWANIE

20010 IF K=1 AND R=1 THEN GOTO 25000

20011 IF K=1 AND R=2 THEN GOTO 25020

20012 IF K=1 AND R=3 THEN GOTO 25040

20014 IF K=1 AND R=4 THEN GOTO 25060

20015 IF K=2 AND R=1 THEN GOTO 25080

20016 IF K=2 AND R=2 THEN GOTO 25090

20017 IF K=2 AND R=3 THEN GOTO 25110

20018 IF K=2 AND R=4 THEN GOTO 25130

20019 IF K=3 AND R=1 THEN GOTO 25150

20020 IF K=3 AND R=2 THEN GOTO 25170

20021 IF K=3 AND R=3 THEN GOTO 25190

20022 IF K=3 AND R=4 THEN GOTO 25210

20023 IF K=4 AND R=1 THEN GOTO 25230

20024 IF K=4 AND R=2 THEN GOTO 25250

20025 IF K=4 AND R=3 THEN GOTO 25230

20026 IF K=4 AND R=4 THEN GOTO 25250

20027 IF K=5 AND R=1 THEN GOTO 25310

20028 IF K=5 AND R=2 THEN GOTO 25310

20029 IF K=5 AND R=3 THEN GOTO 25310

20030 IF K=5 AND R=4 THEN GOTO 25310

25000 REM K=1 R=1

25002 A(KX+1,KY+0)=1

25004 A(KX+0,KY+1)=1

25006 A(KX+1,KY+1)=1

25008 A(KX+2,KY+1)=1

25010 KX=3:KY=0:K=LOS

25012 RETURN

25020 REM K=1 R=2

25022 A(KX+1,KY+0)=1

25024 A(KX+1,KY+1)=1

25026 A(KX+1,KY+2)=1

25028 A(KX+2,KY+1)=1

25030 KX=3:KY=0:K=LOS

25032 RETURN

25040 REM K=1 R=3

25042 A(KX+0,KY+1)=1

25044 A(KX+1,KY+1)=1

25046 A(KX+2,KY+1)=1

25048 A(KX+1,KY+2)=1

25050 KX=3:KY=0:K=LOS

25052 RETURN

25060 REM K=1 R=4

25062 A(KX+0,KY+1)=1

25064 A(KX+1,KY+0)=1

25066 A(KX+1,KY+1)=1

25068 A(KX+1,KY+2)=1

25070 KX=3:KY=0:K=LOS

25072 RETURN

25080 REM K=2 R=1

25082 A(KX+1,KY+0)=1

25084 A(KX+1,KY+1)=1

25086 A(KX+1,KY+2)=1

25088 A(KX+2,KY+2)=1:KX=3:KY=0:K=LOS:RETURN

25090 REM K=2 R=2

25092 A(KX+0,KY+1)=1

25094 A(KX+1,KY+1)=1

25096 A(KX+2,KY+1)=1

25098 A(KX+0,KY+2)=1

25100 KX=3:KY=0:K=LOS:RETURN

25110 REM K=2 R=3

25112 A(KX+1,KY+0)=1

25114 A(KX+1,KY+1)=1

25116 A(KX+1,KY+2)=1

25118 A(KX+0,KY+0)=1

25120 KX=3:KY=0:K=LOS:RETURN

25130 REM K=2 R=4

25132 A(KX+0,KY+1)=1

25134 A(KX+1,KY+1)=1

25136 A(KX+2,KY+1)=1

25138 A(KX+2,KY+0)=1

25140 KX=3:KY=0:K=LOS:RETURN

25150 REM K=3 R=1

25152 A(KX+1,KY+0)=1

25154 A(KX+1,KY+1)=1

25156 A(KX+1,KY+2)=1

25158 A(KX+0,KY+2)=1

25160 KX=3:KY=0:K=LOS:RETURN

25170 REM K=3 R=2

25172 A(KX+0,KY+1)=1

25174 A(KX+1,KY+1)=1

25176 A(KX+2,KY+1)=1

25178 A(KX+0,KY+0)=1

25180 KX=3:KY=0:K=LOS:RETURN

25190 REM K=3 R=3

25192 A(KX+1,KY+0)=1

25194 A(KX+1,KY+1)=1

25196 A(KX+1,KY+2)=1

25198 A(KX+2,KY+0)=1

25200 KX=3:KY=0:K=LOS:RETURN

25210 REM K=3 R=4

25212 A(KX+0,KY+1)=1

25214 A(KX+1,KY+1)=1

25216 A(KX+2,KY+1)=1

25218 A(KX+2,KY+2)=1

25220 KX=3:KY=0:K=LOS:RETURN

25230 REM K=4 R=1

25232 A(KX+0,KY+2)=1

25234 A(KX+1,KY+2)=1

25236 A(KX+1,KY+1)=1

25238 A(KX+2,KY+1)=1

25240 KX=3:KY=0:K=LOS:RETURN

25250 REM K=4 R=2

25252 A(KX+1,KY+0)=1

25254 A(KX+1,KY+1)=1

25256 A(KX+2,KY+1)=1

25258 A(KX+2,KY+2)=1

25260 KX=3:KY=0:K=LOS:RETURN

25310 REM K=5 R=1

25312 A(KX+0,KY+0)=1

25314 A(KX+1,KY+0)=1

25316 A(KX+0,KY+1)=1

25318 A(KX+1,KY+1)=1

25320 KX=3:KY=0:K=LOS:RETURN

30000 REM CZYSZCZENIE WIERSZY

30009 FOR Y=4 TO 19

30010 W=0

30011 FOR X=0 TO 9

30012 IF A(X,Y)=0 THEN W=1

30020 NEXT X

30021 IF W=0 THEN GOSUB 30060

30050 NEXT Y

30051 GOTO 30199

30060 REM OPUSC WIERSZ W DOL

30061 FOR WIERSZX=0 TO 9

30062 A(WIERSZX,Y)=0

30063 NEXT WIERSZX

30064 FOR WIERSZY=Y TO 4 STEP -1

30065 FOR ZX=0 TO 9

30066 A(ZX,WIERSZY)=A(ZX,WIERSZY-1)

30067 NEXT ZX

30068 NEXT WIERSZY

30069 SCORE=SCORE+100

30070 FOR QX=0 TO 9

30071 A(QX,0)=0:A(QX,1)=0:A(QX,2)=0:A(QX,3)=0:A(QX,4)=0

30072 NEXT QX

30198 RETURN

30199 REM RYSOWANIE EKRANU

30200 FOR Y=0 TO 19

30201 FOR X=0 TO 9

30203 POSITION X+14,Y

30204 IF A(X,Y)=1 THEN ? "á"

30205 IF A(X,Y)=0 THEN ? " "

30210 NEXT X

30211 NEXT Y

30300 FOR QX=0 TO 9

30301 A(QX,0)=0:A(QX,1)=0:A(QX,2)=0:A(QX,3)=0:A(QX,4)=0

30302 NEXT QX

30303 LOS=INT(RND(0)*5)+1

30304 POSITION 30,8:? " "

30305 POSITION 31,8:? " "

30306 POSITION 32,8:? " "

30307 POSITION 30,9:? " "

30308 POSITION 31,9:? " "

30309 POSITION 32,9:? " "

30310 POSITION 32,10:? " "

30311 POSITION 31,10:? " "

30312 POSITION 30,10:? " "

30313 IF LOS=1 THEN POSITION 31,8:? "á"

30314 IF LOS=1 THEN POSITION 30,9:? "á"

30315 IF LOS=1 THEN POSITION 31,9:? "á"

30316 IF LOS=1 THEN POSITION 32,9:? "á"

30317 IF LOS=2 THEN POSITION 31,8:? "á"

30318 IF LOS=2 THEN POSITION 31,9:? "á"

30319 IF LOS=2 THEN POSITION 31,10:? "á"

30320 IF LOS=2 THEN POSITION 32,10:? "á"

30321 IF LOS=3 THEN POSITION 31,8:? "á"

30322 IF LOS=3 THEN POSITION 31,9:? "á"

30323 IF LOS=3 THEN POSITION 31,10:? "á"

30324 IF LOS=3 THEN POSITION 30,10:? "á"

30325 IF LOS=4 THEN POSITION 30,10:? "á"

30326 IF LOS=4 THEN POSITION 31,10:? "á"

30327 IF LOS=4 THEN POSITION 31,9:? "á"

30328 IF LOS=4 THEN POSITION 32,9:? "á"

30329 IF LOS=5 THEN POSITION 30,9:? "á"

30330 IF LOS=5 THEN POSITION 31,9:? "á"

30331 IF LOS=5 THEN POSITION 30,10:? "á"

30332 IF LOS=5 THEN POSITION 31,10:? "á"

30333 POSITION 29,12:? "NEXT"

31000 RETURN

Perl

Very basic tetris. Use arrow keys for left and right (or 'h' and 'l'), up arrow for rotate (or 'r'), and down arrow for instant drop (or 'j').

#!/usr/bin/perl

use strict;
use warnings;
use Curses;
use Term::ReadKey;
use Time::HiRes qw( time );
use IO::Select;

my $delay = 1;
my $width = 12;
my $oneshort = $width - 1;
my $g3 = qr/(..{$oneshort})/s;
my $g4 = qr/(.{$oneshort})/s;
my $below = qr/....{$oneshort}/s;
my $height = 20;
my $well = ( '|' . ' ' x $width . "|\n" ) x $height . '-' x($width + 2) . "\n";
my $piece;
my $nexttime = time + $delay;
my $sel = IO::Select->new( *STDIN );

sub transpose
  {
  local $_ = $well;
  $well = '';
  $well .= "\n" while s/^./ $well .= $&; ''/gem;
  }

sub place
  {
  substr $well, $width / 2 - 1 + ($width + 3) * $_, 4, shift for 0 .. 3;
  }

my %shape =
  (
  I => [' O  ', ' O  ', ' O  ', ' O  '],
  J => ['    ', '    ', 'OOO ', '  O '],
  L => ['    ', '    ', ' OOO', ' O  '],
  O => ['    ', '    ', ' OO ', ' OO '],
  S => ['    ', '    ', ' OO ', 'OO  '],
  T => ['    ', '    ', ' O  ', 'OOO '],
  Z => ['    ', '    ', ' OO ', '  OO'],
  );

sub add
  {
  if( $well =~ /^(. *.\n){4}/ )
    {
    place $shape{$piece}->@*;
    $piece = (keys %shape)[rand keys %shape];
    }
  else
    {
    die "end of game\n";
    }
  }

sub rotate
  {
  s/   ${g3}OO $g3 OO/  O$1 OO$2 O / or # Z
  s/  O$g3 OO$g3 O /   $1OO $2 OO/ or

  s/   $g3 OO${g3}OO / O $1 OO$2  O/ or # S
  s/ O $g3 OO$g3  O/   $1 OO$2OO / or

  s/   ${g3}OOO${g3}O  /OO $1 O $2 O / or # L
  s/OO $g3 O $g3 O /   $1  O$2OOO/ or
  s/   $g3  O${g3}OOO/ O $1 O $2 OO/ or
  s/ O $g3 O $g3 OO/   $1OOO$2O  / or

  s/   ${g3}OOO$g3  O/ O $1 O $2OO / or # J
  s/ O $g3 O ${g3}OO /   $1O  $2OOO/ or
  s/   ${g3}O  ${g3}OOO/ OO$1 O $2 O / or
  s/ OO$g3 O $g3 O /   $1OOO$2  O/ or

  s/   $g3 O ${g3}OOO/ O $1 OO$2 O / or # T
  s/ O $g3 OO$g3 O /   $1OOO$2 O / or
  s/   ${g3}OOO$g3 O / O $1OO $2 O / or
  s/ O ${g3}OO $g3 O /   $1 O $2OOO/ or

  s/    $g4    $g4    ${g4}OOOO/ O  $1 O  $2 O  $3 O  / or # I
  s/ O  $g4 O  $g4 O  $g4 O  /    $1    $2    $3OOOO/ or
  s/O   ${g4}O   ${g4}O   ${g4}O   /    $1    $2    $3OOOO/ or
  s/   O$g4   O$g4   O$g4   O/    $1    $2    $3OOOO/

    for $well;
  }

sub step
  {
  if( $well =~ s/(?<=\|)#{$width}(?=\|)/ '=' x $width /e ) # full row?
    {
    transpose();
    $well =~ s/(.*)=/ $1/g; # remove full row
    transpose();
    }
  elsif( $well !~ /O/ ) # any O ?
    {
    add();
    }
  elsif( not down() ) # can't move down
    {
    $well =~ tr/O/#/; # convert to #
    }
  }

sub down
  {
  $well !~ /O/ || $well =~ /O$below[#-]/ and return 0;
  transpose();
  $well =~ s/(O+) / $1/g;
  transpose();
  return 1;
  }

sub drop { 1 while down() }

sub right { $well =~ /O[#|]/ or $well =~ s/(O+) / $1/g }

sub left { $well =~ /[#|]O/ or $well =~ s/ (O+)/$1 /g }

sub draw
  {
  addstr( 2, 0, ($well . "\n\n")  =~ s/^/' ' x 20 /gmer);
  my $row = 4;
  addstr( $row++, 10, $_ ) for @{ $shape{$piece} };
  addstr( 22, 0, ' ' );
  refresh;
  };

sub eventloop
  {
  while( 1 )
    {
    my $time = time;
    my $delta = $nexttime - $time;
    if( $delta <= 0 )
      {
      step();
      $nexttime = time + $delay;
      }
    else
      {
      draw();
      for ( $sel->can_read( $delta ) )
        {
        sysread *STDIN, $_, 1024;
        for ( /\e(?:\[M...|[O\[][0-9;]*[A-~])|./gs ) # keep esc seq together
          {
          /^(?:q|\e)\z/i ? die "quit\n" :
            /^(?:h|\e\[D)\z/ ? left() :
            /^(?:l|\e\[C)\z/ ? right() :
            /^(?:r|\e\[A)\z/ ? rotate() :
            /^(?:[j ]|\e\[B)\z/ ? drop() :
            0;
          }
        }
      }
    }
  }

$piece = (keys %shape)[rand keys %shape];
initscr();
clear;
ReadMode 'cbreak';
eval { eventloop() };
my $errormsg = $@;
ReadMode 'restore';
endwin();
print $errormsg;


Phix

See Tetris/Phix.

Python

See Python implementation of Tetris included with Raspbian

VBScript

A playable Tetris in VBScript is not possible as it can't read single keystrokes.

Wren

See Tetris/Wren

Yabasic

The code is from Artur Spengler ([1])

REM requires yabasic 2.7x, download at www.yabasic.de

REM Author:  Artur Spengler
REM Website: www.github.com/letztes/tetris
REM License: This program is free software; you can redistribute it and/or
REM      modify it under the same terms as yabasic itself.


dim BLOCK_COLOR(4)
dim rotated_figure(4)

dim CLOCKWISE_ROTATED_FIGURE_NUMBER(19)
CLOCKWISE_ROTATED_FIGURE_NUMBER(1)  = 2  REM horizontal stick rotates to vertical stick
CLOCKWISE_ROTATED_FIGURE_NUMBER(2)  = 1  REM vertical stick
CLOCKWISE_ROTATED_FIGURE_NUMBER(3)  = 3  REM No need to rotate the square block
CLOCKWISE_ROTATED_FIGURE_NUMBER(4)  = 5  REM bottom-left: nose left down horizontal L
CLOCKWISE_ROTATED_FIGURE_NUMBER(5)  = 6  REM bottom-right nose top left vertical L
CLOCKWISE_ROTATED_FIGURE_NUMBER(6)  = 7  REM bottom-left nose up horizontal L
CLOCKWISE_ROTATED_FIGURE_NUMBER(7)  = 4  REM nose bottom right vertical L
CLOCKWISE_ROTATED_FIGURE_NUMBER(8)  = 9  REM bottom-right nose down horizontal J
CLOCKWISE_ROTATED_FIGURE_NUMBER(9)  = 10 REM nose bottom left vertical J
CLOCKWISE_ROTATED_FIGURE_NUMBER(10) = 11 REM bottom-right nose up left horizontal J
CLOCKWISE_ROTATED_FIGURE_NUMBER(11) = 8  REM bottom-left nose top right vertical J
CLOCKWISE_ROTATED_FIGURE_NUMBER(12) = 13 REM left bottom horizontal S-block 
CLOCKWISE_ROTATED_FIGURE_NUMBER(13) = 12 REM right bottom vertical S-block
CLOCKWISE_ROTATED_FIGURE_NUMBER(14) = 15 REM right bottom horizontal S-block
CLOCKWISE_ROTATED_FIGURE_NUMBER(15) = 14 REM left bottom vertical S-block
CLOCKWISE_ROTATED_FIGURE_NUMBER(16) = 17 REM left bottom nose top horizontal T-brick
CLOCKWISE_ROTATED_FIGURE_NUMBER(17) = 18 REM nose right vertical T-block
CLOCKWISE_ROTATED_FIGURE_NUMBER(18) = 19 REM nose down horizontal T-block
CLOCKWISE_ROTATED_FIGURE_NUMBER(19) = 16 REM nose left vertical T-block

dim CLOCKWISE_ROTATED_X_SHIFT(19)
CLOCKWISE_ROTATED_X_SHIFT(1)  = 1
CLOCKWISE_ROTATED_X_SHIFT(2)  = -1
CLOCKWISE_ROTATED_X_SHIFT(3)  = 0
CLOCKWISE_ROTATED_X_SHIFT(4)  = 1
CLOCKWISE_ROTATED_X_SHIFT(5)  = -1
CLOCKWISE_ROTATED_X_SHIFT(6)  = 2
CLOCKWISE_ROTATED_X_SHIFT(7)  = -2
CLOCKWISE_ROTATED_X_SHIFT(8)  = -2
CLOCKWISE_ROTATED_X_SHIFT(9)  = 2
CLOCKWISE_ROTATED_X_SHIFT(10) = -1
CLOCKWISE_ROTATED_X_SHIFT(11) = 1
CLOCKWISE_ROTATED_X_SHIFT(12) = 1
CLOCKWISE_ROTATED_X_SHIFT(13) = -1
CLOCKWISE_ROTATED_X_SHIFT(14) = -1
CLOCKWISE_ROTATED_X_SHIFT(15) = 1
CLOCKWISE_ROTATED_X_SHIFT(16) = 1
CLOCKWISE_ROTATED_X_SHIFT(17) = 0
CLOCKWISE_ROTATED_X_SHIFT(18) = 0
CLOCKWISE_ROTATED_X_SHIFT(19) = -1

dim CLOCKWISE_ROTATED_Y_SHIFT(19)
CLOCKWISE_ROTATED_Y_SHIFT(1)  = 1
CLOCKWISE_ROTATED_Y_SHIFT(2)  = -1
CLOCKWISE_ROTATED_Y_SHIFT(3)  = 0
CLOCKWISE_ROTATED_Y_SHIFT(4)  = 0
CLOCKWISE_ROTATED_Y_SHIFT(5)  = -1
CLOCKWISE_ROTATED_Y_SHIFT(6)  = 1
CLOCKWISE_ROTATED_Y_SHIFT(7)  = 0
CLOCKWISE_ROTATED_Y_SHIFT(8)  = 0
CLOCKWISE_ROTATED_Y_SHIFT(9)  = -1
CLOCKWISE_ROTATED_Y_SHIFT(10) = 1
CLOCKWISE_ROTATED_Y_SHIFT(11) = 0
CLOCKWISE_ROTATED_Y_SHIFT(12) = 0
CLOCKWISE_ROTATED_Y_SHIFT(13) = 0
CLOCKWISE_ROTATED_Y_SHIFT(14) = 0
CLOCKWISE_ROTATED_Y_SHIFT(15) = 0
CLOCKWISE_ROTATED_Y_SHIFT(16) = 1
CLOCKWISE_ROTATED_Y_SHIFT(17) = 0
CLOCKWISE_ROTATED_Y_SHIFT(18) = 0
CLOCKWISE_ROTATED_Y_SHIFT(19) = -1

dim COUNTERCLOCKWISE_ROTATED_FIGURE_NUMBER(19)
COUNTERCLOCKWISE_ROTATED_FIGURE_NUMBER(1)  = 2
COUNTERCLOCKWISE_ROTATED_FIGURE_NUMBER(2)  = 1
COUNTERCLOCKWISE_ROTATED_FIGURE_NUMBER(3)  = 3
COUNTERCLOCKWISE_ROTATED_FIGURE_NUMBER(4)  = 7
COUNTERCLOCKWISE_ROTATED_FIGURE_NUMBER(5)  = 4
COUNTERCLOCKWISE_ROTATED_FIGURE_NUMBER(6)  = 5
COUNTERCLOCKWISE_ROTATED_FIGURE_NUMBER(7)  = 6
COUNTERCLOCKWISE_ROTATED_FIGURE_NUMBER(8)  = 11
COUNTERCLOCKWISE_ROTATED_FIGURE_NUMBER(9)  = 8
COUNTERCLOCKWISE_ROTATED_FIGURE_NUMBER(10) = 9
COUNTERCLOCKWISE_ROTATED_FIGURE_NUMBER(11) = 10
COUNTERCLOCKWISE_ROTATED_FIGURE_NUMBER(12) = 13
COUNTERCLOCKWISE_ROTATED_FIGURE_NUMBER(13) = 12
COUNTERCLOCKWISE_ROTATED_FIGURE_NUMBER(14) = 15
COUNTERCLOCKWISE_ROTATED_FIGURE_NUMBER(15) = 14
COUNTERCLOCKWISE_ROTATED_FIGURE_NUMBER(16) = 19
COUNTERCLOCKWISE_ROTATED_FIGURE_NUMBER(17) = 16
COUNTERCLOCKWISE_ROTATED_FIGURE_NUMBER(18) = 17
COUNTERCLOCKWISE_ROTATED_FIGURE_NUMBER(19) = 18

dim COUNTERCLOCKWISE_ROTATED_X_SHIFT(19)
COUNTERCLOCKWISE_ROTATED_X_SHIFT(1)  = 1
COUNTERCLOCKWISE_ROTATED_X_SHIFT(2)  = -1
COUNTERCLOCKWISE_ROTATED_X_SHIFT(3)  = 0
COUNTERCLOCKWISE_ROTATED_X_SHIFT(4)  = 1
COUNTERCLOCKWISE_ROTATED_X_SHIFT(7)  = -1
COUNTERCLOCKWISE_ROTATED_X_SHIFT(6)  = 2
COUNTERCLOCKWISE_ROTATED_X_SHIFT(5)  = -2
COUNTERCLOCKWISE_ROTATED_X_SHIFT(8)  = -2
COUNTERCLOCKWISE_ROTATED_X_SHIFT(11) = 2
COUNTERCLOCKWISE_ROTATED_X_SHIFT(10) = -1
COUNTERCLOCKWISE_ROTATED_X_SHIFT(9)  = 1
COUNTERCLOCKWISE_ROTATED_X_SHIFT(12) = 1
COUNTERCLOCKWISE_ROTATED_X_SHIFT(13) = -1
COUNTERCLOCKWISE_ROTATED_X_SHIFT(14) = -1
COUNTERCLOCKWISE_ROTATED_X_SHIFT(15) = 1
COUNTERCLOCKWISE_ROTATED_X_SHIFT(16) = 1
COUNTERCLOCKWISE_ROTATED_X_SHIFT(19) = 0
COUNTERCLOCKWISE_ROTATED_X_SHIFT(18) = 0
COUNTERCLOCKWISE_ROTATED_X_SHIFT(17) = -1

dim COUNTERCLOCKWISE_ROTATED_Y_SHIFT(19)
COUNTERCLOCKWISE_ROTATED_Y_SHIFT(1)  = 1
COUNTERCLOCKWISE_ROTATED_Y_SHIFT(2)  = -1
COUNTERCLOCKWISE_ROTATED_Y_SHIFT(3)  = 0
COUNTERCLOCKWISE_ROTATED_Y_SHIFT(4)  = 0
COUNTERCLOCKWISE_ROTATED_Y_SHIFT(5)  = 0
COUNTERCLOCKWISE_ROTATED_Y_SHIFT(6)  = 1
COUNTERCLOCKWISE_ROTATED_Y_SHIFT(7)  = -1
COUNTERCLOCKWISE_ROTATED_Y_SHIFT(8)  = 0
COUNTERCLOCKWISE_ROTATED_Y_SHIFT(9) = 0
COUNTERCLOCKWISE_ROTATED_Y_SHIFT(10) = 1
COUNTERCLOCKWISE_ROTATED_Y_SHIFT(11)  = -1
COUNTERCLOCKWISE_ROTATED_Y_SHIFT(12) = 0
COUNTERCLOCKWISE_ROTATED_Y_SHIFT(13) = 0
COUNTERCLOCKWISE_ROTATED_Y_SHIFT(14) = 0
COUNTERCLOCKWISE_ROTATED_Y_SHIFT(15) = 0
COUNTERCLOCKWISE_ROTATED_Y_SHIFT(16) = 1
COUNTERCLOCKWISE_ROTATED_Y_SHIFT(17) = -1
COUNTERCLOCKWISE_ROTATED_Y_SHIFT(18) = 0
COUNTERCLOCKWISE_ROTATED_Y_SHIFT(19) = 0

COLUMNS = 10
ROWS = 20

REM measures in pixels
WINDOW_WIDTH = 640 rem PAL TV norm. More or less.
WINDOW_HEIGHT = 512
BLOCK_WIDTH = 25
FIELD_OFFSET_X = 200
FIELD_OFFSET_Y = 5
FIELD_WIDTH = BLOCK_WIDTH * COLUMNS
FIELD_HEIGHT = BLOCK_WIDTH * ROWS

PREVIEW_WINDOW_WIDTH  = BLOCK_WIDTH*6
PREVIEW_WINDOW_HEIGHT = BLOCK_WIDTH*6
PREVIEW_WINDOW_OFFSET_X = FIELD_OFFSET_X+FIELD_WIDTH+BLOCK_WIDTH
PREVIEW_WINDOW_OFFSET_Y = FIELD_OFFSET_Y+PREVIEW_WINDOW_HEIGHT/2+BLOCK_WIDTH*2

LINES_COUNT_WINDOW_WIDTH  = BLOCK_WIDTH*4
LINES_COUNT_WINDOW_HEIGHT = BLOCK_WIDTH
LINES_COUNT_WINDOW_OFFSET_X = 50
LINES_COUNT_WINDOW_OFFSET_Y = PREVIEW_WINDOW_OFFSET_Y

LEVEL_COUNT_WINDOW_WIDTH  = BLOCK_WIDTH*4
LEVEL_COUNT_WINDOW_HEIGHT = BLOCK_WIDTH
LEVEL_COUNT_WINDOW_OFFSET_X = LINES_COUNT_WINDOW_OFFSET_X
LEVEL_COUNT_WINDOW_OFFSET_Y = PREVIEW_WINDOW_OFFSET_Y + 50

POINTS_COUNT_WINDOW_WIDTH  = BLOCK_WIDTH*4
POINTS_COUNT_WINDOW_HEIGHT = BLOCK_WIDTH
POINTS_COUNT_WINDOW_OFFSET_X = LEVEL_COUNT_WINDOW_OFFSET_X
POINTS_COUNT_WINDOW_OFFSET_Y = LEVEL_WINDOW_OFFSET_Y + 50

REM measures in blocks
dim MATRIX(10,20)

REM needs to be adjusted to the actual figure when necessary
START_X = 5
START_Y = 0
PREVIEW_START_X = 3
PREVIEW_START_Y = 0

REM subroutines can return only one single value. so when rotating the brick, the adjustment of root_block_x and root_block_y needs the workaround with global intermediate variables
INTERMEDIATE_BLOCK_X = 0
INTERMEDIATE_BLOCK_y = 0

REM measures in seconds
TIMEQUANT = 0.1

REM various
TIMELOOPS = 15
LINES_TOTAL = 0
LEVEL_TOTAL = 0
POINTS_TOTAL = 0

dim TOPSCORE$(3)
TOPSCORE$(0) = "JOSE   010000 09"
TOPSCORE$(1) = "JUAN   005278 03"
TOPSCORE$(2) = "YOU  000000 00"

sub check_topscore_file()
  local filehandle, i
  
  filehandle = open("topscore.txt", "r")
  if filehandle = 0 then
    filehandle = open("topscore.txt", "w")
    if filehandle = 0  error "Could not open 'topscore.txt' for writing"
    for i=0 to arraysize(TOPSCORE$(), 1)
      print #filehandle TOPSCORE$(i)
    next
    close filehandle
  else
    for i=0 to arraysize(TOPSCORE$(), 1)
      line input #filehandle TOPSCORE$(i)
      print TOPSCORE$(i)
    next
    close filehandle
  fi  
end sub

sub clear_block(block_x, block_y)
  MATRIX(block_x, block_y) = 0
  color 0,0,0
  fill rectangle FIELD_OFFSET_X+block_x*BLOCK_WIDTH, FIELD_OFFSET_Y+block_y*BLOCK_WIDTH to FIELD_OFFSET_X+block_x*BLOCK_WIDTH+BLOCK_WIDTH, FIELD_OFFSET_Y+block_y*BLOCK_WIDTH+BLOCK_WIDTH
end sub

sub draw_block(block_x, block_y, figure_number, preview)
  local inner_color$ REM dark blue or bright blue
  local border_color$ REM dark blue
  local shining_color$ REM white
  local dark_blue$, bright_blue$
  local offset_x, offset_y
  
  shining_color$ = "234,234,234"
  dark_blue$ = "105,105,220"
  bright_blue$ = "155,155,220"
  
  if preview=1 then
    offset_x = PREVIEW_WINDOW_OFFSET_X
    offset_y = PREVIEW_WINDOW_OFFSET_Y+BLOCK_WIDTH
  else
    offset_x = FIELD_OFFSET_X
    offset_y = FIELD_OFFSET_Y
    MATRIX(block_x, block_y) = -1 * figure_number
  fi
  
  switch figure_number
    case 0: return REM empty block
    case 4: case 5: case 6: case 7: case 14: case 15: inner_color$=bright_blue$: border_color$=bright_blue$: break
    case 8: case 9: case 10: case 11: case 12: case 13: inner_color$=dark_blue$: border_color$=dark_blue$: break
    default: inner_color$=shining_color$: border_color$=dark_blue$
  end switch
  color inner_color$
  fill rectangle offset_x+block_x*BLOCK_WIDTH, offset_y+block_y*BLOCK_WIDTH to offset_x+block_x*BLOCK_WIDTH+BLOCK_WIDTH, offset_y+block_y*BLOCK_WIDTH+BLOCK_WIDTH
  color 1,1,1
  REM Black border around the brick, 2px thick
  rectangle offset_x+block_x*BLOCK_WIDTH, offset_y+block_y*BLOCK_WIDTH to offset_x+block_x*BLOCK_WIDTH+BLOCK_WIDTH, offset_y+block_y*BLOCK_WIDTH+BLOCK_WIDTH
  rectangle offset_x+block_x*BLOCK_WIDTH+1, offset_y+block_y*BLOCK_WIDTH+1 to offset_x+block_x*BLOCK_WIDTH+BLOCK_WIDTH-1, offset_y+block_y*BLOCK_WIDTH+BLOCK_WIDTH-1
  REM Colored Border, 2px thick
  color border_color$
  rectangle offset_x+block_x*BLOCK_WIDTH+2, offset_y+block_y*BLOCK_WIDTH+2 to offset_x+block_x*BLOCK_WIDTH+BLOCK_WIDTH-2, offset_y+block_y*BLOCK_WIDTH+BLOCK_WIDTH-2
  rectangle offset_x+block_x*BLOCK_WIDTH+3, offset_y+block_y*BLOCK_WIDTH+3 to offset_x+block_x*BLOCK_WIDTH+BLOCK_WIDTH-3, offset_y+block_y*BLOCK_WIDTH+BLOCK_WIDTH-3
  
  REM White shining in the upper right corner
  color shining_color$
  dot offset_x+block_x*BLOCK_WIDTH, offset_y+block_y*BLOCK_WIDTH
  dot offset_x+block_x*BLOCK_WIDTH+1, offset_y+block_y*BLOCK_WIDTH
  dot offset_x+block_x*BLOCK_WIDTH, offset_y+block_y*BLOCK_WIDTH+1
  dot offset_x+block_x*BLOCK_WIDTH+1, offset_y+block_y*BLOCK_WIDTH+1
  dot offset_x+block_x*BLOCK_WIDTH+4, offset_y+block_y*BLOCK_WIDTH+4
  dot offset_x+block_x*BLOCK_WIDTH+4, offset_y+block_y*BLOCK_WIDTH+5
  dot offset_x+block_x*BLOCK_WIDTH+5, offset_y+block_y*BLOCK_WIDTH+4
  dot offset_x+block_x*BLOCK_WIDTH+6, offset_y+block_y*BLOCK_WIDTH+4
  dot offset_x+block_x*BLOCK_WIDTH+4, offset_y+block_y*BLOCK_WIDTH+6
  dot offset_x+block_x*BLOCK_WIDTH+5, offset_y+block_y*BLOCK_WIDTH+5
end sub

sub clear_figure(block_x, block_y, figure())
  local i
  
  for i = 0 to arraysize(figure(), 1)
    if figure(i) = 0 then
      clear_block(block_x, block_y)
    elsif figure(i) = 1 then
      block_x = block_x + 1
      clear_block(block_x, block_y)
    elsif figure(i) = 2 then
      block_x = block_x - 1
      clear_block(block_x, block_y)
    elsif figure(i) = 3 then
      block_y = block_y - 1
      clear_block(block_x, block_y)
    fi
  next
end sub

sub draw_figure(block_x, block_y, figure(), figure_number)
  local i
  
  for i = 0 to arraysize(figure(), 1)
    if figure(i) = 0 then
      draw_block(block_x, block_y, figure_number)
    elsif figure(i) = 1 then
      block_x = block_x + 1
      draw_block(block_x, block_y, figure_number)
    elsif figure(i) = 2 then
      block_x = block_x - 1
      draw_block(block_x, block_y, figure_number)
    elsif figure(i) = 3 then
      block_y = block_y - 1
      draw_block(block_x, block_y, figure_number)
    fi
  next
end sub

sub display_preview_figure(next_figure_number)
  local next_figure_root_block_x
  local next_figure_root_block_y
  local next_figure(4)
  
  choose_figure(next_figure(), next_figure_number)
  
  next_figure_root_block_x = set_root_block_x(PREVIEW_START_X, next_figure_number)
  next_figure_root_block_y = set_root_block_y(PREVIEW_START_Y, next_figure_number)

  REM clear the preview window
  color 11,11,51
  fill rectangle PREVIEW_WINDOW_OFFSET_X, PREVIEW_WINDOW_OFFSET_Y to PREVIEW_WINDOW_OFFSET_X+PREVIEW_WINDOW_WIDTH, PREVIEW_WINDOW_OFFSET_Y+PREVIEW_WINDOW_HEIGHT
  
  REM draw the next figure
  color 150,150,150
  draw_preview_figure(next_figure_root_block_x, next_figure_root_block_y, next_figure(), next_figure_number)
end sub

sub draw_preview_figure(block_x, block_y, preview_figure(), next_figure_number)
  local i, preview
  
  preview = 1
  for i = 0 to arraysize(preview_figure(), 1)
    if preview_figure(i) = 0 then
      draw_block(block_x, block_y, next_figure_number, preview)
    elsif preview_figure(i) = 1 then
      block_x = block_x + 1
      draw_block(block_x, block_y, next_figure_number, preview)
    elsif preview_figure(i) = 2 then
      block_x = block_x - 1
      draw_block(block_x, block_y, next_figure_number, preview)
    elsif preview_figure(i) = 3 then
      block_y = block_y - 1
      draw_block(block_x, block_y, next_figure_number, preview)
    fi
  next  
end sub


sub choose_figure(figure(), figure_number)
  if figure_number = 1 then      REM horizontal stick
    figure(0) = 0
    figure(1) = 1
    figure(2) = 1
    figure(3) = 1
    figure(4) = 0
    return 1
  elsif figure_number = 2 then     REM vertical stick
    figure(0) = 0
    figure(1) = 3
    figure(2) = 3
    figure(3) = 3
    figure(4) = 0
    return 1
  elsif figure_number = 3 then     REM square block
    figure(0) = 0
    figure(1) = 1
    figure(2) = 3
    figure(3) = 2
    figure(4) = 0
    return 1
  elsif figure_number = 4 then     REM bottom-left nose down horizontal L
    figure(0) = 0
    figure(1) = 3
    figure(2) = 1
    figure(3) = 1
    figure(4) = 0
    return 1
  elsif figure_number = 5 then     REM bottom-right nose top left vertical L
    figure(0) = 0
    figure(1) = 3
    figure(2) = 3
    figure(3) = 2
    figure(4) = 0
    return 1
  elsif figure_number = 6 then     REM bottom-left nose up horizontal L
    figure(0) = 0
    figure(1) = 1
    figure(2) = 1
    figure(3) = 3
    figure(4) = 0
    return 1
  elsif figure_number = 7 then     REM nose bottom right vertical L
    figure(0) = 0
    figure(1) = 2
    figure(2) = 3
    figure(3) = 3
    figure(4) = 0
    return 1
  elsif figure_number = 8 then     REM bottom-right nose down horizontal L
    figure(0) = 0
    figure(1) = 3
    figure(2) = 2
    figure(3) = 2
    figure(4) = 0
    return 1
  elsif figure_number = 9 then     REM nose bottom left vertical L
    figure(0) = 0
    figure(1) = 1
    figure(2) = 3
    figure(3) = 3
    figure(4) = 0
    return 1
  elsif figure_number = 10 then     REM bottom-right nose up left horizontal L
    figure(0) = 0
    figure(1) = 2
    figure(2) = 2
    figure(3) = 3
    figure(4) = 0
    return 1
  elsif figure_number = 11 then     REM bottom-left nose top right vertical L
    figure(0) = 0
    figure(1) = 3
    figure(2) = 3
    figure(3) = 1
    figure(4) = 0
    return 1
  elsif figure_number = 12 then     REM left bottom horizontal S-block
    figure(0) = 0
    figure(1) = 1
    figure(2) = 3
    figure(3) = 1
    figure(4) = 0
    return 1
  elsif figure_number = 13 then    REM right bottom vertical S-block
    figure(0) = 0
    figure(1) = 3
    figure(2) = 2
    figure(3) = 3
    figure(4) = 0
    return 1
  elsif figure_number = 14 then     REM right bottom horizontal S-block
    figure(0) = 0
    figure(1) = 2
    figure(2) = 3
    figure(3) = 2
    figure(4) = 0
    return 1
  elsif figure_number = 15 then     REM left bottom vertical S-block
    figure(0) = 0
    figure(1) = 3
    figure(2) = 1
    figure(3) = 3
    figure(4) = 0
    return 1
  elsif figure_number = 16 then    REM nose top horizontal T-block
    figure(0) = 0
    figure(1) = 1
    figure(2) = 1
    figure(3) = 2
    figure(4) = 3
    return 1
  elsif figure_number = 17 then    REM nose right vertical T-block
    figure(0) = 0
    figure(1) = 3
    figure(2) = 1
    figure(3) = 2
    figure(4) = 3
    return 1
  elsif figure_number = 18 then    REM nose down horizontal T-block
    figure(0) = 0
    figure(1) = 3
    figure(2) = 2
    figure(3) = 1
    figure(4) = 1
    return 1
  elsif figure_number = 19 then    REM nose left vertical T-block
    figure(0) = 0
    figure(1) = 3
    figure(2) = 2
    figure(3) = 1
    figure(4) = 3
    return 1
  fi
end sub


sub set_root_block_x(root_block_x, figure_number)
  switch figure_number
    case  1: return root_block_x-2 REM horizontal stick
    case  3: return root_block_x-1 REM square block
    case  4: return root_block_x-1 REM bottom-left horizontal L
    case  5: return root_block_x+1 REM L
    case  6: return root_block_x-1 REM L
    case  7: return root_block_x+1 REM L
    case  8: return root_block_x+1 REM right bottom horizontal S-block
    case  9: return root_block_x-1 REM L
    case 10: return root_block_x+1 REM L
    case 11: return root_block_x-1 REM L
    
    case 12: return root_block_x-1 REM left bottom horizontal S-block
    case 13: return root_block_x+1 REM right bottom vertical S-block
    case 14: return root_block_x   REM right bottom horizontal S-block
    case 15: return root_block_x   REM left bottom vertical S-block
    
    case 16: return root_block_x-1 REM nose top horizontal T-block
    case 18: return root_block_x-1 REM nose down horizontal T-block
    default: return root_block_x
  end switch
end sub


sub set_root_block_y(root_block_y, figure_number)
  switch figure_number
    case  1: return root_block_y   REM horizontal stick
    case  2: return root_block_y+3 REM vertical stick
    
    case  5: return root_block_y+2 REM vertical L
    case  7: return root_block_y+2 REM vertical L
    case  9: return root_block_y+2 REM vertical L
    case 11: return root_block_y+2 REM vertical L
    
    case 13: return root_block_y+2 REM vertical S-block
    case 15: return root_block_y+2 REM vertical S-block
    
    case 17: return root_block_y+2 REM nose left vertical T-block
    case 19: return root_block_y+2 REM nose right vertical T-block
    default: return root_block_y+1
  end switch
end sub


sub pause_game()
  local keystroke$

  keystroke$ = inkey$()
  if keystroke$ = "p"  return 1
end sub


sub game_over()
  local filehandle, i
  
  color 0,0,0
  fill rectangle 0,0 to WINDOW_WIDTH, WINDOW_HEIGHT
  color 150,150,150
  text int(WINDOW_WIDTH/2)-25, int(WINDOW_HEIGHT/2), "Game Over"
  inkey$
  
  check_topscore_file()
  
  local current_character_input$
  local total_user_input$
  
  for i = 0 to arraysize(TOPSCORE$(), 1)-1
    topscore_line_substring = val(mid$(TOPSCORE$(i), 8, 6))
    if POINTS_TOTAL >= topscore_line_substring then
      color 0,0,0
      fill rectangle int(WINDOW_WIDTH/2)-10,int(WINDOW_HEIGHT/2)+BLOCK_WIDTH*3 to WINDOW_WIDTH, WINDOW_HEIGHT
      color 150,150,150
      
      REM the better topscores
      for k=0 to i-1
        text int(WINDOW_WIDTH/2)-10, int(WINDOW_HEIGHT/2)+BLOCK_WIDTH*(4+k), TOPSCORE$(k)
      next
      
      REM the worse topscores
      for j = 2 to k+1 step -1
        text int(WINDOW_WIDTH/2)-10, int(WINDOW_HEIGHT/2)+BLOCK_WIDTH*(4+j), TOPSCORE$(j-1)
        TOPSCORE$(j) = TOPSCORE$(j-1)
      next
      
      REM the player's topscore
      points_local_string$ = "000000"
      if POINTS_TOTAL < 10 then
        right$(points_local_string$, 1) = str$(POINTS_TOTAL)
      elsif POINTS_TOTAL < 100 then
        right$(points_local_string$, 2) = str$(POINTS_TOTAL)
      elsif POINTS_TOTAL < 1000 then
        right$(points_local_string$, 3) = str$(POINTS_TOTAL)
      elsif POINTS_TOTAL < 10000 then
        right$(points_local_string$, 4) = str$(POINTS_TOTAL)
      elsif POINTS_TOTAL < 100000 then
        right$(points_local_string$, 5) = str$(POINTS_TOTAL)
      elsif POINTS_TOTAL < 1000000 then
        points_local_string$ = str$(POINTS_TOTAL)
      fi
      
      level_local_string$ = "00"
      if LEVEL_TOTAL < 10 then
        right$(level_local_string$, 1) = str$(LEVEL_TOTAL-1)
      else
        level_local_string$ = str$(LEVEL_TOTAL-1)
      fi
        
      text int(WINDOW_WIDTH/2)-60, int(WINDOW_HEIGHT/2)+BLOCK_WIDTH, "You are a tetris master."
      text int(WINDOW_WIDTH/2)-60, int(WINDOW_HEIGHT/2)+BLOCK_WIDTH*2, "Please enter your name."
      
      repeat
        current_character_input$=inkey$(0.5)
        
        total_user_input$ = check_character_input$(current_character_input$, total_user_input$)
        
        cursor$=blink_cursor$()
        
        color 0,0,0
        fill rectangle int(WINDOW_WIDTH/2)-10,int(WINDOW_HEIGHT/2)+BLOCK_WIDTH*(3+k) to WINDOW_WIDTH,int(WINDOW_HEIGHT/2)+BLOCK_WIDTH*(4+k)
        color 150,150,150
        
        text int(WINDOW_WIDTH/2)-10, int(WINDOW_HEIGHT/2)+BLOCK_WIDTH*(4+k), total_user_input$+cursor$
        text int(WINDOW_WIDTH/2)+30, int(WINDOW_HEIGHT/2)+BLOCK_WIDTH*(4+k), points_local_string$+" "+level_local_string$

        cursor_blinker=cursor_blinker+1        
      until(current_character_input$="enter")
      total_user_input$ = left$(total_user_input$, len(total_user_input$)-5)
      
      color 0,0,0
      fill rectangle int(WINDOW_WIDTH/2)-10,int(WINDOW_HEIGHT/2)+BLOCK_WIDTH*(3+k) to WINDOW_WIDTH,int(WINDOW_HEIGHT/2)+BLOCK_WIDTH*(4+k)
      color 150,150,150
      text int(WINDOW_WIDTH/2)+30, int(WINDOW_HEIGHT/2)+BLOCK_WIDTH*(4+k), points_local_string$
      text int(WINDOW_WIDTH/2)+75, int(WINDOW_HEIGHT/2)+BLOCK_WIDTH*(4+k), level_local_string$
      text int(WINDOW_WIDTH/2)-10, int(WINDOW_HEIGHT/2)+BLOCK_WIDTH*(4+k), total_user_input$

      left$(TOPSCORE$(i), 6) = "    "
      left$(TOPSCORE$(i), len(total_user_input$)) = total_user_input$
      mid$(TOPSCORE$(i), 8, 6) = points_local_string$
      right$(TOPSCORE$(i), 2) = level_local_string$
      break
    fi
  next
  filehandle = open("topscore.txt", "w")
  if filehandle=0 then
    error "Could not open 'topscore.txt' for writing"
    exit
  fi
  for i = 0 to arraysize(TOPSCORE$(), 1)
    print #filehandle TOPSCORE$(i)
    print TOPSCORE$(i)
  next
  close filehandle
  
  inkey$
  exit
end sub

sub blink_cursor$()
  static i
  
  i = i+1   
  if mod(i, 2) = 0 then
    i = 0
    return "_"
  fi
end sub


sub is_bad_input(current_character_input$)
  if len(current_character_input$)>10 or current_character_input$="left" or current_character_input$="right" or current_character_input$="up" or current_character_input$="down" or current_character_input$="tab" or current_character_input$="scrnup" or current_character_input$="scrndown" or current_character_input$="end" or current_character_input$="home" or current_character_input$="del" or current_character_input$="ins" or current_character_input$="f0" or current_character_input$="f1" or current_character_input$="f2" or current_character_input$="f3" or current_character_input$="f4" or current_character_input$="f5" or current_character_input$="f6" or current_character_input$="f7" or current_character_input$="f8" or current_character_input$="f9" or current_character_input$="f10" or current_character_input$="f11" or current_character_input$="f12" then
    return 1
  else
    return 0
  fi  
end sub

sub check_character_input$(current_character_input$, total_user_input$)
  if current_character_input$="backspace" then
    total_user_input$=left$(total_user_input$,len(total_user_input$)-1)
    current_character_input$=""
  elsif is_bad_input(current_character_input$) then
    current_character_input$=""
  elsif current_character_input$="esc" then
    exit
  fi
  if len(total_user_input$) < 6 then
    total_user_input$=total_user_input$+current_character_input$
  fi
  return total_user_input$
end sub

sub is_move_ok(figure(), block_x, block_y)
  local i
  
  for i = 0 to arraysize(figure(), 1)
    if figure(i) = 1 then
      block_x = block_x + 1
    elsif figure(i) = 2 then
      block_x = block_x - 1
    elsif figure(i) = 3 then
      block_y = block_y - 1
    fi
    if block_x <  0: return 0
    if block_x >  9: return 0
    if block_y <  0: return 0
    if block_y > 19: return 0
    if MATRIX(block_x, block_y) > 0: return 0
  next
  return 1
end sub

sub rotate(figure(), figure_number, figure_number_rotated, x_shift, y_shift)
  choose_figure(rotated_figure(), figure_number_rotated)
  if is_move_ok(rotated_figure(), INTERMEDIATE_BLOCK_X+x_shift, INTERMEDIATE_BLOCK_Y+y_shift) then
    clear_figure(INTERMEDIATE_BLOCK_X, INTERMEDIATE_BLOCK_Y, figure())

    INTERMEDIATE_BLOCK_X = INTERMEDIATE_BLOCK_X+x_shift
    INTERMEDIATE_BLOCK_Y = INTERMEDIATE_BLOCK_Y+y_shift
    choose_figure(figure(), figure_number_rotated)

    draw_figure(INTERMEDIATE_BLOCK_X, INTERMEDIATE_BLOCK_Y, figure(), figure_number_rotated)
    
    return figure_number_rotated
  fi
  return figure_number
end sub

sub calculate_figure_number()
  local figure_number
  
  random_number = int(ran(6))+1 REM 0 means empty
  switch random_number
REM stick
    case 1: figure_number = 1:break
REM square block
    case 2: figure_number = 3:break
REM L block
    case 3: figure_number = 4:break
REM J block
    case 4: figure_number = 8:break
REM S block
    case 5: figure_number = 12:break
REM Z block
    case 6: figure_number = 14:break
  end switch
  return figure_number
end sub

sub turn_is_over(block_x, block_y, figure())
REM This subroutine is divided into four parts
REM Part 1: Fixate the current brick
REM Part 2: Check if some lines are complete; exit the routine if none
REM Part 3: Remove the complete lines
REM Part 4: Drop the lines above

REM Before any parts, define the local variables for this subroutine
  local i
  local complete_lines(4) REM array to store the y-coordinates of complete lines
  local complete_lines_in_figure(4) REM array to store the y-coordinates of complete lines
  local block_y_to_check REM iterator variable
  local block_x_to_check REM iterator variable
  local block_y_original REM needed for checking the lines
  local lines_dropped REM counter variable for gaining the level and the speed
  local y_iterator
  local figure_number_above
  local lines_in_figure
  local lowest_complete_line
  local complete_lines_in_figure_cat$
  local points_base REM base points number will be multiplied with level etc
  
  block_y_original = block_y
  complete_lines_in_figure_cat$ = "0000"
  
REM First part:
REM Fixate the current brick
  for i = 0 to arraysize(figure(), 1)
    if figure(i) = 1 then
      block_x = block_x + 1
    elsif figure(i) = 2 then
      block_x = block_x - 1
    elsif figure(i) = 3 then
      block_y = block_y - 1
    fi
    MATRIX(block_x, block_y) = abs(MATRIX(block_x, block_y))
  next
REM Second part:
REM Check if some lines are compelete and if so remove them in the next step;
REM exit the routine otherwise
  i = 0
  for block_y_to_check = 0 to 3 REM the rows in the figure
    for block_x_to_check = 0 to 9 REM the columns in the field
      if block_y_original-block_y_to_check < 0 then
        game_over()
      elsif MATRIX(block_x_to_check, block_y_original-block_y_to_check) = 0 then
        goto CHECK_LINES_NEXT
      fi
    next
    complete_lines(i) = block_y_original-block_y_to_check
    complete_lines_in_figure(i) = 1
    lines_dropped = lines_dropped + 1

    label CHECK_LINES_NEXT
    
    i=i+1
  next
  
REM Add some points as reward for successful move
  points_base = block_y
  POINTS_TOTAL = POINTS_TOTAL + points_base * LEVEL_TOTAL
  display_points()
  
REM If no lines were completed, exit the subroutine
  if lines_dropped = 0  return
  
REM Part 3: Remove the complete lines
REM Remove the lines
REM remove in the current line all blocks, beginning with
REM blocks 4 and 5, then wait 0.1 sec, then blocks 3 and 6, etc.
  for block_x_to_change=0 to 4
    for i=0 to 3
      REM if in the line no empty blocks are encountered
      if complete_lines_in_figure(i)=1 then
        clear_block(5+block_x_to_change, complete_lines(i))
        clear_block(4-block_x_to_change, complete_lines(i))
      fi
    next
    wait 0.1
  next  
  
REM Part 4: Drop the lines above
REM     Therefore first the array with the lines in figure needs to be
REM     adjusted, so the dropping routine does not need to look ahead
REM     but simple drops the line according to the array
  
REM adjust the number of lines to look ahead when dropping
  mid$(complete_lines_in_figure_cat$,1,1) = str$(complete_lines_in_figure(0))
  mid$(complete_lines_in_figure_cat$,2,1) = str$(complete_lines_in_figure(1))
  mid$(complete_lines_in_figure_cat$,3,1) = str$(complete_lines_in_figure(2))
  mid$(complete_lines_in_figure_cat$,4,1) = str$(complete_lines_in_figure(3))
  
#  print complete_lines_in_figure_cat$
  switch complete_lines_in_figure_cat$
    case "1000": complete_lines_in_figure_cat$ = "1111": break
    case "0100": complete_lines_in_figure_cat$ = "0111": break
    case "0010": complete_lines_in_figure_cat$ = "0011": break
    case "0001": complete_lines_in_figure_cat$ = "0001": break
    case "1100": complete_lines_in_figure_cat$ = "2222": break
    case "0110": complete_lines_in_figure_cat$ = "0222": break
    case "0011": complete_lines_in_figure_cat$ = "0022": break
    case "1010": complete_lines_in_figure_cat$ = "1222": break
    case "0101": complete_lines_in_figure_cat$ = "0122": break
    case "1001": complete_lines_in_figure_cat$ = "1122": break
    case "0111": complete_lines_in_figure_cat$ = "0333": break
    case "1011": complete_lines_in_figure_cat$ = "1333": break
    case "1101": complete_lines_in_figure_cat$ = "2333": break
    case "1110": complete_lines_in_figure_cat$ = "3333": break
    case "1111": complete_lines_in_figure_cat$ = "4444": break
  end switch
  
  complete_lines_in_figure(0) = val(mid$(complete_lines_in_figure_cat$,1,1))
  complete_lines_in_figure(1) = val(mid$(complete_lines_in_figure_cat$,2,1))
  complete_lines_in_figure(2) = val(mid$(complete_lines_in_figure_cat$,3,1))
  complete_lines_in_figure(3) = val(mid$(complete_lines_in_figure_cat$,4,1))
  
#  print complete_lines_in_figure_cat$
#  inkey$
     
REM Determine the lowest complete lines, i.e. where to start to drop
  for i = 0 to 3
    if complete_lines(i) <> 0 then
      lowest_complete_line = complete_lines(i)
      lowest_complete_line_index = i
      break
    fi
  next
  
REM Begin to actually drop the lines above the complete ones
  lines_in_figure = lowest_complete_line_index
  for y_iterator = lowest_complete_line to 1 step -1  
      for block_x_to_change = 0 to 9
        clear_block(block_x_to_change, y_iterator)
        if y_iterator-lines_in_figure > 0 then
          figure_number_above = abs(MATRIX(block_x_to_change, y_iterator-complete_lines_in_figure(lines_in_figure)))
          draw_block(block_x_to_change, y_iterator, figure_number_above)
        
REM because draw_block() makes only negative entries into MATRIX
          MATRIX(block_x_to_change, y_iterator) = MATRIX(block_x_to_change, y_iterator) * -1
        fi
      next
      if lines_in_figure < 3 then
        lines_in_figure = lines_in_figure + 1
      fi
  next
  count_lines(lines_dropped) REM and levels and points
end sub

sub count_lines(lines_dropped)
REM and print them out
  LINES_TOTAL = LINES_TOTAL + lines_dropped
REM clear rectangle for text and print LINES_TOTAL
  color 0,0,0
  fill rectangle LINES_COUNT_WINDOW_OFFSET_X,LINES_COUNT_WINDOW_OFFSET_Y to LINES_COUNT_WINDOW_OFFSET_X+LINES_COUNT_WINDOW_WIDTH, LINES_COUNT_WINDOW_OFFSET_Y+LINES_COUNT_WINDOW_HEIGHT
REM print text
  color 255,255,255
  text LINES_COUNT_WINDOW_OFFSET_X+10,LINES_COUNT_WINDOW_OFFSET_Y+20,"Lines: "+str$(LINES_TOTAL)
REM gain speed if another 10 lines are full
REM or the game just begun
  if LINES_TOTAL - LEVEL_TOTAL * 10 >= 0 then
    color 0,0,0
    fill rectangle LEVEL_COUNT_WINDOW_OFFSET_X,LEVEL_COUNT_WINDOW_OFFSET_Y to LEVEL_COUNT_WINDOW_OFFSET_X+LEVEL_COUNT_WINDOW_WIDTH, LEVEL_COUNT_WINDOW_OFFSET_Y+LEVEL_COUNT_WINDOW_HEIGHT
REM print text LEVEL_TOTAL
    if TIMELOOPS > 0  TIMELOOPS = TIMELOOPS - 1
    LEVEL_TOTAL = LEVEL_TOTAL + 1
    color 255,255,255
    text LEVEL_COUNT_WINDOW_OFFSET_X+10,LEVEL_COUNT_WINDOW_OFFSET_Y+20,"LEVEL: "+str$(LEVEL_TOTAL-1)
  fi
  
REM print text POINTS_TOTAL
REM
REM 1 line = 40 points
REM 2 lines = 100 points 
REM 3 lines = 300 points 
REM 4 lines = 1200
REM 1 line at level 2 = 80 points
  switch lines_dropped
    case 1: points_base =   40: break
    case 2: points_base =  100: break
    case 3: points_base =  300: break
    case 4: points_base = 1200: break
  end switch
  POINTS_TOTAL = POINTS_TOTAL + points_base * LEVEL_TOTAL
  display_points()
end sub

sub display_points()
REM clear window area for POINTS_TOTAL
  color 0,0,0
  fill rectangle POINTS_COUNT_WINDOW_OFFSET_X,POINTS_COUNT_WINDOW_OFFSET_Y to POINTS_COUNT_WINDOW_OFFSET_X+POINTS_COUNT_WINDOW_WIDTH, POINTS_COUNT_WINDOW_OFFSET_Y+POINTS_COUNT_WINDOW_HEIGHT
  
  color 255,255,255
  text POINTS_COUNT_WINDOW_OFFSET_X+10,POINTS_COUNT_WINDOW_OFFSET_Y+20,"POINTS: "+str$(POINTS_TOTAL)  
end sub

sub main()
REM Testvariables
  local y, x

  clear screen REM reading keystrokes with inkey$() needs 'clear screen'
  open window WINDOW_WIDTH, WINDOW_HEIGHT
  backcolor 0,0,0
  REM backcolor does not work, that is why big black rectangle
  color 0,0,0
  fill rectangle 0,0 to WINDOW_WIDTH, WINDOW_HEIGHT
  
  REM draw field border
  color 150,150,150
  rectangle FIELD_OFFSET_X-1, FIELD_OFFSET_Y-1 to FIELD_OFFSET_X+FIELD_WIDTH+1, FIELD_OFFSET_Y+FIELD_HEIGHT+1
  REM draw next figure window
  rectangle PREVIEW_WINDOW_OFFSET_X-1, PREVIEW_WINDOW_OFFSET_Y-1 to PREVIEW_WINDOW_OFFSET_X+PREVIEW_WINDOW_WIDTH+1, PREVIEW_WINDOW_OFFSET_Y+PREVIEW_WINDOW_HEIGHT+1
  
  REM draw total lines counter
  count_lines(LINES_TOTAL)
  
  local figure_number, next_figure_number
  local figure(4)
  
  next_figure_number = calculate_figure_number()
  
  local i
REM   "while not game over"-LOOP
  while(1=1)
    
    figure_number = next_figure_number
    next_figure_number = calculate_figure_number()
    
    display_preview_figure(next_figure_number)
    
REM arrays are passed by reference to subroutines; no need to return the array
    choose_figure(figure(), figure_number)
    
    
    root_block_x = set_root_block_x(START_X, figure_number)
    root_block_y = set_root_block_y(START_Y, figure_number)
    
    if !is_move_ok(figure(), root_block_x, root_block_y) then
      draw_figure(root_block_x, root_block_y, figure(), figure_number)
      wait TIMEQUANT*10
      game_over()
    fi
    
    if root_block_y > 0: clear_figure(root_block_x, root_block_y, figure())
    root_block_y = root_block_y + 1
    draw_figure(root_block_x, root_block_y, figure(), figure_number)
        
REM     "while figure is falling down and has not landed yet"-LOOP
    while(1=1)
      for i = 1 to TIMELOOPS
        keystroke$ = inkey$(TIMEQUANT)
        if !keystroke$="" then
          if keystroke$ = "right" then
            if is_move_ok(figure(), root_block_x+1, root_block_y) then
              clear_figure(root_block_x, root_block_y, figure())
              root_block_x = root_block_x + 1
              draw_figure(root_block_x, root_block_y, figure(), figure_number)
            fi
          elsif keystroke$ = "left" then
            if is_move_ok(figure(), root_block_x-1, root_block_y) then
              clear_figure(root_block_x, root_block_y, figure())
              root_block_x = root_block_x - 1
              draw_figure(root_block_x, root_block_y, figure(), figure_number)
            fi
          elsif keystroke$ = "down" then
            if is_move_ok(figure(), root_block_x, root_block_y+1) then
              clear_figure(root_block_x, root_block_y, figure())
              root_block_y = root_block_y + 1
              draw_figure(root_block_x, root_block_y, figure(), figure_number)
            fi
          elsif keystroke$ = "up" or keystroke$ = "s" then
            INTERMEDIATE_BLOCK_X = root_block_x
            INTERMEDIATE_BLOCK_Y = root_block_y
            figure_number = rotate(figure(), figure_number, CLOCKWISE_ROTATED_FIGURE_NUMBER(figure_number), CLOCKWISE_ROTATED_X_SHIFT(figure_number), CLOCKWISE_ROTATED_Y_SHIFT(figure_number))
            root_block_x = INTERMEDIATE_BLOCK_X
            root_block_y = INTERMEDIATE_BLOCK_Y
          elsif keystroke$ = "d" then
            INTERMEDIATE_BLOCK_X = root_block_x
            INTERMEDIATE_BLOCK_Y = root_block_y
            figure_number = rotate(figure(), figure_number, COUNTERCLOCKWISE_ROTATED_FIGURE_NUMBER(figure_number), COUNTERCLOCKWISE_ROTATED_X_SHIFT(figure_number), COUNTERCLOCKWISE_ROTATED_Y_SHIFT(figure_number))
            root_block_x = INTERMEDIATE_BLOCK_X
            root_block_y = INTERMEDIATE_BLOCK_Y
          elsif keystroke$ = "p" then
            pause_game()
          elsif keystroke$ = "q" or keystroke$ = "esc" then
            exit
          fi
        fi
      next
      if root_block_y < 19 and is_move_ok(figure(), root_block_x, root_block_y+1) then
        clear_figure(root_block_x, root_block_y, figure())
        root_block_y = root_block_y + 1
        draw_figure(root_block_x, root_block_y, figure(), figure_number)
      else
        turn_is_over(root_block_x, root_block_y, figure())
        break
      fi
    wend
    sleep 0.5 REM sleep half a second before new brick appears
  wend
  print "not allowed to get to here!"
  sleep 1
  game_over()
end sub

main()

REM ######################