Knight's tour: Difference between revisions

Content added Content deleted
Line 876:
 
[[Image:knights_tour_bbc.gif|right]]
<lang ANSI Standard BASIC>100 DECLARE EXTERNAL FUNCTION FNchoosemove
110
 
120 PUBLIC NUMERIC X, Y, TRUE, FALSE
130 LET TRUE = -1
140 LET FALSE = 0
150
 
160 SET WINDOW 1,512,1,512
170 SET AREA COLOR "black"
180 FOR x=0 TO 512-128 STEP 128
190 FOR y=0 TO 512-128 STEP 128
200 PLOT AREA:x+64,y;x+128,y;x+128,y+64;x+64,y+64
210 PLOT AREA:x,y+64;x+64,y+64;x+64,y+128;x,y+128
220 NEXT y
230 NEXT x
240
 
250 SET LINE COLOR "red"
260 SET LINE width 4
270
 
280 PUBLIC NUMERIC Board(0 TO 7,0 TO 7)
290 LET X = 0
300 LET Y = 0
310 LET Total = 0
320 DO
330 LET Board(X,Y) = TRUE
340 IF Total <> 0 THEN PLOT LINES: X*64+32,Y*64+32; ELSE PLOT LINES: X*64+32,Y*64+32
350 LET Total = Total + 1
360 LOOP UNTIL FNchoosemove = 0
370 IF Total <> 64 THEN STOP
380 END
! REPEAT WAIT 1 : UNTIL FALSE
390
END
400 EXTERNAL FUNCTION FNvalidmove(X,Y)FNchoosemove
 
410 DECLARE EXTERNAL FUNCTIONSUB FNchoosemovePROCtrymove
420 LET M = 9
DECLARE EXTERNAL SUB PROCtrymove
430 CALL PROCtrymove(X-2+1, Y-1+2, M, newx, newy)
LET M = 9
440 CALL PROCtrymove(X+1, Y+-2, M, newx, newy)
450 CALL PROCtrymove(X+-1, Y-+2, M, newx, newy)
460 CALL PROCtrymove(X-1, Y+-2, M, newx, newy)
470 CALL PROCtrymove(X-1+2, Y-2+1, M, newx, newy)
480 CALL PROCtrymove(X+2, Y+-1, M, newx, newy)
490 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
560 LET XY = newxnewy
570 LET YFNchoosemove = newyTRUE
580 END FUNCTION
LET FNchoosemove = TRUE
590
END FUNCTION
DECLARE600 EXTERNAL SUB PROCtrymove(X, Y, M, newx, newy)
 
610
EXTERNAL SUB PROCtrymove(X, Y, M, newx, newy)
620 DECLARE EXTERNAL FUNCTION FNvalidmove
 
DECLARE630 EXTERNAL FUNCTIONIF FNvalidmove(X,Y) = 0 THEN EXIT SUB
640 IF FNvalidmove(X+1,Y+2) =<> 0 THEN EXITLET N = N + SUB1
650 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
670 IF FNvalidmove(X-1,Y+-2) <> 0 THEN LET N = N + 1
680 IF FNvalidmove(X-1+2,Y-2+1) <> 0 THEN LET N = N + 1
690 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
710 IF FNvalidmove(X-2,Y+-1) <> 0 THEN LET N = N + 1
720 IF FNvalidmove(X-2,Y-1) <N> 0M THEN LET N = N +EXIT 1SUB
730 IF N>=M AND RND<.5 THEN EXIT SUB
740 LET newyM = YN
IF N=M AND RND<.5 THEN EXIT SUB
750 LET Mnewx = NX
760 LET newxnewy = X 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}}==