87 lines
2.4 KiB
Text
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
|