RosettaCodeData/Task/Knights-tour/ANSI-BASIC/knights-tour.basic
2026-02-01 16:33:20 -08:00

81 lines
2.4 KiB
Text

100 DECLARE EXTERNAL FUNCTION choosemove
100 DECLARE EXTERNAL FUNCTION ChooseMove
110 !
120 RANDOMIZE
130 PUBLIC NUMERIC X, Y, TRUE, FALSE
140 LET TRUE = -1
150 LET FALSE = 0
160 !
170 SET WINDOW 1, 512, 1, 512
180 SET AREA COLOR "black"
190 LET SW = 512 / 8 ! Width of square
200 FOR X = 0 TO 6 STEP 2
210 LET SX = X * SW
220 FOR Y = 0 TO 6 STEP 2
230 LET SY = Y * SW
240 PLOT AREA: SX + SW, SY; SX + 2 * SW, SY; SX + 2 * SW, SY + SW; SX + SW, SY + SW
250 PLOT AREA: SX, SY + SW; SX + SW, SY + SW; SX + SW, SY + 2 * SW; SX, SY + 2 * SW
260 NEXT Y
270 NEXT X
280 !
290 SET LINE COLOR "red"
300 SET LINE WIDTH 6
310 !
320 PUBLIC NUMERIC Board(0 TO 7, 0 TO 7)
330 LET X = 0
340 LET Y = 0
350 LET Total = 0
360 DO
370 LET Board(X, Y) = TRUE
380 PLOT LINES: X * SW + 32, Y * SW + 32;
390 LET Total = Total + 1
400 LOOP UNTIL ChooseMove(X, Y) = FALSE
410 IF Total <> 64 THEN STOP
420 END
430 !
440 EXTERNAL FUNCTION ChooseMove(X1, Y1)
450 DECLARE EXTERNAL SUB TryMove
460 LET M = 9
470 CALL TryMove(X1 + 1, Y1 + 2, M, NewX, NewY)
480 CALL TryMove(X1 + 1, Y1 - 2, M, NewX, NewY)
490 CALL TryMove(X1 - 1, Y1 + 2, M, NewX, NewY)
500 CALL TryMove(X1 - 1, Y1 - 2, M, NewX, NewY)
510 CALL TryMove(X1 + 2, Y1 + 1, M, NewX, NewY)
520 CALL TryMove(X1 + 2, Y1 - 1, M, NewX, NewY)
530 CALL TryMove(X1 - 2, Y1 + 1, M, NewX, NewY)
540 CALL TryMove(X1 - 2, Y1 - 1, M, NewX, NewY)
550 IF M = 9 THEN
560 LET ChooseMove = FALSE
570 ELSE
580 LET X = NewX
590 LET Y = NewY
600 LET ChooseMove = TRUE
610 END IF
620 END FUNCTION
630 !
640 EXTERNAL SUB TryMove(X, Y, M, NewX, NewY)
650 !
660 DECLARE EXTERNAL FUNCTION ValidMove
670 IF ValidMove(X, Y) <> 0 THEN
680 IF ValidMove(X + 1, Y + 2) <> 0 THEN LET N = N + 1
690 IF ValidMove(X + 1, Y - 2) <> 0 THEN LET N = N + 1
700 IF ValidMove(X - 1, Y + 2) <> 0 THEN LET N = N + 1
710 IF ValidMove(X - 1, Y - 2) <> 0 THEN LET N = N + 1
720 IF ValidMove(X + 2, Y + 1) <> 0 THEN LET N = N + 1
730 IF ValidMove(X + 2, Y - 1) <> 0 THEN LET N = N + 1
740 IF ValidMove(X - 2, Y + 1) <> 0 THEN LET N = N + 1
750 IF ValidMove(X - 2, Y - 1) <> 0 THEN LET N = N + 1
760 IF N < M OR (N = M AND RND >= .5) THEN
770 LET M = N
780 LET NewX = X
790 LET NewY = Y
800 END IF
810 END IF
820 END SUB
830 !
840 EXTERNAL FUNCTION ValidMove(X, Y)
850 LET ValidMove = FALSE
860 IF X >= 0 AND X <= 7 AND Y >= 0 AND Y <= 7 THEN
870 IF Board(X, Y) = FALSE THEN LET ValidMove = TRUE
880 END IF
890 END FUNCTION