RosettaCodeData/Task/Knights-tour/QuickBASIC/knights-tour.basic
2026-04-30 12:34:36 -04:00

87 lines
2.4 KiB
Text

' Knight's tour
DECLARE FUNCTION ChooseMove% (X1 AS INTEGER, Y1 AS INTEGER)
DECLARE SUB TryMove (BYVAL X AS INTEGER, BYVAL Y AS INTEGER, M AS INTEGER, NewX AS INTEGER, NewY AS INTEGER)
DECLARE FUNCTION ValidMove% (X AS INTEGER, Y AS INTEGER)
RANDOMIZE TIMER
CONST TRUE% = -1, FALSE% = 0
SCREEN 7
WINDOW (1, 1)-(512, 512)
COLOR 15, 0 ' white foreground, black background
DIM X AS INTEGER, Y AS INTEGER, Total AS INTEGER
DIM SX AS INTEGER, SY AS INTEGER, SW AS INTEGER
DIM Board(0 TO 7, 0 TO 7) AS INTEGER
SW = 512 \ 8
FOR X = 0 TO 6 STEP 2
SX = X * SW
FOR Y = 0 TO 6 STEP 2
SY = Y * SW
'filled boxes
LINE (SX + SW, SY + SW)-(SX + 2 * SW, SY + 2 * SW), , BF
LINE (SX, SY)-(SX + SW, SY + SW), , BF
NEXT Y
NEXT X
X = 0
Y = 0
Board(X, Y) = TRUE%
PSET (X * SW + SW \ 2, Y * SW + SW \ 2), 12
Total = 1
DO WHILE ChooseMove%(X, Y)
Board(X, Y) = TRUE%
LINE -(X * SW + SW \ 2, Y * SW + SW \ 2), 12
Total = Total + 1
LOOP
IF Total <> 64 THEN STOP
END
FUNCTION ChooseMove% (X1 AS INTEGER, Y1 AS INTEGER)
' X1, Y1 are returned
DIM M AS INTEGER, NewX AS INTEGER, NewY AS INTEGER
M = 9
CALL TryMove(X1 + 1, Y1 + 2, M, NewX, NewY)
CALL TryMove(X1 + 1, Y1 - 2, M, NewX, NewY)
CALL TryMove(X1 - 1, Y1 + 2, M, NewX, NewY)
CALL TryMove(X1 - 1, Y1 - 2, M, NewX, NewY)
CALL TryMove(X1 + 2, Y1 + 1, M, NewX, NewY)
CALL TryMove(X1 + 2, Y1 - 1, M, NewX, NewY)
CALL TryMove(X1 - 2, Y1 + 1, M, NewX, NewY)
CALL TryMove(X1 - 2, Y1 - 1, M, NewX, NewY)
IF M = 9 THEN
ChooseMove% = FALSE%
ELSE
X1 = NewX
Y1 = NewY
ChooseMove% = TRUE%
END IF
END FUNCTION
SUB TryMove (BYVAL X AS INTEGER, BYVAL Y AS INTEGER, M AS INTEGER, NewX AS INTEGER, NewY AS INTEGER)
' M, NewX, NewY are returned
N = 0
IF ValidMove%(X, Y) THEN
IF ValidMove%(X + 1, Y + 2) THEN N = N + 1
IF ValidMove%(X + 1, Y - 2) THEN N = N + 1
IF ValidMove%(X - 1, Y + 2) THEN N = N + 1
IF ValidMove%(X - 1, Y - 2) THEN N = N + 1
IF ValidMove%(X + 2, Y + 1) THEN N = N + 1
IF ValidMove%(X + 2, Y - 1) THEN N = N + 1
IF ValidMove%(X - 2, Y + 1) THEN N = N + 1
IF ValidMove%(X - 2, Y - 1) THEN N = N + 1
IF (N < M) OR (N = M AND RND >= .5) THEN
M = N
NewX = X
NewY = Y
END IF
END IF
END SUB
FUNCTION ValidMove% (X AS INTEGER, Y AS INTEGER)
SHARED Board() AS INTEGER
IF X < 0 OR X > 7 OR Y < 0 OR Y > 7 THEN
ValidMove% = FALSE%
ELSE
ValidMove% = NOT (Board(X, Y))
END IF
END FUNCTION