SCREEN 0 'Pantalla de texto
WIDTH 40 'Ancho 40
DEFINT A-Z 'Variables enteras
DIM C(64, 15, 7) 'Casilla de origen,direccion y distancia
DIM IX(15), IY(15) 'Incremento segun direccion
DIM D(7), E(7, 15), H(64, 15, 7) 'Direcciones, direccion para pieza y distancia
DIM A(64, 2) 'Tipo, bando y pieza en casilla (0vacia,1PB,2PN,3R,4C,5A,6T,7D)
DIM B(9, 4, 2) 'Control de jugada (real o simulada)
DIM N(2, 16) 'Situacion de pieza por bando
DIM S(200, 4), M(9, 4) 'Jugadas posibles
DIM V(15), V1(4), V2(4) 'Control simulacion
DIM X(64), Y(64) 'Coordenadas para casillas
DIM R(2), K(64) 'Casilla rey y control torres
DIM I(2), F(64), A$(7, 2) 'Tinta, fondo y caracter pieza
DIM J(9, 200) 'Jugadas permitidas
FOR E = 0 TO 15 'Direcciones posibles,del 8 al 15 para el caballo
READ IX(E), IY(E) 'Incremento segun direccion
NEXT
FOR A = 0 TO 7 'Tipo de pieza
READ A$(A, 0), A$(A, 1), A$(A, 2) 'Casillas de 3X3 ASCII
READ D(A) 'Numero de direcciones segun tipo de pieza
FOR D = 1 TO D(A)
READ E(A, D) 'Direccion
NEXT D, A
FOR T = 1 TO 2 'Bando
TT = 2 * T - 1
V1(TT) = TT + 1
V2(TT + 1) = TT
R(T) = 56 * T - 51 'Casilla rey de inicio
K(R(T) - 4) = 7 'Control para enroque
K(R(T) + 3) = 3 '(Direccion)
FOR P = 1 TO 16 'Pieza
READ A 'Tipo de pieza
N = 48 * T - 48 + P 'Casilla inicial segun bando
A(N, 0) = A 'Tipo de pieza en casilla
A(N, 1) = T 'Bando
A(N, 2) = P 'Pieza para casilla
N(T, P) = N 'Casilla para pieza
NEXT P, T
I(0) = 7 'Tinta neutra
I(1) = 7 'Tinta blancas
I(2) = 0 'Tinta negras
FOR N = 1 TO 64 'Casillas del tablero
Y = INT((N - 1) / 8) 'Fila
X = N - 1 - 8 * Y 'Columna
IF F = 1 THEN F = 5 ELSE F = 1 'Alterna fondo
F(N) = F 'Fondo de casilla
Y(N) = 1 + 3 * (7 - Y) 'Fila para casilla
X(N) = 1 + 3 * X 'Columna
GOSUB 1100 'Plasmar en pantalla
IF X = 7 THEN F = F(N - 1) 'Primera columna, repite fondo
FOR E = 0 TO 15 'Total de direcciones
H = 0
IX = IX(E) 'Incremento segun direccion
IY = IY(E)
XX = X + 1 'Copia coordenadas
YY = Y
100 XX = XX + IX 'Incremento
YY = YY + IY
IF XX < 1 OR XX > 8 OR YY < 0 OR YY > 7 GOTO 200
'Salta si supera los limites del tablero
H = H + 1
C(N, E, H) = XX + 8 * YY 'Casilla destino segun direccion y distancia
IF E < 8 GOTO 100
200 FOR A = 1 TO 7 * SGN(H) 'Si hay distancia
FOR D = 1 TO D(A)
IF E=E(A, D) THEN H(N, E, A)=H:IF A < 4 THEN H(N, E, A)=1 - (A < 3 AND D = 2 AND A(N, 0) = A)
'Ajusta distancia segun direccion y pieza (Peon al frente 2 inicial)
NEXT D, A, E, N
T = 2 'Turno
TT = 1
300 J = 4 'Control jaques
S = 0
J(4, 0) = 0
320 P(J) = 1 'Numero de pieza
340 NN(J) = N(T, P(J)) 'Casilla de la pieza
IF NN(J) = 0 GOTO 470 'Pieza capturada
AA(J) = A(NN(J), 0) 'Tipo de pieza
DD(J) = 1 'Direccion
360 EE(J) = E(AA(J), DD(J)) 'Direccion segun pieza
GG(J) = H(NN(J), EE(J), AA(J)) 'Alcance
IF GG(J) = 0 GOTO 460 'No hay alcance
G(J) = 1
380 CC(J) = C(NN(J), EE(J), G(J)) 'Casilla destino
IF A(CC(J), 1) = T GOTO 450 'Mismo bando
V(J) = 2 'Movimiento simple
M(J, 3) = 0 'Promocion y enroque
M(J, 4) = 0 'Enroque y al paso
IF AA(J) > 2 GOTO 400 'No es peon
IF DD(J) = 2 EQV A(CC(J), 0) = 0 GOTO 400 'Peon util
IF A(CC(J), 0) OR AA(J - 1) > 2 OR G(J - 1) < 2 OR J = 4 GOTO 450 'No evalua al paso
IF CC(J) = (NN(J - 1) + CC(J - 1)) / 2 THEN V(J) = 4: M(J, 4) = CC(J - 1) ELSE GOTO 450
400 IF A(CC(J), 0) = 3 GOTO 500 'Rey opuesto
IF J = 4 GOTO 450 'Profundidad 4 no se simula
M(J, 1) = NN(J) 'Simula origen
M(J, 2) = CC(J) 'Simula destino
IF AA(J) < 3 AND (CC(J) < 9 OR CC(J) > 56) THEN A(NN(J), 0) = 7: M(J, 3) = 7 'Promocion
410 IF J > 1 GOTO 420 'Enroque solo en nivel 1
IF AA(J)=3 AND G(J)=2 THEN V(J)=4:M(J,3)=M3:M(J,4)=(NN(J)+CC(J)) /2:IF A(CC(J),0) GOTO 460
J3 = 0 'Control mejor respuesta
J4 = 200
J(2, S) = 0 'Jugadas posibles
J(3, S) = 0 'Respuestas rivales
J(4, S) = 0 'Segunda jugada propia
420 FOR V = 1 TO V(J) 'Ejecuta jugada para simulacion
M = M(J, V)
N(A(M, 1), A(M, 2)) = M(J, V1(V))
FOR W = 0 TO 2 'Guarda tipo, bando y pieza
B(J, V, W) = A(M, W)
A(M, W) = B(J, V2(V), W)
NEXT W, V
J = J + 1 'Nivel siguiente de profundidad
SWAP T, TT 'Cambio de bando
GOTO 320
430 IF J(3, S) > J3 THEN J3 = J(3, S): IF J(4, S) < J4 THEN J4 = J(4, S) 'Guarda valor menor
J(4, S) = 0
440 IF AA(J) = A(NN(J), 0) GOTO 450
M(J, 3) = M(J, 3) - 1: IF M(J, 3) > 3 THEN A(NN(J), 0) = M(J, 3): GOTO 410 'Subpromocion
A(NN(J), 0) = AA(J)
450 IF A(CC(J), 0) GOTO 460 'Casilla ocupada
IF G(J) < GG(J) THEN G(J) = G(J) + 1: GOTO 380 'Alcance mas
460 IF DD(J) < D(AA(J)) THEN DD(J) = DD(J) + 1: GOTO 360 'Direccion mas
470 IF P(J) < 16 THEN P(J) = P(J) + 1: GOTO 340 'Pieza siguiente
J(J, S) = J(J, S) + 1 'No hay jaque
500 IF S = 0 THEN S = 1: J = 1: SWAP T, TT: GOTO 320 'Fin rey propio en jaque
IF J = 1 GOTO 600 'Fin busqueda de jugadas
J = J - 1 'Nivel menos
FOR V = 1 TO V(J) 'Recupera jugada simulada
M = M(J, V)
N(B(J, V, 1), B(J, V, 2)) = M
FOR W = 0 TO 2
A(M, W) = B(J, V, W)
NEXT W, V
SWAP T, TT
IF J = 2 GOTO 430
IF J = 3 GOTO 440
IF J(2, S) = 0 GOTO 440 'Hay jaque, jugada no valida
J(4, S) = J4 'Guarda valor menor
FOR V = 1 TO 4 'Valida jugada
S(S, V) = M(1, V)
NEXT
S = S + 1 'Aumenta jugadas posibles
IF AA(J) <> 3 OR NN(J) <> R(T) OR J(4, 0) = 0 GOTO 440 'Posibilita enroque
IF DD(J) = K(NN(J) + 3) THEN GG(J) = 2: M3 = NN(J) + 3
IF DD(J) = K(NN(J) - 4) AND A(NN(J) - 3, 0) = 0 THEN GG(J) = 2: M3 = NN(J) - 4
GOTO 450
600 SS = S
L = R(T) 'Casilla del rey en origen
610 COLOR 7, 0
LOCATE 47 - 23 * T, 26 'Bando en juego
PRINT SS - 1; " "; 'Total de jugadas
LOCATE 47 - 23 * TT, 26 'Bando rival
PRINT " ";
N = L 'Origen
A = A(N, 0)
F = F(N) 'Fondo
IF A(N, 1) = TT THEN F = I(A(N, 1))
COLOR F, I(T) 'Invierte tinta y fondo simulando cursor
GOSUB 1200 'Plasmar pieza
GOSUB 1000 'Lectura de teclado
IF A$ = CHR$(13) GOTO 620 'INTRO elige Origen
A$ = RIGHT$(A$, 1) 'Caracter derecho (Teclas de direccion =2 caracteres)
IF A$ = "M" AND L < 64 THEN L = L + 1
IF A$ = "K" AND L > 1 THEN L = L - 1
IF A$ = "H" AND L < 57 THEN L = L + 8
IF A$ = "P" AND L > 8 THEN L = L - 8
GOSUB 1100 'Plasmar casilla normal
GOTO 610 'Vuelve a cursor
620 S = 0 'Numero de movimiento
N = 0 'Control posible/no posible
630 S = S + 1 'Movimiento siguiente
IF S < SS GOTO 640 'Salta si esta en rango
IF N = 0 THEN GOTO 610 'La pieza elegida no se puede mover
GOTO 620 'Misma pieza
640 N1 = S(S, 1) 'Origen
IF N1 <> L GOTO 630 'No coincide con la elegida
N = S(S, 2) 'Destino
A = A(N1, 0) 'Tipo
IF A < 3 AND S(S, 3) THEN A = S(S, 3) 'Peon promociona
COLOR 7, 0
LOCATE 47 - 23 * TT, 26
PRINT J(3, S); " "; 'Jugadas rivales
LOCATE 47 - 23 * T, 30
IF J(3, S) THEN PRINT J(4, S); " "; ELSE PRINT " "; 'Mejor respuesta
COLOR I(T), 3 'Color de destino
GOSUB 1200 'Pieza elegida en destino
GOSUB 1000 'Cualquier tecla
GOSUB 1100 'Normaliza destino
IF A$ <> CHR$(13) GOTO 630 'INTRO confirma jugada
AA(0) = A(N1, 0)
IF AA(0) < 3 AND S(S, 3) THEN A(N1, 0) = S(S, 3) 'Promocion
NN(0) = N1 'Casilla origen
CC(0) = N 'Casilla destino
G(0) = ABS(N1 - N) / 8 'Control al paso
V(0) = 2
IF S(S, 4) THEN V(0) = 4
FOR V = 1 TO V(0) 'Simulacion
M = S(S, V) 'Casilla origen, destino y al paso
N(A(M, 1), A(M, 2)) = S(S, V1(V)) 'Pieza movida
FOR W = 0 TO 2
B(0, V, W) = A(M, W) 'Guarda tipo, bando y pieza
A(M, W) = B(0, V2(V), W) 'Destino
NEXT W, V
FOR V = 1 TO V(0)
N = S(S, V)
IF N THEN K(N) = 0: GOSUB 1100 'Plasmar o limpiar
NEXT
IF A = 3 AND R(T) = N1 THEN K(N1 + 3) = 0: K(N1 - 4) = 0 'Desactiva control enroque
GOTO 300
1000 IF INKEY$ <> "" GOTO 1000 'Lectura de teclado
1010 A$ = INKEY$
IF A$ = "" GOTO 1010
IF A$ = CHR$(27) THEN IF SS - 1 THEN GOSUB 1100: GOTO 610 ELSE RUN
'Si no hay movimiento legal ESC reinicia, si lo hay vuelve a cursor
RETURN
1100 A = A(N, 0) 'Tipo de pieza
COLOR I(A(N, 1)), F(N) 'Tinta del bando y fondo de casilla
1200 FOR YY = 0 TO 2
LOCATE Y(N) + YY, X(N) 'Coordenadas
PRINT A$(A, YY); 'Caracter 3X3
NEXT
RETURN
'Incremento segun direccion
DATA 0,1,1,1,1,0,1,-1,0,-1,-1,-1,-1,0,-1,1
DATA 1,2,2,1,2,-1,1,-2,-1,-2,-2,-1,-2,1,-1,2
'Piezas,numero de direcciones y direcciones
DATA " "," "," ",0
DATA " þ "
DATA " Û "
DATA " ß ",3,1,0,7
DATA " þ "
DATA " Û "
DATA " ß ",3,3,4,5
DATA " Å "
DATA "ÞÛÝ"
DATA "ÞÜÝ",8,0,1,2,3,4,5,6,7
DATA " Üþ"
DATA "þÛ "
DATA "Þ Ý",8,8,9,10,11,12,13,14,15
DATA " þ "
DATA " Û "
DATA "ÞßÝ",4,1,3,5,7
DATA "þþþ"
DATA "ÞÛÝ"
DATA " ß ",4,0,2,4,6
DATA "þÜþ"
DATA "ÞßÝ"
DATA "ÞÛÝ",8,0,1,2,3,4,5,6,7
'Tipo de piezas
DATA 6,4,5,7,3,5,4,6,1,1,1,1,1,1,1,1
DATA 2,2,2,2,2,2,2,2,6,4,5,7,3,5,4,6