LEVEL = 0
MAXLEVEL = 5
DATA -500,0,0,0,0,0,0,-7500 BOARD(X, Y) = Z
A = -1
RESULT = 0
PRINT " SIMPLE CHESS ENDINGS : CHECKMATE WITH KING AND ROOK VS KING" PRINT " In this game, you play White with only a King and I play Black " PRINT " with King and Rook. I will try to checkmate you within 50 moves." PRINT " To move the pieces on the chessboard, type in your move in " PRINT " coordinate notation, e.g. E2E3 . To exit the game, type QUIT." PRINT " Press any key to continue." SCORE = 0
CALL IO
(A
, B
, X
, Y
, RESULT
) RESULT = EVALUATE(-1, 10000)
A = BESTA(1)
B = BESTB(1)
X = BESTX(1)
Y = BESTY(1)
LEVEL = LEVEL + 1
BESTSCORE = 10000 * ID
CALL MOVELIST
(A
, B
, XX
(), YY
(), NDX
) X = XX(I)
Y = YY(I)
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
LEVEL = LEVEL - 1
EVALUATE = BESTSCORE
BOARD(B, A) = MOVER
BOARD(Y, X) = TARGET
SCORE = OLDSCORE
LEVEL = LEVEL - 1
EVALUATE = BESTSCORE
CALL MOVELIST
(A
, B
, XX
(), YY
(), NDX
) X = XX(I)
Y = YY(I)
PRINT "YOU ARE IN CHECK!" INCHECK = 1
INCHECK = 0
SUB IO
(A
, B
, X
, Y
, RESULT
) PIECE = BOARD(Y, X)
CALL MAKEMOVE
(A
, B
, X
, Y
) NULL = INCHECK(0)
B
= 8 - (ASC(MID$(IN$
, 2, 1)) - 48) Y
= 8 - (ASC(MID$(IN$
, 4, 1)) - 48) IF BOARD
(B
, A
) = 100 AND BOARD
(Y
, X
) = 0 AND BOARD
(Y
+ 1, X
) = -100 THEN MOVER = BOARD(B, A)
TARGET = BOARD(Y, X)
CALL MAKEMOVE
(A
, B
, X
, Y
) BOARD(Y + 1, X) = 0
ENPASSANT = -1
CALL MOVELIST
(A
, B
, XX
(), YY
(), NDX
) MOVER = BOARD(B, A)
TARGET = BOARD(Y, X)
INTFLAG = -1
CALL MAKEMOVE
(A
, B
, X
, Y
) INTFLAG = 0
BOARD(B, A) = MOVER
BOARD(Y, X) = TARGET
SUB KING
(A
, B
, XX
(), YY
(), NDX
) NDX = NDX + 1
XX(NDX) = A + DX
YY(NDX) = B + DY
SUB MAKEMOVE
(A
, B
, X
, Y
) BOARD(Y, X) = BOARD(B, A)
BOARD(B, A) = 0
SUB MOVELIST
(A
, B
, XX
(), YY
(), NDX
) NDX = -1
IF PIECE
= 500 THEN CALL ROOK
(A
, B
, XX
(), YY
(), NDX
) ELSE CALL KING
(A
, B
, XX
(), YY
(), NDX
)
SUB ROOK
(A
, B
, XX
(), YY
(), NDX
) NDX = NDX + 1
XX(NDX) = X
YY(NDX) = B
NDX = NDX + 1
XX(NDX) = X
YY(NDX) = B
NDX = NDX + 1
XX(NDX) = A
YY(NDX) = Y
NDX = NDX + 1
XX(NDX) = A
YY(NDX) = Y
COLOUR = 2
CALL SQUARE
(3 * A
+ 31, 2 * B
+ 5, COLOUR
)
IF BOARD
(B
, A
) < 0 THEN BACK
= 0 IF BOARD
(B
, A
) > 0 THEN BACK
= 7 FORE = 7 - BACK + FLAG
FORE = BACK + -1 * (FLAG > 0)
N$ = " "
IF PIECE
= 5000 OR PIECE
= 7500 THEN N$
= "K" LOCATE 2 * B
+ 5 - (BOARD
(B
, A
) > 0), 3 * A
+ 30
MT$ = MT$ + MT$ + MT$