10 REMark  The Nowotnik Puzzle
20 REMark   by David Nowotnik
30 REMark    September, 1984
31 REMark from ZX Computing Jun/Jul.1985
40 init
50 REPeat demo_option
60 title: key_press
70 IF a$="n" THEN EXIT demo_option
80 set_up
90 shuffle
100 PAUSE 200
110 END REPeat demo_option
120 set_up: view: shuffle
130 mv=0
140 REPeat game
150 mv=mv+1
160 AT #2,0,0: PRINT #2,"Move ";mv
170 your_move
180 check
190 IF OK THEN EXIT game
200 END REPeat game
210 CLS
220 AT 2,4: PRINT "  well done!"
230 PRINT: PRINT "  you solved the puzzle"
240 PRINT "     in ";mv;" moves."
250 STOP
500 REMark **********************
510 REMark       your_move
520 REMark **********************
530 REMark
540 DEFine PROCedure your_move
550 REPeat keys
560 key_press
570 move_one=CODE (a$)-48
580 IF move_one>0 AND move_one<9 THEN EXIT keys
590 END REPeat keys
600 slide_piece
610 END DEFine
700 REMark **********************
710 REMark       check
720 REMark **********************
730 REMark
740 DEFine PROCedure check
750 OK=0
760 IF box$(1)="rryy" THEN OK=OK+1
770 IF box$(2)="rryy" THEN OK=OK+1
780 IF box$(3)="ggbb" THEN OK=OK+1
790 IF box$(4)="ggbb" THEN OK=OK+1
800 IF OK=4 THEN
810 OK=1
820 ELSE OK=0
830 END IF
840 END DEFine
1000 REMark **********************
1010 REMark        init
1020 REMark **********************
1030 REMark
1040 DEFine PROCedure init
1050 MODE 256
1060 DIM box$(4,4)
1070 WINDOW #1,512,256,0,0
1080 WINDOW #2,512,256,0,0
1090 BORDER #2,20,1,1: BORDER #1,20,1,1
1100 PAPER #1,7: PAPER #2,7
1110 CLS #1: CLS #2
1120 OPEN #4,scr_312x96a100x32
1130 OPEN #5,scr_312x96a100x128
1140 OPEN #6,scr_156x192a100x32
1150 OPEN #7,scr_156x192a256x32
1160 OPEN #8,scr_156x96a256x128
1170 OPEN #10,scr_312x48a100x32
1180 OPEN #11,scr_312x48a100x80
1190 OPEN #12,scr_312x48a100x128
1200 OPEN #13,scr_312x48a100x176
1210 OPEN #14,scr_78x192a100x32
1220 OPEN #15,scr_78x192a178x32
1230 OPEN #16,scr_78x192a256x32
1240 OPEN #17,scr_78x192a334x32
1250 CSIZE #1,1,1: INK #1,3
1260 END DEFine
2000 REMark **********************
2010 REMark      title
2020 REMark **********************
2030 REMark
2040 DEFine PROCedure title
2050 REMark
2060 CLS
2070 AT #1,4,3: PRINT #1,"The Nowotnik Puzzle"
2080 AT #2,12,1: PRINT #2,"Do you want a demonstration? (y/n)"
2090 END DEFine
3000 REMark **********************
3010 REMark       set_up
3020 REMark **********************
3030 REMark
3040 DEFine PROCedure set_up
3050 CLS #1
3060 PAPER #4,2: CLS #4
3070 PAPER #7,6: CLS #7
3080 PAPER #5,4: CLS #5
3090 PAPER #8,1: CLS #8
3100 AT #2,5,2: PRINT #2,"5^"
3110 PRINT #2: PRINT #2,"  <1"
3120 AT #2,5,32: PRINT #2,"^7"
3130 AT #2,7,32: PRINT #2,"2>"
3140 AT #2,14,2: PRINT #2,"<3"
3150 PRINT #2: PRINT #2,"  6v"
3160 AT #2,14,32: PRINT #2,"4>"
3170 AT #2,16,32: PRINT #2,"v8"
3180 FOR i=1 TO 2
3190 box$(i)="rryy"
3200 NEXT i
3210 FOR i=3 TO 4
3220 box$(i)="ggbb"
3230 NEXT i
3240 END DEFine
4500 REMark **********************
4510 REMark       key_press
4520 REMark **********************
4530 REMark
4540 DEFine PROCedure key_press
4550 a$=INKEY$(-1)
4560 END DEFine
5000 REMark **********************
5010 REMark         shuffle
5020 REMark **********************
5030 REMark
5040 DEFine PROCedure shuffle
5050 PAUSE 100
5060 FOR k=1 TO 30
5070 move_one=RND (1 TO 8)
5080 slide_piece
5090 PAUSE 50
5100 NEXT k
5110 END DEFine
5500 REMark **********************
5510 REMark     slide_piece
5520 REMark **********************
5530 REMark
5540 DEFine PROCedure slide_piece
5550 SELect ON move_one
5560 =1: num=1: move_left
5570 =2: num=1: move_right
5580 =3: num=3: move_left
5590 =4: num=3: move_right
5600 =5: num=1: move_up
5610 =6: num=1: move_down
5620 =7: num=3: move_up
5630 =8: num=3: move_down
5640 END SELect
5650 END DEFine
6000 REMark **********************
6010 REMark      move_left
6020 REMark **********************
6030 REMark
6040 DEFine PROCedure move_left
6050 LOCal i
6060 FOR i=num TO num+1
6070 a$=box$(i,1): b$=box$(i,2 TO 4)
6080 box$(i)=b$ & a$
6090 colour
6100 PAPER #(9+i),cc
6110 PAN #(9+i),-78
6120 END FOR i
6130 END DEFine
6500 REMark **********************
6510 REMark     move_right
6520 REMark **********************
6530 REMark
6540 DEFine PROCedure move_right
6550 LOCal i
6560 FOR i=num TO num+1
6570 a$=box$(i,4): b$=box$(i,1 TO 3)
6580 box$(i)=a$ & b$
6590 colour
6600 PAPER #(9+i),cc
6610 PAN #(9+i),78
6620 END FOR i
6630 END DEFine
7000 REMark **********************
7010 REMark      move_up
7020 REMark **********************
7030 REMark
7040 DEFine PROCedure move_up
7050 LOCal i,j
7060 FOR i=num TO num+1
7070 a$=box$(1,i)
7080 FOR j=1 TO 3
7090 box$(j,i)=box$(j+1,i)
7100 NEXT j
7110 box$(4,i)=a$
7120 colour
7130 PAPER #(13+i),cc
7140 SCROLL #(13+i),-48
7150 NEXT i
7160 END DEFine
7500 REMark **********************
7510 REMark      move_down
7520 REMark **********************
7530 REMark
7540 DEFine PROCedure move_down
7550 LOCal i,j
7560 FOR i=num TO num+1
7570 a$=box$(4,i)
7580 FOR j=3 TO 1 STEP -1
7590 box$(j+1,i)=box$(j,i)
7600 NEXT j
7610 box$(1,i)=a$
7620 colour
7630 PAPER #(13+i),cc
7640 SCROLL #(13+i),48
7650 NEXT i
7660 END DEFine
8000 REMark **********************
8010 REMark         col
8020 REMark **********************
8030 REMark
8040 DEFine PROCedure colour
8050 colour_code= CODE (a$)
8060 SELect ON colour_code
8070   ON colour_code=98: cc=1
8080   ON colour_code=114: cc=2
8090   ON colour_code=121: cc=6
8100   ON colour_code=103: cc=4
8110 END SELect
8120 END DEFine
9000 REMark **********************
9010 REMark          view
9020 REMark **********************
9030 REMark
9040 DEFine PROCedure view
9050 AT #2,1,32: PAPER #2,2: PRINT #2," ";
9060 PAPER #2,6: PRINT #2," ": AT #2,2,32
9070 PAPER #2,4: PRINT #2," ";: PAPER #2,1: PRINT #2," "
9080 PAPER #2,7
9090 END DEFine
