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 |
||
⚫ | |||
! REPEAT WAIT 1 : UNTIL FALSE |
|||
390 |
|||
⚫ | |||
⚫ | |||
EXTERNAL |
410 DECLARE EXTERNAL SUB PROCtrymove |
||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
CALL PROCtrymove(X+1, Y |
440 CALL PROCtrymove(X+1, Y-2, M, newx, newy) |
||
CALL PROCtrymove(X |
450 CALL PROCtrymove(X-1, Y+2, M, newx, newy) |
||
CALL PROCtrymove(X-1, Y |
460 CALL PROCtrymove(X-1, Y-2, M, newx, newy) |
||
CALL PROCtrymove(X |
470 CALL PROCtrymove(X+2, Y+1, M, newx, newy) |
||
CALL PROCtrymove(X+2, Y |
480 CALL PROCtrymove(X+2, Y-1, M, newx, newy) |
||
CALL PROCtrymove(X |
490 CALL PROCtrymove(X-2, Y+1, M, newx, newy) |
||
CALL PROCtrymove(X-2, Y |
500 CALL PROCtrymove(X-2, Y-1, M, newx, newy) |
||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
550 LET X = newx |
|||
⚫ | |||
LET |
560 LET Y = newy |
||
LET |
570 LET FNchoosemove = TRUE |
||
⚫ | |||
LET FNchoosemove = TRUE |
|||
590 |
|||
⚫ | |||
⚫ | |||
610 |
|||
EXTERNAL SUB PROCtrymove(X, Y, M, newx, newy) |
|||
620 DECLARE EXTERNAL FUNCTION FNvalidmove |
|||
630 IF FNvalidmove(X,Y) = 0 THEN EXIT SUB |
|||
IF FNvalidmove(X,Y) |
640 IF FNvalidmove(X+1,Y+2) <> 0 THEN LET N = N + 1 |
||
IF FNvalidmove(X+1,Y |
650 IF FNvalidmove(X+1,Y-2) <> 0 THEN LET N = N + 1 |
||
IF FNvalidmove(X |
660 IF FNvalidmove(X-1,Y+2) <> 0 THEN LET N = N + 1 |
||
IF FNvalidmove(X-1,Y |
670 IF FNvalidmove(X-1,Y-2) <> 0 THEN LET N = N + 1 |
||
IF FNvalidmove(X |
680 IF FNvalidmove(X+2,Y+1) <> 0 THEN LET N = N + 1 |
||
IF FNvalidmove(X+2,Y |
690 IF FNvalidmove(X+2,Y-1) <> 0 THEN LET N = N + 1 |
||
IF FNvalidmove(X |
700 IF FNvalidmove(X-2,Y+1) <> 0 THEN LET N = N + 1 |
||
IF FNvalidmove(X-2,Y |
710 IF FNvalidmove(X-2,Y-1) <> 0 THEN LET N = N + 1 |
||
IF |
720 IF N>M THEN EXIT SUB |
||
IF N |
730 IF N=M AND RND<.5 THEN EXIT SUB |
||
⚫ | |||
IF N=M AND RND<.5 THEN EXIT SUB |
|||
LET |
750 LET newx = X |
||
LET |
760 LET newy = Y |
||
⚫ | |||
⚫ | |||
780 |
|||
⚫ | |||
790 EXTERNAL FUNCTION FNvalidmove(X,Y) |
|||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
=={{header|AutoHotkey}}== |
=={{header|AutoHotkey}}== |