Knight's tour: Difference between revisions

Content added Content deleted
Line 876: Line 876:


[[Image:knights_tour_bbc.gif|right]]
[[Image:knights_tour_bbc.gif|right]]
<lang ANSI Standard BASIC>DECLARE EXTERNAL FUNCTION FNchoosemove
<lang ANSI Standard BASIC>100 DECLARE EXTERNAL FUNCTION FNchoosemove
110

PUBLIC NUMERIC X, Y, TRUE, FALSE
120 PUBLIC NUMERIC X, Y, TRUE, FALSE
LET TRUE = -1
130 LET TRUE = -1
LET FALSE = 0
140 LET FALSE = 0
150

SET WINDOW 1,512,1,512
160 SET WINDOW 1,512,1,512
SET AREA COLOR "black"
170 SET AREA COLOR "black"
FOR x=0 TO 512-128 STEP 128
180 FOR x=0 TO 512-128 STEP 128
FOR y=0 TO 512-128 STEP 128
190 FOR y=0 TO 512-128 STEP 128
PLOT AREA:x+64,y;x+128,y;x+128,y+64;x+64,y+64
200 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
210 PLOT AREA:x,y+64;x+64,y+64;x+64,y+128;x,y+128
NEXT y
220 NEXT y
NEXT x
230 NEXT x
240

SET LINE COLOR "red"
250 SET LINE COLOR "red"
SET LINE width 4
260 SET LINE width 4
270

PUBLIC NUMERIC Board(0 TO 7,0 TO 7)
280 PUBLIC NUMERIC Board(0 TO 7,0 TO 7)
LET X = 0
290 LET X = 0
LET Y = 0
300 LET Y = 0
LET Total = 0
310 LET Total = 0
DO
320 DO
LET Board(X,Y) = TRUE
330 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
340 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
350 LET Total = Total + 1
LOOP UNTIL FNchoosemove = 0
360 LOOP UNTIL FNchoosemove = 0
IF Total <> 64 THEN STOP
370 IF Total <> 64 THEN STOP
380 END
! REPEAT WAIT 1 : UNTIL FALSE
390
END
400 EXTERNAL FUNCTION FNchoosemove

EXTERNAL FUNCTION FNchoosemove
410 DECLARE EXTERNAL SUB PROCtrymove
420 LET M = 9
DECLARE EXTERNAL SUB PROCtrymove
430 CALL PROCtrymove(X+1, Y+2, M, newx, newy)
LET M = 9
CALL PROCtrymove(X+1, Y+2, M, newx, newy)
440 CALL PROCtrymove(X+1, Y-2, M, newx, newy)
CALL PROCtrymove(X+1, Y-2, M, newx, newy)
450 CALL PROCtrymove(X-1, Y+2, M, newx, newy)
CALL PROCtrymove(X-1, Y+2, M, newx, newy)
460 CALL PROCtrymove(X-1, Y-2, M, newx, newy)
CALL PROCtrymove(X-1, Y-2, M, newx, newy)
470 CALL PROCtrymove(X+2, Y+1, M, newx, newy)
CALL PROCtrymove(X+2, Y+1, M, newx, newy)
480 CALL PROCtrymove(X+2, Y-1, M, newx, newy)
CALL PROCtrymove(X+2, Y-1, M, newx, newy)
490 CALL PROCtrymove(X-2, Y+1, M, newx, newy)
CALL PROCtrymove(X-2, Y+1, M, newx, newy)
500 CALL PROCtrymove(X-2, Y-1, M, newx, newy)
510 IF M=9 THEN
CALL PROCtrymove(X-2, Y-1, M, newx, newy)
520 LET FNchoosemove = FALSE
IF M=9 THEN
530 EXIT FUNCTION
LET FNchoosemove = FALSE
540 END IF
EXIT FUNCTION
550 LET X = newx
END IF
LET X = newx
560 LET Y = newy
LET Y = newy
570 LET FNchoosemove = TRUE
580 END FUNCTION
LET FNchoosemove = TRUE
590
END FUNCTION
600 EXTERNAL SUB PROCtrymove(X, Y, M, newx, newy)

610
EXTERNAL SUB PROCtrymove(X, Y, M, newx, newy)
620 DECLARE EXTERNAL FUNCTION FNvalidmove

DECLARE EXTERNAL FUNCTION FNvalidmove
630 IF FNvalidmove(X,Y) = 0 THEN EXIT SUB
IF FNvalidmove(X,Y) = 0 THEN EXIT SUB
640 IF FNvalidmove(X+1,Y+2) <> 0 THEN LET N = N + 1
IF FNvalidmove(X+1,Y+2) <> 0 THEN LET N = N + 1
650 IF FNvalidmove(X+1,Y-2) <> 0 THEN LET N = N + 1
IF FNvalidmove(X+1,Y-2) <> 0 THEN LET N = N + 1
660 IF FNvalidmove(X-1,Y+2) <> 0 THEN LET N = N + 1
IF FNvalidmove(X-1,Y+2) <> 0 THEN LET N = N + 1
670 IF FNvalidmove(X-1,Y-2) <> 0 THEN LET N = N + 1
IF FNvalidmove(X-1,Y-2) <> 0 THEN LET N = N + 1
680 IF FNvalidmove(X+2,Y+1) <> 0 THEN LET N = N + 1
IF FNvalidmove(X+2,Y+1) <> 0 THEN LET N = N + 1
690 IF FNvalidmove(X+2,Y-1) <> 0 THEN LET N = N + 1
IF FNvalidmove(X+2,Y-1) <> 0 THEN LET N = N + 1
700 IF FNvalidmove(X-2,Y+1) <> 0 THEN LET N = N + 1
IF FNvalidmove(X-2,Y+1) <> 0 THEN LET N = N + 1
710 IF FNvalidmove(X-2,Y-1) <> 0 THEN LET N = N + 1
IF FNvalidmove(X-2,Y-1) <> 0 THEN LET N = N + 1
720 IF N>M THEN EXIT SUB
IF N>M THEN EXIT SUB
730 IF N=M AND RND<.5 THEN EXIT SUB
740 LET M = N
IF N=M AND RND<.5 THEN EXIT SUB
LET M = N
750 LET newx = X
LET newx = X
760 LET newy = Y
770 END SUB
LET newy = Y
780
END SUB
790 EXTERNAL FUNCTION FNvalidmove(X,Y)

800 IF X<0 OR X>7 OR Y<0 OR Y>7 THEN
EXTERNAL FUNCTION FNvalidmove(X,Y)
810 LET FNvalidmove = FALSE
IF X<0 OR X>7 OR Y<0 OR Y>7 THEN
820 EXIT FUNCTION
LET FNvalidmove = FALSE
830 END IF
EXIT FUNCTION
840 IF Board(X,Y) = TRUE THEN
END IF
850 LET FNvalidmove = FALSE
IF Board(X,Y) = TRUE THEN
860 ELSE
LET FNvalidmove = FALSE
870 LET FNvalidmove = TRUE
ELSE
880 END IF
LET FNvalidmove = TRUE
890 END FUNCTION</lang>
END IF
END FUNCTION</lang>


=={{header|AutoHotkey}}==
=={{header|AutoHotkey}}==