RosettaCodeData/Task/Knights-tour/BBC-BASIC/knights-tour.basic
2023-07-01 13:44:08 -04:00

60 lines
1.8 KiB
Text

VDU 23,22,256;256;16,16,16,128
VDU 23,23,4;0;0;0;
OFF
GCOL 4,15
FOR x% = 0 TO 512-128 STEP 128
RECTANGLE FILL x%,0,64,512
NEXT
FOR y% = 0 TO 512-128 STEP 128
RECTANGLE FILL 0,y%,512,64
NEXT
GCOL 9
DIM Board%(7,7)
X% = 0
Y% = 0
Total% = 0
REPEAT
Board%(X%,Y%) = TRUE
IF Total% DRAW X%*64+32,Y%*64+32 ELSE MOVE X%*64+32,Y%*64+32
Total% += 1
UNTIL NOT FNchoosemove(X%, Y%)
IF Total%<>64 STOP
REPEAT WAIT 1 : UNTIL FALSE
END
DEF FNchoosemove(RETURN X%, RETURN Y%)
LOCAL M%, newx%, newy%
M% = 9
PROCtrymove(X%+1, Y%+2, M%, newx%, newy%)
PROCtrymove(X%+1, Y%-2, M%, newx%, newy%)
PROCtrymove(X%-1, Y%+2, M%, newx%, newy%)
PROCtrymove(X%-1, Y%-2, M%, newx%, newy%)
PROCtrymove(X%+2, Y%+1, M%, newx%, newy%)
PROCtrymove(X%+2, Y%-1, M%, newx%, newy%)
PROCtrymove(X%-2, Y%+1, M%, newx%, newy%)
PROCtrymove(X%-2, Y%-1, M%, newx%, newy%)
IF M%=9 THEN = FALSE
X% = newx% : Y% = newy%
= TRUE
DEF PROCtrymove(X%, Y%, RETURN M%, RETURN newx%, RETURN newy%)
LOCAL N%
IF NOT FNvalidmove(X%,Y%) THEN ENDPROC
IF FNvalidmove(X%+1,Y%+2) N% += 1
IF FNvalidmove(X%+1,Y%-2) N% += 1
IF FNvalidmove(X%-1,Y%+2) N% += 1
IF FNvalidmove(X%-1,Y%-2) N% += 1
IF FNvalidmove(X%+2,Y%+1) N% += 1
IF FNvalidmove(X%+2,Y%-1) N% += 1
IF FNvalidmove(X%-2,Y%+1) N% += 1
IF FNvalidmove(X%-2,Y%-1) N% += 1
IF N%>M% THEN ENDPROC
IF N%=M% IF RND(2)=1 THEN ENDPROC
M% = N%
newx% = X% : newy% = Y%
ENDPROC
DEF FNvalidmove(X%,Y%)
IF X%<0 OR X%>7 OR Y%<0 OR Y%>7 THEN = FALSE
= NOT(Board%(X%,Y%))