Knight's tour: Difference between revisions

No edit summary
Line 873:
1| 12 25 14 31 10 27 36 61
</pre>
=={{header|ANSI Standard BASIC}}==
 
[[Image:knights_tour_bbc.gif|right]]
<lang ANSI Standard BASIC>DECLARE EXTERNAL FUNCTION FNchoosemove
 
PUBLIC NUMERIC X, Y, TRUE, FALSE
LET TRUE = -1
LET FALSE = 0
 
SET WINDOW 1,512,1,512
SET AREA COLOR "black"
FOR x=0 TO 512-128 STEP 128
FOR y=0 TO 512-128 STEP 128
PLOT AREA:x+64,y;x+128,y;x+128,y+64;x+64,y+64
PLOT AREA:x,y+64;x+64,y+64;x+64,y+128;x,y+128
NEXT y
NEXT x
 
SET LINE COLOR "red"
SET LINE width 4
 
PUBLIC NUMERIC Board(0 TO 7,0 TO 7)
LET X = 0
LET Y = 0
LET Total = 0
DO
LET Board(X,Y) = TRUE
IF Total <> 0 THEN PLOT LINES: X*64+32,Y*64+32; ELSE PLOT LINES: X*64+32,Y*64+32
LET Total = Total + 1
LOOP UNTIL FNchoosemove = 0
IF Total <> 64 THEN STOP
! REPEAT WAIT 1 : UNTIL FALSE
END
 
EXTERNAL FUNCTION FNchoosemove
DECLARE EXTERNAL SUB PROCtrymove
LET M = 9
CALL PROCtrymove(X+1, Y+2, M, newx, newy)
CALL PROCtrymove(X+1, Y-2, M, newx, newy)
CALL PROCtrymove(X-1, Y+2, M, newx, newy)
CALL PROCtrymove(X-1, Y-2, M, newx, newy)
CALL PROCtrymove(X+2, Y+1, M, newx, newy)
CALL PROCtrymove(X+2, Y-1, M, newx, newy)
CALL PROCtrymove(X-2, Y+1, M, newx, newy)
CALL PROCtrymove(X-2, Y-1, M, newx, newy)
IF M=9 THEN
LET FNchoosemove = FALSE
EXIT FUNCTION
END IF
LET X = newx
LET Y = newy
LET FNchoosemove = TRUE
END FUNCTION
 
EXTERNAL SUB PROCtrymove(X, Y, M, newx, newy)
 
DECLARE EXTERNAL FUNCTION FNvalidmove
IF FNvalidmove(X,Y) = 0 THEN EXIT SUB
IF FNvalidmove(X+1,Y+2) <> 0 THEN LET N = N + 1
IF FNvalidmove(X+1,Y-2) <> 0 THEN LET N = N + 1
IF FNvalidmove(X-1,Y+2) <> 0 THEN LET N = N + 1
IF FNvalidmove(X-1,Y-2) <> 0 THEN LET N = N + 1
IF FNvalidmove(X+2,Y+1) <> 0 THEN LET N = N + 1
IF FNvalidmove(X+2,Y-1) <> 0 THEN LET N = N + 1
IF FNvalidmove(X-2,Y+1) <> 0 THEN LET N = N + 1
IF FNvalidmove(X-2,Y-1) <> 0 THEN LET N = N + 1
IF N>M THEN EXIT SUB
IF N=M AND RND<.5 THEN EXIT SUB
LET M = N
LET newx = X
LET newy = Y
END SUB
 
EXTERNAL FUNCTION FNvalidmove(X,Y)
IF X<0 OR X>7 OR Y<0 OR Y>7 THEN
LET FNvalidmove = FALSE
EXIT FUNCTION
END IF
IF Board(X,Y) = TRUE THEN
LET FNvalidmove = FALSE
ELSE
LET FNvalidmove = TRUE
END IF
END FUNCTION</lang>
 
=={{header|AutoHotkey}}==