10
20
30 VDU 20,26
40 VDU 29,18;2;
50 GCOL 128
60 CLG
70
80 DIM board%(4,4)
90 playerX%=2
100 playerY%=2
110 lastFlash%=TIME
120 :
130 REPEAT
140
150 REPEAT
160 READ puzzle%
170 IF puzzle%=-1 RESTORE
180 UNTIL puzzle%<>-1
190
200 PROC_initBoard(puzzle%)
210
220 REPEAT
230 k%=FN_waitGameKeyFlash
240 IF k% AND 1 THEN playerY%=playerY%-1
250 IF k% AND 2 THEN playerY%=playerY%+1
260 IF k% AND 4 THEN playerX%=playerX%-1
270 IF k% AND 8 THEN playerX%=playerX%+1
280 :
290 IF playerX%=5 THEN playerX%=0
300 IF playerX%=-1 THEN playerX%=4
310 IF playerY%=5 THEN playerY%=0
320 IF playerY%=-1 THEN playerY%=4
330 :
340 IF k% AND 16 THEN PROC_pressCell(playerX%,playerY%)
350 UNTIL cellCount%=0
360 UNTIL FALSE
370 END
380 :
390 DEF PROC_drawCell(x%,y%)
400 GCOL 127
410 MOVE x%*12,y%*12
420 PLOT 97,10,10
430 IF board%(x%,y%) ENDPROC
440 GCOL 0
450 MOVE x%*12+1,y%*12+1
460 PLOT 97,8,8
470 ENDPROC
480 :
490 DEF PROC_flashCell(x%,y%)
500 IF TIME-lastFlash%<20 ENDPROC
510 lastFlash%=TIME
520 GCOL 4,0
530 MOVE x%*12+2,y%*12+2
540 PLOT 97,6,6
550 ENDPROC
560 :
570 DEF FN_getGameKey
580 r%=0
590 IF INKEY(-58) THEN r%=r% OR 1
600 IF INKEY(-42) THEN r%=r% OR 2
610 IF INKEY(-26) THEN r%=r% OR 4
620 IF INKEY(-122) THEN r%=r% OR 8
630 IF INKEY(-74) THEN r%=r% OR 16
640 =r%
650 :
660 DEF FN_waitGameKeyFlash
670 REPEAT
680 PROC_flashCell(playerX%,playerY%)
690 UNTIL FN_getGameKey=0
700 r%=0
710 REPEAT
720 PROC_flashCell(playerX%,playerY%)
730 r%=FN_getGameKey
740 UNTIL r%
750 PROC_drawCell(playerX%,playerY%)
760 =r%
770 :
780 DEF PROC_invertCell(x%,y%)
790 IF x%<0 OR x%>4 OR y%<0 OR y%>4 THEN ENDPROC
800 board%(x%,y%)=NOT board%(x%,y%)
810 IF board%(x%,y%) THEN cellCount%=cellCount%+1 ELSE cellCount%=cellCount%-1
820 PROC_drawCell(x%,y%)
830 ENDPROC
840 :
850 DEF PROC_pressCell(x%,y%)
860 *REFRESH OFF
870 PROC_invertCell(x%,y%)
880 PROC_invertCell(x%+1,y%)
890 PROC_invertCell(x%-1,y%)
900 PROC_invertCell(x%,y%+1)
910 PROC_invertCell(x%,y%-1)
920 *REFRESH ON
930 ENDPROC
940 :
950 DEF PROC_initBoard(puzzle%)
960 *REFRESH OFF
970 cellCount%=0
980 FOR y=0 TO 4
990 FOR x=0 TO 4
1000 board%(x,y)=-(puzzle% AND 1)
1010 cellCount%=cellCount%+(puzzle% AND 1)
1020 puzzle%=puzzle%/2
1030 PROC_drawCell(x,y)
1040 NEXT x
1050 NEXT y
1060 *REFRESH ON
1070 ENDPROC
1080 :
1090
1100 DATA &5400
1110 DATA &15A82B5
1120 DATA &ADEF6A
1130 DATA &D823B
1140 DATA &1EEF47B
1150 DATA &56AA
1160 DATA &23C2CF
1170 DATA &10C3107
1180 DATA &10848E5
1190 DATA &EA73DF
1200 DATA &CC4007
1210 DATA &47E1E4
1220 DATA &14F5AFD
1230 DATA &4742CF
1240 DATA &8653DF
1250 DATA &CD5E4F
1260 DATA &6C00
1270 DATA &10851C3
1280 DATA &1E8C63E
1290 DATA &C199DF
1300 DATA &42934D
1310 DATA &1E50027
1320 DATA &B89BAF
1330 DATA &1A238A7
1340 DATA &FFB884
1350 DATA &A8808A
1360 DATA &15519B5
1370 DATA &D33253
1380 DATA &E22BEE
1390 DATA &BE1726
1400 DATA &1AD404
1410 DATA &1B2009F
1420 DATA &A24322
1430 DATA &1E49701
1440 DATA &E8B9CE
1450 DATA &13CD
1460 DATA &1007111
1470 DATA &8E56B5
1480 DATA &1557D5B
1490 DATA &E508AA
1500 DATA -1