Ajedrez prolog valida los movimientos
/**DEFINICION DE REGLAS DEL PROGRAMA**/
/*============================================================
MUEVE LAS PIEZAS DE AJEDRES.
LA REGLA SE PUEDE USAR DE VARIAS
FORMAS:
?- movimiento(alfil,(1,1),(3,3)).
yes
?- movimiento(alfil,(1,1),(3,2)).
no
?- movimiento(alfil,(3,3),Z).
Z = (1,1) ;
Z = (2,2) ;
Z = (4,4) ;
Z = (5,5) ;
Z = (6,6) ;
Z = (7,7) ;
Z = (8,8) ;
==============================================================*/
movimiento(X,Y,Z):-
/* Toma La Torre Si X Viene Vacía O
Si X Tiene Valor Mira Si Es Una Torre */
pieza1(X),
/* Mira Si La Posición Especificada
En Y Es Valida */
correcto(Y),
/* Mueve La Torre - Calcula Una
Nueva Posición */
movimiento_torre(Y,Z),
/* MIRA SI LA POSICION ESPECIFICADA EN Z ES VALIDA */
correcto(Z).
movimiento(X,Y,Z):-
/* Toma El Caballo Si X Viene Vacía
O Si X Tiene Valor Mira Si Es Un Caballo */
pieza2(X),
/* Mira Si La Posición Especificada
En Y Es Valida */
correcto(Y),
/* Mueve El Caballo - Calcula Una
Nueva Posición */
movimiento_caballo(Y,Z),
/* Mira Si La Posición Especificada
En Z Es Valida */
correcto(Z).
movimiento(X,Y,Z):-
/* Toma El Alfil Si X Viene Vacía O
Si X Tiene Valor Mira Si Es Un Alfil */
pieza3(X),
/* Mira Si La Posición Especificada
En Y Es Valida */
correcto(Y),
/* Mueve El Alfil - Calcula Una
Nueva Posición */
movimiento_alfil(Y,Z),
/* Mira Si La Posición Especificada
En Z Es Valida */
correcto(Z).
movimiento(X,Y,Z):-
/* Toma El Rey Si X Viene Vacía O Si
X Tiene Valor Mira Si Es El Rey */
pieza4(X),
/* Mira Si La Posición Especificada
En Y Es Valida */
correcto(Y),
/* Mueve El Rey - Calcula Una Nueva Posición
*/
movimiento_rey(Y,Z),
/* Mira Si La Posición Especificada En Z Es
Valida */
correcto(Z).
movimiento(X,Y,Z):-
/* Toma La Dama Si X Viene Vacía O
Si X Tiene Valor Mira Si Es Una Dama */
pieza5(X),
/* Mira Si La Posición Especificada
En Y Es Valida */
correcto(Y),
/* Mueve La Dama - Calcula Una Nueva
Posición */
movimiento_dama(Y,Z),
/* Mira Si La Posición Especificada
En Z Es Valida */
correcto(Z).
movimiento(X,Y,Z):-
/* Toma El Peón Si X Viene Vacía O
Si X Tiene Valor Mira Si Es Un Peón */
pieza6(X),
/* Mira Si La Posición Especificada
En Y Es Valida */
correcto(Y),
/* Mueve El Peón - Calcula Una Nueva
Posición */
movimiento_peon(Y,Z),
/* Mira Si La Posición
Especificada En Z Es Valida */
correcto(Z).
/*=========================================================
LISTA DE PREDICADOS CON LAS PIEZAS DE AJEDREZ
===========================================================*/
pieza1(torre).
pieza2(caballo).
pieza3(alfil).
pieza4(rey).
pieza5(dama).
pieza6(peon).
/*=============================================================
REVISA LA POSICION X,Y PARA VER SI ES VALIDA
============================================================*/
correcto((X,Y)):-
/* Mira Si El Valor De X Esta Entre
1 Y 8 */
between(1,8,X),
/* Mira Si El Valor De Y Esta Entre 1 Y 8 */
between(1,8,Y).
/*==============================================================
MIRA SI X ES DIFERENTE DE CERO
=============================================================*/
ok(X,_):-
X =\= 0.
ok(_,X):-
X =\= 0.
/*==============================================================
CALCULA UNA NUEVA POSICION PARA LA TORRE
============================================================*/
movimiento_torre((X1,Y1),(X2,Y2)):-
/* Asigna Valores A Z Entre -7 Y 7
*/
between(-7,7,Z),
/* Mira Que Z Sea Diferente De Cero
*/
ok(Z,0),
/* Mueve La Torre Por Las Xs
(Columnas) */
X2 is X1+Z,
/* No Mueve La Torres Por Las Ys (Filas) */
Y2 is Y1.
movimiento_torre((X1,Y1),(X2,Y2)):-
/* Asigna Valores A Z Entre -7 Y 7
*/
between(-7,7,Z),
/* Mira Que Z Sea Diferente De Cero
*/
ok(0,Z),
/* No Mueve La Torres Por Las Xs
(Columnas) */
X2 is X1,
/* Mueve La Torre Por Las Ys (Filas)
*/
Y2 is Y1+Z.
/*============================================================
HACE EL SALTO EN L DEL CABALLO
CALCULA VARIAS POSICIONES POSIBLES HACIENDO UN OR (;)
SI FALLA UNA TOMA LA SIGUIENTE
ES LO MISMO QUE TENER MULTIPLES REGLAS:
movimiento_caballo((X1,Y1),(X2,Y2))
============================================================*/
movimiento_caballo((X1,Y1),(X2,Y2)):-
/* Salta En L: 1 Salto Derecho + 2 Saltos Abajo*/
X2 is X1+1,Y2 is Y1+2;
/* Salta En L: 1 Salto Derecho + 2 Saltos Arriba*/
X2 is X1+1,Y2 is Y1-2;
/* Salta En L: 1 Salto Izquierdo + 2 Saltos Abajo */
X2 is X1-1,Y2 is Y1+2;
/* Salta En L: 1 Salto Izquierdo + 2 Saltos Arriba */
X2 is X1-1,Y2 is Y1-2;
/* Salta En L: 2 Saltos Derecha + 1 Salto Abajo */
X2 is X1+2,Y2 is Y1+1;
/* Salta En L: 2 Saltos Derecha + 1 Saltos Arriba */
X2 is X1+2,Y2 is Y1-1;
/* Salta En L: 2 Saltos Izquierda + 1 Saltos Abajo */
X2 is X1-2,Y2 is Y1+1;
/* Salta En L: 2 Saltos Izquierda + 1 Saltos Arriba */
X2 is X1-2,Y2 is Y1-1.
/*============================================================
MUEVE EL ALFIL POR LAS DIAGONALES
INCREMENTANDO LAS FILAS Y COLUMNAS AL MISMO TIEMPO
===========================================================*/
movimiento_alfil((X1,Y1),(X2,Y2)):-
/* Asigna Valores A Z Entre -7 Y 7
*/
between(-7,7,Z),
/* Mira Que Z Sea Diferente De Cero
*/
ok(Z,0),
/* Calcula La Nueva Posición En X
(Columnas) */
X2 is X1+Z,
/* Calcula La Nueva Posición En Y
(Filas) */
Y2 is Y1+Z.
/*==============================================================
MUEVE EL REY UNA CASILLA
============================================================*/
movimiento_rey((X1,Y1),(X2,Y2)):-
/* Asigna Valores A Z Entre -1 Y 1 */
between(-1,1,Z),
/* Asigna Valores A T Entre -1 Y 1 */
between(-1,1,T),
/* Mira Que Z Y T Sean Diferentes De Cero */
ok(Z,T),
/* Calcula La Nueva Posición En X (Columnas) */
X2 is X1+Z,
/* Calcula La Nueva Posición En Y (Filas) */
Y2 is Y1+T.
/*=============================================================
MUEVE LA DAMA POR FILAS, COLUMNAS O EN DIAGONAL
=============================================================*/
movimiento_dama(X,Y):-
/* La Dama Se Mueve Como Una Torre (Filas Y Columnas) */
movimiento_torre(X,Y).
movimiento_dama(X,Y):-
/* LA DAMA SE MUEVE COMO UN ALFIL (DIAGONALES) */
movimiento_alfil(X,Y).
/*=============================================================
MUEVE EL PEON UNA CASILLA HACIA ADELANTE
=============================================================*/
movimiento_peon((X1,Y1),(X2,Y2)):-
/* Sigue En La Misma X (Columnas) */
X2 is X1,
/* Incrementa La Y En Una Casilla (Filas) */
Comentarios