Knight's tour: Difference between revisions

Content added Content deleted
No edit summary
Line 873: Line 873:
1| 12 25 14 31 10 27 36 61
1| 12 25 14 31 10 27 36 61
</pre>
</pre>
=={{header|ANSI Standard BASIC}}==
ANSI BASIC only passes function parameters by value so X and Y were made global variables.

[[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
390
400 EXTERNAL FUNCTION FNchoosemove
410 DECLARE EXTERNAL SUB PROCtrymove
420 LET M = 9
430 CALL PROCtrymove(X+1, Y+2, M, newx, newy)
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+2, Y+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
520 LET FNchoosemove = FALSE
530 EXIT FUNCTION
540 END IF
550 LET X = newx
560 LET Y = newy
570 LET FNchoosemove = TRUE
580 END FUNCTION
590
600 EXTERNAL SUB PROCtrymove(X, Y, M, newx, newy)
610
620 DECLARE EXTERNAL FUNCTION FNvalidmove
630 IF FNvalidmove(X,Y) = 0 THEN EXIT SUB
640 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
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+2,Y+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 N>M THEN EXIT SUB
730 IF N=M AND RND<.5 THEN EXIT SUB
740 LET M = N
750 LET newx = X
760 LET newy = Y
770 END SUB
780
790 EXTERNAL FUNCTION FNvalidmove(X,Y)
800 IF X<0 OR X>7 OR Y<0 OR Y>7 THEN
810 LET FNvalidmove = FALSE
820 EXIT FUNCTION
830 END IF
840 IF Board(X,Y) = TRUE THEN
850 LET FNvalidmove = FALSE
860 ELSE
870 LET FNvalidmove = TRUE
880 END IF
890 END FUNCTION</lang>

=={{header|AutoHotkey}}==
=={{header|AutoHotkey}}==
{{libheader|GDIP}}
{{libheader|GDIP}}