10 REM             SCRAMBLE
20 REM          By Paul Robson
30 REM (c) Computing with the Amstrad
40 REM ------------- CPC -------------
50 DEFINT a-z:GOSUB 2700
60 best(1)=999:best(2)=999
70 GOSUB 1910
80 GOSUB 2640
90 p=1:a=3
100 FOR g=4 TO 20 STEP 4
110 FOR f=6 TO 14 STEP 2
120 LOCATE f,g:PEN 7:PRINT a$(g-a)
130 NEXT:a=a+3:NEXT
140 IF go=0 THEN GOSUB 1070
150 LOCATE 7,25:PEN 1:PRINT"LEVEL";lev
160 GOSUB 2450
170 REM ** PRINT SYMBOLS **
180 FOR g=4 TO 20 STEP 4
190 FOR f=6 TO 14 STEP 2
200 LOCATE f,g:PAPER 0:PEN p
210 PRINT a$(p)
220 LOCATE 17,g:PRINT b$
230 NEXT
240 p=p+1
250 NEXT
260 GOSUB 1610
270 WINDOW#1,3,3,4,21:WINDOW#2,17,17,4,21:PRINT#1,q$
280 c=6:d=4:mov=0:tot(1)=0:tot(2)=0
290 REM ** MAIN LOOP **
300 GOSUB 370
310 IF INKEY(fi)=-1 THEN sc=0 ELSE sc=1:GOSUB 700:CALL &4000:IF PEEK(&3FFF)=24 AND x(sp,sp2)=0 THEN 450
320 IF NOT INKEY(67) THEN 1030
330 LOCATE c,1:PEN 6:PRINT CHR$(149)
340 LOCATE 4,d:PRINT CHR$(136)
350 CALL &BB18
360 GOTO 300
370 REM ** MOVE CURSORS **
380 IF NOT INKEY(up) AND sc=0 THEN LOCATE 4,d:PRINT" ":d=d-4
390 IF NOT INKEY(do) AND sc=0 THEN LOCATE 4,d:PRINT" ":d=d+4
400 IF NOT INKEY(le) AND sc=0 THEN LOCATE c,1:PRINT" ":c=c-2
410 IF NOT INKEY(ri) AND sc=0 THEN LOCATE c,1:PRINT" ":c=c+2
420 IF c=16 THEN c=6 ELSE IF c=4 THEN c=14
430 IF d=24 THEN d=4 ELSE IF d=0 THEN d=20
440 RETURN
450 REM ** WIN **
460 GOSUB 1020
470 LOCATE 3,23:PEN 0:PRINT a$(0)
480 LOCATE (sp+2)*2,sp2*4:PEN sp:PRINT sp$
490 FOR f=40 TO 20 STEP -1:SOUND 7,f,10,7:NEXT:SOUND 7,15,50,7
500 w$="W E L L  D O N E !"
510 LOCATE#1,1,18:LOCATE#2,1,18
520 PRINT#1,w$;:PRINT#2,w$;
530 mov$=STR$(mov)
540 m$="IN "+MID$(mov$,2,LEN(mov$))+" MOVES"
550 FOR f=1 TO 10:LOCATE 5,25:PEN 6
560 PRINT CHR$(143):FOR g=1 TO 50:NEXT
570 LOCATE 5,25:PRINT" "
580 FOR g=1 TO 50:NEXT:NEXT
590 FOR f=1 TO LEN(m$)
600 LOCATE f+4,25:PRINT CHR$(143)
610 SOUND 7,100,3,7
620 FOR g=1 TO 30:NEXT
630 LOCATE f+4,25:PRINT MID$(m$,f,1)
640 NEXT
650 tot(lev)=tot(lev)+mov
660 IF tot(lev)<best(lev) THEN best(lev)=tot(lev)
670 GOSUB 2840
680 go=1:GOSUB 2800
690 CLS#1:CLS#2:GOTO 90
700 REM ** FIRE PRESSED **
710 IF INKEY(up)<>0 THEN 760
720 IF lev=2 THEN t=1:GOSUB 980:IF ok THEN 740 ELSE RETURN
730 GOSUB 920:IF ok=0 THEN RETURN
740 GOSUB 1220:GOSUB 1440
750 mov=mov+1:RETURN
760 IF INKEY(do)<>0 THEN 810
770 IF lev=2 THEN t=5:GOSUB 980:IF ok THEN 790 ELSE RETURN
780 GOSUB 920:IF ok=0 THEN RETURN
790 GOSUB 1150:GOSUB 1440
800 mov=mov+1:RETURN
810 IF INKEY(le)<>0 THEN 860
820 IF lev=2 THEN t=1:GOSUB 1000:IF ok THEN 840:ELSE RETURN
830 GOSUB 950:IF ok=0 THEN RETURN
840 GOSUB 1360:GOSUB 1530
850 mov=mov+1:RETURN
860 IF INKEY(ri)<>0 THEN RETURN
870 IF lev=2 THEN t=5:GOSUB 1000:IF ok THEN 900 ELSE RETURN
880 GOSUB 950
890 IF ok=0 THEN RETURN
900 GOSUB 1290:GOSUB 1530
910 mov=mov+1:RETURN
920 a=c/2-2:ok=0
930 FOR p=1 TO 5:IF x(a,p)=0 OR a=1 OR a=5 THEN ok=1
940 NEXT:RETURN
950 a=d/4:ok=0
960 FOR p=1 TO 5:IF x(p,a)=0 OR a=1 OR a=5 THEN ok=1
970 NEXT:RETURN
980 ok=0:a=c/2-2
990 IF a=1 OR a=5 OR x(a,t)=0 THEN ok=1:RETURN ELSE RETURN
1000 a=d/4:ok=0
1010 IF a=1 OR a=5 OR x(t,a)=0 THEN ok=1:RETURN ELSE RETURN
1020 LOCATE c,1:PRINT" ":LOCATE 4,d:PRINT" ":RETURN
1030 REM ** QUIT **
1040 go=1:GOSUB 1020
1050 SOUND 7,2000,30,7:SOUND 7,3000,50,7
1060 GOSUB 2800:GOTO 90
1070 REM ** KEY WAIT **
1080 LOCATE 3,23:PEN 0:PRINT a$(0)
1090 LOCATE 7,25:PEN 6:PRINT"ANY KEY";
1100 WHILE INKEY$<>"":WEND:CALL &BB18
1110 LOCATE 1,1:PRINT SPACE$(20);
1120 LOCATE 5,25:PRINT SPC(12)
1130 RETURN
1140 REM ** SCROLL DOWN **
1150 s=x(a,5)
1160 FOR f=5 TO 2 STEP -1
1170 x(a,f)=x(a,f-1)
1180 NEXT
1190 x(a,1)=s
1200 RETURN
1210 REM ** SCROLL UP **
1220 s=x(a,1)
1230 FOR f=1 TO 4
1240 x(a,f)=x(a,f+1)
1250 NEXT
1260 x(a,5)=s
1270 RETURN
1280 REM ** SCROLL RIGHT **
1290 s=x(5,a)
1300 FOR f=5 TO 2 STEP -1
1310 x(f,a)=x(f-1,a)
1320 NEXT
1330 x(1,a)=s
1340 RETURN
1350 REM ** SCROLL LEFT **
1360 s=x(1,a)
1370 FOR f=1 TO 4
1380 x(f,a)=x(f+1,a)
1390 NEXT
1400 x(5,a)=s
1410 RETURN
1420 NEXT:NEXT:RETURN
1430 REM ** PRINT UP/DOWN **
1440 g=1
1450 FOR f=4 TO 20 STEP 4
1460 LOCATE a*2+4,f:PEN x(a,g)
1470 PRINT a$(x(a,g))
1480 SOUND 7,a*15,3,7
1490 g=g+1
1500 NEXT
1510 RETURN
1520 REM ** PRINT LEFT/RIGHT **
1530 g=1
1540 FOR f=6 TO 14 STEP 2
1550 LOCATE f,a*4:PEN x(g,a)
1560 PRINT a$(x(g,a))
1570 SOUND 7,a*20,3,7
1580 g=g+1
1590 NEXT
1600 RETURN
1610 REM ** SCRAMBLE **
1620 sp=RND*4+1:sp2=RND*4+1
1630 IF sp>1 AND sp<5 AND sp2>1 AND sp2<5 THEN 1620
1640 sp$=a$(x(sp,sp2)):sp=x(sp,sp2)
1650 LOCATE (sp+2)*2,sp2*4:PEN 0:PRINT a$(0):x(sp,sp2)=0
1660 LOCATE 3,23:PEN sp:PRINT sp$
1670 FOR m=1 TO 12
1680 FOR r=1 TO 4
1690 ON r GOSUB 1710,1760,1810,1860
1700 NEXT:NEXT:RETURN
1710 a=1:FOR q=1 TO RND*3:GOSUB 1150:GOSUB 1440:NEXT
1720 FOR p=2 TO 4
1730 IF x(1,p)=0 THEN a=p:GOSUB 1360:GOSUB 1530
1740 NEXT
1750 RETURN
1760 a=5:FOR q=1 TO RND*3:GOSUB 1220:GOSUB 1440:NEXT
1770 FOR p=2 TO 4
1780 IF x(5,p)=0 THEN a=p:GOSUB 1290:GOSUB 1530
1790 NEXT
1800 RETURN
1810 a=1:FOR q=1 TO RND*3:GOSUB 1360:GOSUB 1530:NEXT
1820 FOR p=2 TO 4
1830 IF x(p,1)=0 THEN a=p:GOSUB 1220:GOSUB 1440
1840 NEXT
1850 RETURN
1860 a=5:FOR q=1 TO RND*3:GOSUB 1290:GOSUB 1530:NEXT
1870 FOR p=2 TO 4
1880 IF x(p,5)=0 THEN a=p:GOSUB 1150:GOSUB 1440
1890 NEXT
1900 RETURN
1910 REM ** INIT./SCREEN **
1920 FOR f=0 TO 15:INK f,0:NEXT
1930 a=24:b=60:c=126:d=102
1940 IF HIMEM<>&3FFE THEN SYMBOL AFTER 235
1950 SYMBOL 235,0,a,a,b,b,b,c,c
1960 SYMBOL 236,c,c,b,b,b,a,a
1970 SYMBOL 237,0,a,a,a,a,a,c,c
1980 SYMBOL 238,c,c,a,a,a,a,a
1990 SYMBOL 239,0,0,d,d,d,d,a,a
2000 SYMBOL 240,a,a,d,d,d,d
2010 SYMBOL 241,0,d,d,66,66,d,b,a
2020 SYMBOL 242,a,b,d,66,66,d,d
2030 SYMBOL 243,0,0,c,c,66,66,90,90
2040 SYMBOL 244,90,90,66,66,c,c
2050 SYMBOL 245,61,61,28,28,28,28,8,8
2060 SYMBOL 248,240,224,224,192,192,128,128,0
2070 SYMBOL 249,15,14,14,12,12,8,8,0
2080 SYMBOL 250,0,16,16,48,48,112,112,240
2090 SYMBOL 251,0,1,1,3,3,7,7,15
2100 SYMBOL 252,128,64,64,32,32,16,16,0
2110 SYMBOL 253,0,8,8,4,4,2,2,1
2120 SYMBOL 254,1,3,3,7,7,7,15,15
2130 SYMBOL 255,240,240,224,224,224,192,192,128
2140 lf$=CHR$(8)+CHR$(10)
2150 a$(0)=CHR$(147)+lf$+CHR$(147)
2160 g=235
2170 FOR f=1 TO 5
2180 a$(f)=CHR$(g)+lf$+CHR$(g+1)
2190 g=g+2
2200 NEXT
2210 b$=CHR$(214)+lf$+CHR$(213)
2220 q$=CHR$(24)+"Q"+CHR$(24)+"  T O  Q U I T"
2230 MODE 0:PRINT CHR$(22)CHR$(1)
2240 LOCATE 5,2:PEN 12:PRINT STRING$(11,143)
2250 LOCATE 5,23:PEN 11:PRINT STRING$(11,143)
2260 LOCATE 15,2:PEN 11:PRINT CHR$(254)
2270 FOR f=3 TO 22:LOCATE 5,f:PEN 12:PRINT CHR$(133)
2280 LOCATE 15,f:PEN 11:PRINT CHR$(138):NEXT
2290 LOCATE 5,23:PEN 12:PRINT CHR$(255)
2300 FOR g=3 TO 19 STEP 4
2310 FOR f=5 TO 13 STEP 2
2320 LOCATE f,g:PEN 11:PRINT CHR$(138)CHR$(143)CHR$(248)
2330 LOCATE f,g+1:PRINT CHR$(138):LOCATE f,g+2:PRINT CHR$(138)
2340 LOCATE f,g+3:PRINT CHR$(249)
2350 LOCATE f,g:PEN 13:PRINT CHR$(253)
2360 LOCATE f,g+3:PEN 12:PRINT CHR$(251)CHR$(143)CHR$(133)
2370 LOCATE f+2,g+2:PRINT CHR$(133)
2380 LOCATE f+2,g+1:PRINT CHR$(133)
2390 LOCATE f+2,g:PRINT CHR$(250)
2400 LOCATE f+2,g+3:PEN 14:PRINT CHR$(252)
2410 NEXT:NEXT:PRINT CHR$(22)CHR$(0)
2420 MOVE 46,62:DRAWR 62,0,6:DRAWR 0,-62:DRAWR -62,0:DRAWR 0,62
2430 INK 6,26:INK 7,2:INK 11,1:INK 12,11:INK 13,0:INK 14,20
2440 RETURN
2450 REM ** RANDOM COLS./SYMBOLS **
2460 FOR f=1 TO 5:c(f)=0:NEXT
2470 RESTORE 2530:FOR f=1 TO 5
2480 c=RND*4+1
2490 IF c(c)=1 THEN 2480
2500 c(c)=1:col(f)=c
2510 READ a:INK col(f),a
2520 NEXT
2530 DATA 6,22,16,24,26
2540 FOR g=1 TO 5:FOR f=1 TO 5
2550 x(f,g)=g:NEXT:NEXT
2560 FOR f=1 TO 5:c(f)=0:NEXT
2570 FOR f=1 TO 5
2580 c=RND*4+1
2590 IF c(c)=1 THEN 2580
2600 c(c)=1:d$(f)=a$(c)
2610 NEXT
2620 FOR f=1 TO 5:a$(f)=d$(f):NEXT
2630 RETURN
2640 REM ** M/C CHECK **
2650 pk=&3FFF:MEMORY pk-1
2660 RESTORE 2850
2670 FOR f=&4000 TO &4037
2680 READ a$:av=VAL("&"+a$):POKE f,av:chk=chk+av:NEXT
2690 IF chk<>6474 THEN PRINT"Typing error in data":LIST 2850- ELSE RETURN
2700 MODE 0:INK 0,0:INK 1,26:INK 2,15,0:BORDER 0
2710 LOCATE 6,10:PEN 1:PRINT "[";:PEN 2:PRINT"J";:PEN 1:PRINT"]OYSTICK"
2720 LOCATE 10,12:PRINT"OR"
2730 LOCATE 6,14:PRINT"[";:PEN 2:PRINT"K";:PEN 1:PRINT"]EYBOARD"
2740 IF NOT INKEY(45) THEN up=72:do=73:le=74:ri=75:fi=76:GOTO 2770
2750 IF NOT INKEY(37) THEN up=0:do=2:le=8:ri=1:fi=47:GOTO 2770
2760 GOTO 2740
2770 CLS:LOCATE 8,10:PRINT"LEVEL-"
2780 LOCATE 8,12:PEN 2:PRINT"1";:PEN 1:PRINT" OR ";:PEN 2:PRINT"2"
2790 IF NOT INKEY(64) THEN lev=1:RETURN ELSE IF NOT INKEY(65) THEN lev=2:RETURN ELSE 2790
2800 LOCATE 1,1:PEN 6:PRINT"CHANGE LEVEL?(Y/ANY)":k$=""
2810 k$=UPPER$(INKEY$)
2820 IF k$="Y" THEN lev=3-lev:GOSUB 2840:GOTO 1110
2830 IF k$<>"Y" AND k$<>"" THEN 1110 ELSE 2810
2840 LOCATE 5,24:PEN 6:PRINT" BEST :";best(lev):RETURN
2850 DATA AF,32,FF,3F,11,AC,00,21,50,00,3E,05,E5,F5
2860 DATA 06,05,D5,E5,C5,CD,F0,BB,C1,B8,20,07,3A,FF
2870 DATA 3F,3C,32,FF,3F,E1,11,40,00,19,D1,10,E7,F1
2880 DATA 3D,28,09,21,40,00,19,EB,E1,18,D7,C9,E1,C9THEN 1110 ELSE 2810
2840 LOCATE 5,24:PEN 6:PRINT" BEST :";best(lev):RETURN
2850 DATA AF,32,FF,3F,11,AC,00,21,50,00,3E,05,E5,F5
2860 DATA 06,05,D5,E5,C5,CD,F0,BB,C1,B8,20,07,3A,FF
2870 DATA 3F,3C,32,FF,3F,E1,11,40,00,19,D1,10,E7,F1
2880 DATA 3D,28,09,21,40,00,19,EB,E1,18,D7,C9,E1,C9