DECLARE SUB IO
(A
, B
, X
, Y
, RESULT
)
DECLARE SUB KNIGHT
(A
, B
, XX
(), YY
(), NDX
)
DECLARE SUB KING
(A
, B
, XX
(), YY
(), NDX
)
DECLARE SUB QUEEN
(A
, B
, XX
(), YY
(), NDX
)
DECLARE SUB ROOK
(A
, B
, XX
(), YY
(), NDX
)
DECLARE SUB BISHOP
(A
, B
, XX
(), YY
(), NDX
)
DECLARE SUB MOVELIST
(A
, B
, XX
(), YY
(), NDX
)
DECLARE SUB PAWN
(A
, B
, XX
(), YY
(), NDX
)
DECLARE FUNCTION EVALUATE
(ID
, PRUNE
)
DIM SHARED BESTA
(0
TO 7
), BESTB
(0
TO 7
), BESTX
(0
TO 7
), BESTY
(0
TO 7
)
CFLAG = 0
LEVEL = 0
MAXLEVEL = 5
DATA -500
,-270
,-300
,-900
,-7500
,-300
,-270
,-500
DATA -100
,-100
,-100
,-100
, -100
,-100
,-100
,-100
DATA 0
, 0
, 0
, 0
, 0
, 0
, 0
, 0
DATA 0
, 0
, 0
, 0
, 0
, 0
, 0
, 0
DATA 0
, 0
, 0
, 0
, 0
, 0
, 0
, 0
DATA 0
, 0
, 0
, 0
, 0
, 0
, 0
, 0
DATA 100
, 100
, 100
, 100
, 100
, 100
, 100
, 100
DATA 500
, 270
, 300
, 900
, 5000
, 300
, 270
, 500
FOR X = 0 TO 7
FOR Y = 0 TO 7
BOARD(X, Y) = Z
NEXT Y
NEXT X
A = -1
RESULT = 0
DO
SCORE = 0
CALL IO(A, B, X, Y, RESULT)
CALL SHOWBD
RESULT = EVALUATE(-1, 10000)
A = BESTA(1)
B = BESTB(1)
X = BESTX(1)
Y = BESTY(1)
LOOP
SUB BISHOP (A, B, XX(), YY(), NDX)
FOR DXY = 1 TO 7
X = A - DXY
Y = B + DXY
GOSUB 3
IF BOARD
(Y
, X
) THEN EXIT FOR
NEXT
FOR DXY = 1 TO 7
X = A + DXY
Y = B + DXY
GOSUB 3
IF BOARD
(Y
, X
) THEN EXIT FOR
NEXT
FOR DXY = 1 TO 7
X = A - DXY
Y = B - DXY
GOSUB 3
IF BOARD
(Y
, X
) THEN EXIT FOR
NEXT
FOR DXY = 1 TO 7
X = A + DXY
Y = B - DXY
GOSUB 3
IF BOARD
(Y
, X
) THEN EXIT FOR
NEXT
3 REM
IF ID
<> SGN(BOARD
(Y
, X
)) THEN
NDX = NDX + 1
XX(NDX) = X
YY(NDX) = Y
RETURN
FUNCTION EVALUATE (ID, PRUNE)
DIM XX
(0
TO 26
), YY
(0
TO 26
)
LEVEL = LEVEL + 1
BESTSCORE = 10000 * ID
FOR B = 7 TO 0 STEP -1
FOR A = 7 TO 0 STEP -1
IF SGN(BOARD
(B
, A
)) <> ID
THEN GOTO 1
IF (LEVEL = 1) THEN CALL SHOWMAN(A, B, 8)
CALL MOVELIST(A, B, XX(), YY(), NDX)
FOR I = 0 TO NDX
X = XX(I)
Y = YY(I)
IF LEVEL = 1 THEN
CALL SHOWMAN(X, Y, 8)
OLDSCORE = SCORE
MOVER = BOARD(B, A)
TARGET = BOARD(Y, X)
CALL MAKEMOVE(A, B, X, Y)
IF (LEVEL
< MAXLEVEL
) THEN SCORE
= SCORE
+ EVALUATE
(-ID
, BESTSCORE
- TARGET
+ ID
* (8
- ABS(4
- X
) - ABS(4
- Y
)))
SCORE
= SCORE
+ TARGET
- ID
* (8
- ABS(4
- X
) - ABS(4
- Y
))
IF (ID
< 0
AND SCORE
> BESTSCORE
) OR (ID
> 0
AND SCORE
< BESTSCORE
) THEN
BESTA(LEVEL) = A
BESTB(LEVEL) = B
BESTX(LEVEL) = X
BESTY(LEVEL) = Y
BESTSCORE = SCORE
IF (ID
< 0
AND BESTSCORE
>= PRUNE
) OR (ID
> 0
AND BESTSCORE
<= PRUNE
) THEN
BOARD(B, A) = MOVER
BOARD(Y, X) = TARGET
SCORE = OLDSCORE
IF (LEVEL = 1) THEN CALL SHOWMAN(X, Y, 0)
IF (LEVEL = 1) THEN CALL SHOWMAN(A, B, 0)
LEVEL = LEVEL - 1
EVALUATE = BESTSCORE
BOARD(B, A) = MOVER
BOARD(Y, X) = TARGET
SCORE = OLDSCORE
IF (LEVEL = 1) THEN CALL SHOWMAN(X, Y, 0)
1 NEXT
IF (LEVEL = 1) THEN CALL SHOWMAN(A, B, 0)
NEXT
NEXT
LEVEL = LEVEL - 1
EVALUATE = BESTSCORE
FUNCTION INCHECK (X)
DIM XX
(0
TO 26
), YY
(0
TO 26
), NDX
FOR B = 0 TO 7
FOR A = 0 TO 7
IF BOARD(B, A) >= 0 THEN GOTO 6
CALL MOVELIST(A, B, XX(), YY(), NDX)
FOR I = 0 TO NDX STEP 1
X = XX(I)
Y = YY(I)
IF BOARD(Y, X) = 5000 THEN
PRINT "YOU ARE IN CHECK!"
INCHECK = 1
NEXT
6 NEXT
NEXT
INCHECK = 0
SUB IO (A, B, X, Y, RESULT)
DIM XX
(0
TO 26
), YY
(0
TO 26
)
IF A >= 0 THEN
IF RESULT < -2500 THEN
PIECE = BOARD(Y, X)
CALL MAKEMOVE(A, B, X, Y)
IF PIECE THEN
IF PIECE
= 100
THEN PRINT "PAWN"
IF PIECE
= 270
THEN PRINT "KNIGHT"
IF PIECE
= 300
THEN PRINT "BISHOP"
IF PIECE
= 500
THEN PRINT "ROOK"
IF PIECE
= 900
THEN PRINT "QUEEN"
IF PIECE
= 5000
THEN PRINT "KING"
NULL = INCHECK(0)
DO
CALL SHOWBD
IF UCASE$(IN$
) = "O-O" OR IN$
= "0-0" THEN
IF CFLAG THEN GOTO 16
IF BOARD(7, 7) <> 500 THEN GOTO 16
IF BOARD
(7
, 6
) OR BOARD
(7
, 5
) THEN GOTO 16
BOARD(7, 6) = 5000
BOARD(7, 4) = 0
BOARD(7, 5) = 500
BOARD(7, 7) = 0
CFLAG = 1
IF UCASE$(IN$
) = "O-O-O" OR IN$
= "0-0-0" THEN
IF CFLAG THEN GOTO 16
IF BOARD(7, 0) <> 500 THEN GOTO 16
IF BOARD
(7
, 1
) OR BOARD
(7
, 2
) OR BOARD
(7
, 3
) THEN GOTO 16
BOARD(7, 2) = 5000
BOARD(7, 4) = 0
BOARD(7, 3) = 500
BOARD(7, 0) = 0
CFLAG = 1
IF LEN(IN$
) < 5
THEN GOTO 16
B
= 8
- (ASC(MID$(IN$
, 2
, 1
)) - 48
)
Y
= 8
- (ASC(MID$(IN$
, 5
, 1
)) - 48
)
IF B
> 7
OR B
< 0
OR A
> 7
OR A
< 0
OR X
> 7
OR X
< 0
OR Y
> 7
OR Y
< 0
THEN GOTO 16
IF BOARD(B, A) <= 0 THEN GOTO 16
CALL MOVELIST(A, B, XX(), YY(), NDX)
FOR K = 0 TO NDX STEP 1
IF X
= XX
(K
) AND Y
= YY
(K
) THEN
MOVER = BOARD(B, A)
TARGET = BOARD(Y, X)
CALL MAKEMOVE(A, B, X, Y)
IF INCHECK
(0
) = 0
THEN EXIT SUB
BOARD(B, A) = MOVER
BOARD(Y, X) = TARGET
GOTO 16
NEXT
LOOP
SUB KING (A, B, XX(), YY(), NDX)
FOR DY = -1 TO 1
IF B
+ DY
< 0
OR B
+ DY
> 7
THEN GOTO 12
FOR DX = -1 TO 1
IF A
+ DX
< 0
OR A
+ DX
> 7
THEN GOTO 11
IF ID
<> SGN(BOARD
(B
+ DY
, A
+ DX
)) THEN
NDX = NDX + 1
XX(NDX) = A + DX
YY(NDX) = B + DY
11 NEXT
12 NEXT
SUB KNIGHT (A, B, XX(), YY(), NDX)
X = A - 1
Y = B - 2
GOSUB 5
X = A - 2
Y = B - 1
GOSUB 5
X = A + 1
Y = B - 2
GOSUB 5
X = A + 2
Y = B - 1
GOSUB 5
X = A - 1
Y = B + 2
GOSUB 5
X = A - 2
Y = B + 1
GOSUB 5
X = A + 1
Y = B + 2
GOSUB 5
X = A + 2
Y = B + 1
GOSUB 5
5
IF X
< 0
OR X
> 7
OR Y
< 0
OR Y
> 7
THEN RETURN
IF ID
<> SGN(BOARD
(Y
, X
)) THEN NDX
= NDX
+ 1: XX
(NDX
) = X: YY
(NDX
) = Y
RETURN
SUB MAKEMOVE (A, B, X, Y)
BOARD(Y, X) = BOARD(B, A)
BOARD(B, A) = 0
IF Y
= 0
AND BOARD
(Y
, X
) = 100
THEN BOARD
(Y
, X
) = 900
IF Y
= 7
AND BOARD
(Y
, X
) = -100
THEN BOARD
(Y
, X
) = -900
SUB MOVELIST (A, B, XX(), YY(), NDX)
NDX = -1
IF PIECE = 100 THEN
CALL PAWN(A, B, XX(), YY(), NDX)
ELSEIF PIECE = 270 THEN CALL KNIGHT(A, B, XX(), YY(), NDX)
ELSEIF PIECE = 300 THEN CALL BISHOP(A, B, XX(), YY(), NDX)
ELSEIF PIECE = 500 THEN CALL ROOK(A, B, XX(), YY(), NDX)
ELSEIF PIECE = 900 THEN CALL QUEEN(A, B, XX(), YY(), NDX)
ELSE CALL KING(A, B, XX(), YY(), NDX)
SUB PAWN (A, B, XX(), YY(), NDX)
IF (A
- 1
) >= 0
AND (A
- 1
) <= 7
AND (B
- ID
) >= 0
AND (B
- ID
) <= 7
THEN
IF SGN(BOARD
((B
- ID
), (A
- 1
))) = -ID
THEN
NDX = NDX + 1
XX(NDX) = A - 1
YY(NDX) = B - ID
IF (A
+ 1
) >= 0
AND (A
+ 1
) <= 7
AND (B
- ID
) >= 0
AND (B
- ID
) <= 7
THEN
IF SGN(BOARD
((B
- ID
), (A
+ 1
))) = -ID
THEN
NDX = NDX + 1
XX(NDX) = A + 1
YY(NDX) = B - ID
IF A
>= 0
AND A
<= 7
AND (B
- ID
) >= 0
AND (B
- ID
) <= 7
THEN
IF BOARD((B - ID), A) = 0 THEN
NDX = NDX + 1
XX(NDX) = A
YY(NDX) = B - ID
IF (ID
< 0
AND B
= 1
) OR (ID
> 0
AND B
= 6
) THEN
IF BOARD((B - ID - ID), A) = 0 THEN
NDX = NDX + 1
XX(NDX) = A
YY(NDX) = B - 2 * ID
SUB QUEEN (A, B, XX(), YY(), NDX)
CALL BISHOP(A, B, XX(), YY(), NDX)
CALL ROOK(A, B, XX(), YY(), NDX)
SUB ROOK (A, B, XX(), YY(), NDX)
FOR X = A - 1 TO 0 STEP -1
IF ID
<> SGN(BOARD
(B
, X
)) THEN
NDX = NDX + 1
XX(NDX) = X
YY(NDX) = B
IF (BOARD
(B
, X
)) THEN EXIT FOR
NEXT
FOR X = A + 1 TO 7 STEP 1
IF ID
<> SGN(BOARD
(B
, X
)) THEN
NDX = NDX + 1
XX(NDX) = X
YY(NDX) = B
IF (BOARD
(B
, X
)) THEN EXIT FOR
NEXT
FOR Y = B - 1 TO 0 STEP -1
IF ID
<> SGN(BOARD
(Y
, A
)) THEN
NDX = NDX + 1
XX(NDX) = A
YY(NDX) = Y
IF (BOARD
(Y
, A
)) THEN EXIT FOR
NEXT
FOR Y = B + 1 TO 7 STEP 1
IF ID
<> SGN(BOARD
(Y
, A
)) THEN
NDX = NDX + 1
XX(NDX) = A
YY(NDX) = Y
IF (BOARD
(Y
, A
)) THEN EXIT FOR
NEXT
SUB SHOWBD
COLOR 7, 0
FOR K = 0 TO 25
COLOR 6, 0
NEXT
FOR B = 0 TO 7
COLOR 7, 0
COLOR 6, 0
COLOR 6, 0
FOR A = 0 TO 7
COLOUR = 8
ELSE COLOUR = 12
CALL SQUARE(3 * A + 31, 2 * B + 5, COLOUR)
NEXT
COLOR 6, 0
COLOR 6, 0
COLOR 7, 0
NEXT
FOR K = 0 TO 25
COLOR 6, 0
NEXT
COLOR 7, 0
FOR B = 0 TO 7
FOR A = 0 TO 7
CALL SHOWMAN(A, B, 0)
NEXT
NEXT
COLOR 7, 0
SUB SHOWMAN (A, B, FLAG)
IF BOARD(B, A) < 0 THEN BACK = 0
IF BOARD(B, A) > 0 THEN BACK = 7
FORE = 7 - BACK + FLAG
IF BOARD(B, A) = 0 THEN
IF (A
+ B
) AND 1
THEN BACK
= 8
ELSE BACK
= 12
FORE = BACK - (FLAG > 0)
N$ = " "
IF PIECE
= 0
THEN N$
= CHR$(219
)
IF PIECE = 100 THEN N$ = "P"
IF PIECE = 270 THEN N$ = "N"
IF PIECE = 300 THEN N$ = "B"
IF PIECE = 500 THEN N$ = "R"
IF PIECE = 900 THEN N$ = "Q"
IF PIECE
= 5000
OR PIECE
= 7500
THEN N$
= "K"
LOCATE 2
* B
+ 5
- (BOARD
(B
, A
) > 0
), 3
* A
+ 30
COLOR FORE, BACK
COLOR 7, 0
SUB SQUARE (A, B, C)
MT$ = MT$ + MT$ + MT$
COLOR C, C
COLOR C, C
COLOR 7, 0