10 DIMC(4,4),X,Y,C,S,ZX,ZY,M,S1,S2,SH,Q,C2(4,4):SH=RND(-(PEEK(9)*256+PEEK(10)))
20 REM INITIALIZATION
30 X=1:Y=1:MN=0:
40 CLS
50 PRINT@6,"---SHUFFLE PUZZLE---":PRINT:PRINT"ORIGINAL: rudihorne@hotmail.com":PRINT"MC-10: jim_gerrie@cbu.ca":PRINT
60 PRINT"SHUFFLE HOW MANY TIMES?":INPUT"(EASY=100, HARD=800)";SH
70 IFSH<1ORSH>32000THENPRINT"INVALID INPUT":END
80 PRINT:PRINT"PLEASE WAIT..."
90 REM SET UP THE BOARD METHODICALLY
100 X=1:Y=1:C=1:FORY=1TO4:FORX=1TO4:C(X,Y)=C:C=C+1:NEXT:NEXT
110 C(4,4)=0
120 REM SHUFFLE THE BOARD
130 FORS=0TOSH:X=RND(4):Y=RND(4):IFY>1THENIFC(X,Y-1)=0THENC(X,Y-1)=C(X,Y):C(X,Y)=0
140 IFY<4THENIFC(X,Y+1)=0THENC(X,Y+1)=C(X,Y):C(X,Y)=0
150 IFX>1THENIFC(X-1,Y)=0THENC(X-1,Y)=C(X,Y):C(X,Y)=0
160 IFX<4THENIFC(X+1,Y)=0THENC(X+1,Y)=C(X,Y):C(X,Y)=0
170 NEXT:FORY=1TO4:FORX=1TO4:C2(X,Y)=C(X,Y):NEXT:NEXT
180 CLS
200 FORQ=1TO65000:GOSUB300:GOSUB400:IFQ>=65000THEN295
210 REM MAIN INPUT
220 PRINT"ENTER # TO MOVE (qUIT)     "CHR$(8)CHR$(8)CHR$(8)CHR$(8)CHR$(8);:INPUTM$:PRINT:IFM$="Q"THENQ=65000:GOTO295
240 M=VAL(M$):FORS1=1TO4:FORS2=1TO4:IFC(S1,S2)=0THENZX=S1:ZY=S2
250 IFC(S1,S2)=MTHENMX=S1:MY=S2
260 NEXT:NEXT:IFZX=(MX+1)ANDZY=MYTHENMN=MN+1:C(ZX,ZY)=M:C(MX,MY)=0
270 IFZX=MX-1ANDZY=MYTHENMN=MN+1:C(ZX,ZY)=M:C(MX,MY)=0
280 IFZY=MY+1ANDZX=MXTHENMN=MN+1:C(ZX,ZY)=M:C(MX,MY)=0
290 IFZY=MY-1ANDZX=MXTHENMN=MN+1:C(ZX,ZY)=M:C(MX,MY)=0
295 NEXT:IFQ=65002THENPRINT"THANKS FOR PLAYING":END
296 IFQ=65003THENRUN
297 IFQ=65004THENFORY=1TO4:FORX=1TO4:C(X,Y)=C2(X,Y):NEXT:NEXT:PRINT@480,"LAST # OF MOVES:";MN;:MN=0:GOTO200
298 PRINT@480,"I THINK YOU'VE TRIED ENOUGH!":END
299 REM DISPLAY THE BOARD
300 PRINT@6,"---SHUFFLE PUZZLE---"
310 PRINT@64,"GOAL: TO HAVE THE NUMBERS IN    ORDER (LEFT-RIGHT, TOP-BOTTOM).":PRINT"MOVE#";MN:PRINTTAB(9)""
320 PRINTTAB(9)"             ":FORS1=1TO4:PRINTTAB(9)"";:FORS2=1TO4:IFC(S2,S1)=0THENPRINT"   ";:GOTO340
330 PRINTSTR$(C(S2,S1));:IFC(S2,S1)<10THENPRINT" ";
340 NEXT:PRINT" ":NEXT:PRINTTAB(9)"             ":PRINTTAB(9)"":RETURN
400 X=1:Y=1:C=1:FORY=1TO4:FORX=1TO4:IFC(X,Y)<>CANDC<16THENT1=Y:T2=X:X=4:NEXT:Y=4:NEXT:Y=T1:X=T2:RETURN
410 C=C+1:NEXT:NEXT:PRINT"THE PUZZLE IS SOLVED!":PRINT"PLAY AGAIN (y/n) OR rETRY LAST?":POKE49151,64
420 C=C+1:IFC>50THENPOKE49151,64
421 IFC>100THENPOKE49151,16:C=1
425 M$=INKEY$:ON1-(M$="N")GOTO430:SOUND1,1:Q=65001:RETURN
430 ON1-(M$="Y")GOTO440:SOUND100,1:Q=65002:RETURN
440 ON1-(M$="R")GOTO420:SOUND50,1:Q=65003:PRINT@448,"":RETURN
