home *** CD-ROM | disk | FTP | other *** search
- ' simple "pictorial" Knight's tour Jim Butterfield 1988Aug4
- ' Press CTRL C to pause and enter a move at which to re-try at the q prompt.
- ' EXIT program by entering 0 (zero) at the q prompt.
-
- DIM Board(8,8),MoveX(65),MoveY(65),MovePos(65)
- DIM PositX(8),PositY(8),MoveLim(65)
- DATA 1,2
- DATA 2,1
- DATA 2,-1
- DATA 1,-2
- DATA -1,-2
- DATA -2,-1
- DATA -2,1
- DATA -1,2
- FOR j=1 TO 8
- READ PositX(j),PositY(j)
- NEXT j
- FOR j=1 TO 8
- FOR k=1 TO 8
- Board(j,k)=0
- NEXT k
- NEXT j
- BigFinish=33
- 'Board(3,2)=99 '**********
- Move=1
- MoveX(Move)=1:MoveY(Move)=1
- Board(MoveX(Move),MoveY(Move))=1
- Board(9-MoveX(Move),9-MoveY(Move))=1+32
- ON BREAK GOSUB Smurf
- BREAK ON
- q=99
- GOSUB PlotMove
- GOSUB TryNew ' Try move from last position
- BREAK OFF
- ON BREAK GOSUB 0
- END
- PlotMove:
- LOCATE MoveX(Move),MoveY(Move)*3
- PRINT Move;
- LOCATE 9-MoveX(Move),(9-MoveY(Move))*3
- PRINT Move+32;
- RETURN
- WipeMove:
- XX=MoveX(Move):YY=MoveY(Move)
- Board(XX,YY)=0
- LOCATE XX,YY*3
- PRINT " ";
- Board(9-XX,9-YY)=0
- LOCATE 9-XX,(9-YY)*3
- PRINT " ";
- RETURN
- TryNew:
- Move=Move+1
- MoveLim=8
- MovePos(Move)=1
- MoveLim(Move)=8
- x1=MoveX(Move-1):y1=MoveY(Move-1)
- x2=0
- IF ((x1=2 AND y1=6) OR (x1=3 AND y1=7)) AND Board(1,8)=0 THEN x2=1:y2=8
- IF ((x1=6 AND y1=2) OR (x1=7 AND y1=3)) AND Board(8,1)=0 THEN x2=8:y2=1
- IF ((x1=6 AND y1=7) OR (x1=7 AND y1=6)) AND Board(8,8)=0 THEN x2=8:y2=8
- IF x2>0 THEN
- FOR MoveP=1 TO 8
- IF x1+PositX(MoveP)=x2 AND y1+PositY(MoveP)=y2 THEN MovePos(Move)=MoveP:MoveLim(Move)=MoveP
- NEXT MoveP
- 'STOP
- END IF
- WHILE MovePos(Move)<MoveLim(Move)+1 AND Move<BigFinish
- MoveX(Move)=MoveX(Move-1)+PositX(MovePos(Move))
- MoveY(Move)=MoveY(Move-1)+PositY(MovePos(Move))
- OKx=MoveX(Move)<9 AND MoveX(Move)>0
- OKy=MoveY(Move)<9 AND MoveY(Move)>0
- IF Move=q THEN q=99
- OK = OKx AND OKy AND Move<q
- IF OK THEN OK=OK AND Board(MoveX(Move),MoveY(Move))=0
- IF OK THEN
- LOCATE 10,10
- 'PRINT Move;MoveX(Move),MoveY(Move);Board(MoveX(Move),MoveY(Move))
- 'STOP
- Board(MoveX(Move),MoveY(Move))=Move
- Board(9-MoveX(Move),9-MoveY(Move))=Move+32
- GOSUB PlotMove
- GOSUB TryNew
- END IF
- MovePos(Move)=MovePos(Move)+1
- WEND
- IF Move>=BigFinish AND (Board(3,2) MOD 32 = 0) THEN
- LOCATE 10,1
- PRINT "solution"
- STOP
- LOCATE 10,1
- PRINT " "
- END IF
- Move=Move-1
- GOSUB WipeMove
- RETURN
-
- Smurf:
- LOCATE 11,1
- INPUT "q";q
- IF q=0 THEN STOP
- LOCATE 11,1
- PRINT " "
- RETURN
-