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)   */
Y2 is Y1+1.

Comentarios

ALEJANDRO ROMERO ha dicho que…
Excelente Lógica me sirvió de mucho para un proyecto de la universidad..!!! saludos y gracias por compartir el conocimiento
Unknown ha dicho que…
Me podría ayudar, Como podría representar el tablero? Gracias
Unknown ha dicho que…
Jhon lograste representarlo en le tablero?
jorjuela ha dicho que…
Hola que pena había dejado esto de lado que necesitan?

Entradas populares