Professional Documents
Culture Documents
Práctica de LEX
ChessLex
Nombre de Autores:
● Ángel Jesús Martínez Bernal
● Rafael Jesús Sánchez Santos
INDICE
1.Objetivo de la practica.
2.1.Tablero.
2.1.1.Tablero_Aleatorio(num_piezas,tipo_situación);
2.1.2.Tablero_Aleatorio(num_piezasB,ratioBN,tipo_situación);
2.1.3.Agregar_Pieza(tipo,color,ubicación);
2.1.4.Situar_Pieza(origen,destino);
2.1.5.Eliminar_Pieza(ubicación);
2.1.6.Eliminar_Pieza(tipo,color);
2.2.Juego.
2.2.1.Movimiento_Jugador_B(origen,destino);
2.2.2.Movimiento_Jugador_N(origen,destino);
2.2.3.Estado(fich);
2.2.4.Lista_Movimientos();
3.Consideraciones Generales.
3.1.Jaque
3.2.Jaque Mate
3.3.Ahogado
3.4.Cambio de pieza
● El desarrollo del juego de ajedrez tendrá dos partes fundamentales: la que define la
disposición inicial de las piezas y aquella que permite el juego propiamente dicho.
● La orientación del tablero supondrá una ubicación original de las piezas blancas en
las filas (1,c) y (2,c), y una ubicación original de las piezas negras en las filas (7,c) y (8,c)
siendo c una columna cualquiera. La casilla (1,1) será de color negro.
2.1.Tablero
2.1.1.Tablero_Aleatorio(num_piezas,tipo_situación);
Crea una disposición inicial en el tablero con num_piezas piezas para cada jugador. La
disposición será la original del ajedrez si tipo_situación toma el valor original o aleatoria si
tipo_situación toma el valor aleatoria. El máximo número de piezas permitido para cada jugador es
de 16: 8 peones, 2 torres, 2 alfiles (1 por color), 2 caballos, 1 rey y 1 reina. El rey es imprescindible.
No se admiten peones blancos en la fila (8,c) ni peones negros en la fila (1,c), siendo c cualquier
columna. El rey no podrá estar en jaque, en cuyo caso se moverá a la casilla más próxima posible
que no viole este supuesto.
2.1.2.Tablero_Aleatorio(num_piezasB,ratioBN,tipo_situacion);
Crea una disposición inicial en el tablero con num_piezasB piezas blancas. Para conocer el
número de piezas negras a disponer se proporciona el ratio ratioBN aproximado entre el número de
piezas blancas y el número de piezas negras. La disposición será la original del ajedrez si
tipo_situacion toma el valor original o aleatoria si tipo_situacion toma el valor aleatoria. El máximo
número de piezas permitido para cada jugador es de 16: 8 peones, 2 torres, 2 alfiles (1 por color), 2
caballos, 1 rey y 1 reina. El rey es imprescindible. No se admiten peones blancos en la fila (8,c) ni
peones negros en la fila (1,c), siendo c cualquier columna. El rey no podrá estar en jaque, en cuyo
caso se moverá a la casilla más próxima posible que no viole este supuesto.
2.1.3.Agregar_Pieza(tipo,color,ubicacion);
2.1.4.Situar_Pieza(origen,destino);
2.1.5.Eliminar_Pieza(ubicacion);
2.1.6.Eliminar_Pieza(tipo,color);
Elimina una pieza de tipo tipo y color color. El rey es imprescindible. El rey no podrá estar
en jaque, en cuyo caso se moverá tal rey a la casilla más próxima posible que no viole este
supuesto.
2.2.Juego.
2.2.1.Movimiento_Jugador_B(origen,destino);
2.2.2.Movimiento_Jugador_N(origen,destino);
Generará un informe de la partida en el fichero de nombre fich.chs (el nombre fich podrá
comenzar por subrayado o letra y puede estar seguido de cualquier número de caracteres
alfanuméricos o subrayados) que contendrá la disposición actual en el tablero de los distintas piezas
y el estado actual de la partida (piezas capturadas por cada oponente y situación de amenaza: jaque,
jaque-mate o ahogado). Si fich es stdout el informe se generará por pantalla.
2.2.4.Lista_Movimientos();
Presenta un informe por pantalla de la lista de movimientos realizados por ambos jugadores
para el último tablero definido.
3.Consideraciones Generales
3.1.Jaque
Se dice que un rey se encuentra en jaque cuando, tras mover el jugador contrario, se ve
amenazado por una pieza contraria. Cuando un rey se encuentra en jaque es necesario evitarlo, si es
posible, en el siguiente movimiento:
a) Moviendo el rey.
b) Capturando la pieza que supone la amenaza.
c) Disponiendo una pieza propia que evite el jaque.
3.2.Jaque Mate
3.3.Ahogado
Se dice que un rey está ahogado cuando, tras mover el jugador contrario, en su
casilla actual no se siente amenazado pero sí en sus posibles movimientos, y las
demás piezas no pueden mover tampoco.
3.4.Cambio de pieza
Si un peón llega a la casilla final: (8,c) para las blancas y (1,c) para las negras,
se cambia por otra pieza cualquiera distinta a sí mismo.
4.Explicación del código en C
4.1.Archivos .h
4.1.1. Juego.h
#ifndef JUEGO_H
#define JUEGO_H
int moverBlancas(TABLERO* tablero, int ofila, int oclumna, int dfila, int dcolumna);
int moverNegras(TABLERO* tablero, int ofila, int oclumna, int dfila, int dcolumna);
void estado(TABLERO* tablero,char * fichero);
void imprimirMovimientos(TABLERO *tablero);
int moverPieza(TABLERO* tablero, int ofila, int ocolumna, int dfila, int dcolumna);
#endif
4.1.2. Tablero.h
En este archivo “Tablero.h” se incluyen junto a las cabeceras de las funciones que se han
utilizado en el archivo “Tablero.c”, la declaración de enumeraciones utilizadas para el COLOR y
TIPO_PIEZA de la ajedrez y tres estructuras que son FICHA y TABLERO y LISTA. Ahora
pasaremos a explicar cada una de estas declaraciones:
4.1.2.1. Enumeraciones
Estos campos han sido creados para definir el COLOR y el TIPO_PIEZA de ajedrez.
El color se utiliza para distinguir entre piezas blancas y negras y diferenciar en el tablero de
ajedrez las casillas blancas,negras y vacías.
El tipo de pieza se utiliza para distinguir entre los tipos de piezas que existen en el juego de
ajedrez, como son peón,torre,caballo,dama,alfil y rey.
Las enumeraciones son:
typedef enum
{
VACIO=0,BLANCAS, NEGRAS
}COLOR;
typedef enum
{
LIBRE=0,PEON,TORRE,CABALLO,ALFIL,DAMA,REY
}TIPO_PIEZA;
4.1.2.2. Estructuras
Las estructuras que se han empleado son FICHA, TABLERO y LISTA. La estructura
FICHA contiene dos campos que son las dos enumeraciones que creamos anteriormente, ya que así
definimos el tipo de ficha y qué color es.
Por otro lado, la estructura TABLERO posee como campo una matriz de ocho por ocho de
tipo FICHA ( estructura anterior ) que será el tablero de ajedrez, también tiene dos vectores de
fichas de 15 elementos cada uno, donde se almacenarán las piezas comidas blancas o negras, según
el nombre del vector.
La estructura LISTA es creada para la creación de la lista de movimientos.
Las estructuras son:
En el fichero “tablero.c” hemos utilizado una serie de funciones, de las cuales aquí se
encuentran sus cabeceras:
4.2 Archivos.c
4.2.1. Juego.c
En este archivo encontramos los cuerpos de las cabeceras de las funciones que hemos
comentado en el archivo “juego.h”. En esta parte, encontramos funciones de movimiento de pieza
como son:
int moverPieza(TABLERO* tablero, int ofila, int ocolumna, int dfila, int dcolumna);
int moverPeon(TABLERO* tablero,int ofila,int ocolumna,int dfila,int dcolumna);
int moverTorre(TABLERO* tablero,int ofila,int ocolumna,int dfila,int dcolumna);
int moverCaballo(TABLERO* tablero,int ofila,int ocolumna,int dfila,int dcolumna);
int moverAlfil(TABLERO* tablero,int ofila,int ocolumna,int dfila,int dcolumna);
int moverDama(TABLERO* tablero,int ofila,int ocolumna,int dfila,int dcolumna);
int moverRey(TABLERO* tablero,int ofila,int ocolumna,int dfila,int dcolumna);
int moverBlancas(TABLERO* tablero, int ofila, int oclumna, int dfila, int dcolumna);
int moverNegras(TABLERO* tablero, int ofila, int oclumna, int dfila, int dcolumna);
También encontramos las funciones siguientes, que son funciones dedicadas al estado de la
partida y la lista de movimientos, es decir, toda la información que se pueda dar de la partida a los
jugadores.
4.2.1.1 moverPeon
4.2.1.2. moverTorre
Esta función es más simple que la de moverPeon, puesto que en esta sólo se debe realizar el
movimiento de la Torre, que es en horizontal o vertical. Esta función a su vez debe realizar la
comida de piezas que se encuentren en su camino,comprobar que no hay piezas en su
camino,puesto que no las puede saltar.
4.2.1.3 moverCaballo
Esta función realiza el movimiento del caballo, en el cual tiene de especial que no importa
que existan piezas en su trayectoria puesto que podrá saltarlas y llegar a la casilla de destino. Se ha
implementado haciendo que se pueda mover una fila y dos columnas o viceversa.
4.2.1.4. moverAlfil
Esta función tiene como misión mover la pieza DAMA al lugar donde el usuario elija,
siempre comprobando que ese movimiento esta permitido, que no haya otra pieza en el lugar en el
que se desea mover..etc. El movimiento de la dama es como si uniéramos el movimiento de la pieza
TORRE y ALFIL, es decir, horizontal, vertical y en diagonal.
4.2.1.6. moverRey
La función moverRey realiza el movimiento de la ficha REY de una casilla a otra. Esta
función es de las mas simples, puesto que solo se realiza el movimiento de la pieza, y cuándo no se
ha movido se puede enrocar y mover dos posiciones.
4.2.1.7. moverPieza
Esta función la utilizamos para generalizar el movimiento, es decir, que cuando el usuario
elija una casilla donde halla una pieza para mover, esta función detecte esa pieza, llame a su función
correspondiente ( Ejem: si es un Peón llame a moverPeon ) y realice el movimiento. También tiene
como misión detectar que no mueve a una casilla donde exista una pieza de su mismo color y que
no se selecciona para mover una casilla en la que no existe una pieza, y que al mover dicha pieza el
rey propio no quede en jaque.
4.2.1.8. Enroque
El enroque consiste en mover simultáneamente el rey y la torre del mismo bando. Para ellos
creamos un tablero auxiliar y trabajamos sobre él para realizar sobre el las diferentes
comprobaciones.
TABLERO aux=*tablero;
Comprueba si se ha movido el rey y/o las torres con las que se va a enrocar y si se cumplen las
condiciones para enrocarse se enroca el rey.
Esta función come al paso a otro peón, su comprobación si se puede comer al paso o no se
hace en la función moverPeon.
4.2.1.10. Ahogado
4.2.1.11. Jaque
La función jaque devolverá el número de piezas que lo hacen estar en jaque. Para ello
vamos comprobando alrededor de la casilla de donde esta situado el rey si hay alguna pieza de color
contrario que pueda comer al rey. Comprobamos en horizontal y vertical, en las cuales las únicas
piezas que ponen en peligro al rey serían las damas y las torres. Comprobamos en diagonal, en las
cuales las únicas piezas que lo ponen en peligro son los peones, alfiles y damas. Comprobamos los
caballos respecto a la posición del rey para ver si existe un caballo de color contrario al rey que
pueda comer al rey. En cada comprobación, si se cumple que ponen en jaque al rey, se va
incrementando la variable “jaque” la cual se devolverá dando el número de piezas que dan jaque.
Esta función es muy parecida a la anterior, solamente que en esta comprobamos que el rey
esta en jaque y no se puede librar de el. Para comprobar que no se puede librar de el, hay que mirar
que no existe ninguna pieza que se pueda comer a la pieza que le da jaque al rey, ni que el rey se
pueda desplazar para librarse del jaque, ni que se pueda interponer una pieza entre el movimiento de
la pieza que da jaque al rey.
4.2.1.13. Estado
Esta función realiza una copia a un fichero de como se encuentra la partida en ese momento.
En el fichero informara de lo siguiente:
● Piezas Blancas y Negras comidas.
● Si se produce en el momento actual jaque a algún rey.
● Si se produce en el momento actual jaque-mate a algún color.
● Si se produce en el momento actual ahogamiento a algún color.
Esta función sólo realiza la muestra por pantalla de los movimientos que realizan las piezas
blancas y negras, muestran la casilla de origen y la casilla destino.
Esta función tiene como misión el insertar un movimiento en la lista de movimientos creada
anteriormente.
4.2.2. Tablero.c
En este archivo encontramos los cuerpos de las funciones cuyas cabeceras colocamos en
“tablero.h”.
4.2.2.1 Imprimir Tablero
El acceso a tablero en dos bucles, t[-(i-8)][j-1]; solo para cuando i y j son introducidas por el
usuario, sino se recorrerá como una matriz normal de C .
Para imprimir el tablero se recorre “tablero” con ds bucles for y se va comprobando que
cuando haya una pieza, por ejemplo peón se imprima una P. Para distinguir las piezas blancas de las
negras se imprimirá la letra con dos asteriscos, ejemplo * P *.
4.2.2.2 Imprimir TableroN
Esta función hace exactamente lo mismo que la anterior solo que le da la vuelta al tablero
para que el jugador de piezas negras pueda visualizar mejor el tablero.
Crea una disposición inicial en el tablero con num_piezas piezas para cada jugador. La
disposición será la original del ajedrez si tipo_situacion toma el valor original o aleatoria si
tipo_situacion toma el valor aleatoria. El máximo número de piezas permitido para cada jugador es
de 16: 8 peones, 2 torres, 2 alfiles (1 por color), 2 caballos, 1 rey y 1 reina. El rey es imprescindible.
No se admiten peones en las fila (8,c) ni en (1,c), siendo c cualquier columna. Las piezas se
introducirán sin dar jaque a los reyes.
Crea una disposición inicial en el tablero con num_piezasB piezas blancas. Para conocer el
número de piezas negras a disponer se proporciona el ratio ratioBN aproximado entre el número de
piezas blancas y el número de piezas negras. La disposición será la original del ajedrez si
tipo_situación toma el cero o aleatoria si tipo_situación toma otro valor. El máximo número de
piezas permitido para cada jugador es de 16: 8 peones, 2 torres, 2 alfiles (1 por color), 2 caballos, 1
rey y 1 reina. El rey es imprescindible. No se admiten en las filas (8,c) y (1,c), siendo c cualquier
columna. Las piezas se introducirán sin dar jaque a los reyes.
Esta función tiene como misión agregar un tipo de pieza al tablero donde el usuario elija. El
usuario decide el tipo de pieza, el color y la casilla en la que desea insertar la pieza. Para ello le
pasamos a la función el tablero, el tipo de pieza, el color, la fila de la casilla a insertar y la columna.
Esta función antes de insertar la pieza, comprueba que se puede introducir, mirando que no va a
rebasar el máximo de piezas sobre el tablero, que no puede haber mas de un rey del mismo
color...etc.
Cabe destacar de esta función, que si al agregar la pieza el rey queda en jaque la agrega, ya
que luego la usaremos para moverPieza, donde se puede dar jaque a los reyes y/o comer piezas.
Esta función es exactamente igual que la anterior, solamente que no importa que el rey
quede en jaque al introducir la pieza.
Esta función realiza el movimiento de las piezas sin seguir las reglas del ajedrez, es decir, podemos
mover las piezas como deseemos que no tendremos ninguna restricción. Es una función similar a
moverPieza solo que moverPieza sigue las reglas del ajedrez.
4.2.2.8 Eliminar Pieza
Esta función consiste en eliminar una determinada pieza elegida por el usuario del tablero. En la
función, trabajamos en un tablero auxiliar para comprobar que al eliminar la pieza el rey no quede
en jaque.
Las definiciones regulares siguientes significan que los nombres de la izquierda pueden tomar los
valores de la derecha:
espacio [ \t\n]
Tabulador y salto de linea
espacios {espacio}+
Sucesión de espacios
fila [1-8]
El valor fila puede tomar desde 1 a 8 ambos incluidos
columna [1-8]
El valor columna puede tomar desde 1 a 8 ambos incluidos
dígito [0-9]
El valor dígito toma desde 0 a 9 ambos incluidos
letra [a-zA-Z]
Letra toma valor de la 'a' a la 'z' incluido en mayúsculas
carácter ["_""-""!""#""%""¡""+""*"]
Carácter puede tomar los siguientes caracteres (-_!#%¡+*)
alfanumérico {letra}|{dígito}|{carácter}|\_
Alfanumérico puede tomar el valor de letra,dígito o carácter.
Ratio [01]+\.[0-9]*
Valores comprendidos entre 0 y 1.99, solo se usaran dos decimales
numeroPiezas 1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16
numeroPiezas puede ser 1 o 2 o 3...o 16.
casilla {espacios}*\[{espacios}*{fila}{espacios}*\,
{espacios}*{columna}{espacios}*\]{espacios}*
color BLANCAS|NEGRAS
El color puede ser blancas o negras
disposicion original|aleatoria|ORIGINAL|ALEATORIA|aleatorio|ALEATORIO
La disposición puede tomar los valores que hay a derecha, “original”, “aleatoria”,
“ORIGINAL”, “ALEATORIA”, “aleatorio” y “ALEATORIO”.
tipo PEON|TORRE|CABALLO|ALFIL|DAMA|REY
Tipo define el tipo de ficha y pueden ser PEON, TORRE, CABALLO...
fichero (\_|{letra})({alfanumerico}*)
El fichero puede comenzar por subrayado o letra y luego cualquier número de
caracteres alfanuméricos.
TABLERO_ALEATORIO"("{numeroPiezas}","{disposición}")"
TABLERO_ALEATORIO"("{numeroPiezas}","{ratio}","{disposición}")"
AGREGAR_PIEZA"("{tipo}","{color}","{casilla}")"
SITUAR_PIEZA"("{casilla}","{casilla}")"
ELIMINAR_PIEZA"("{casilla}")"
ELIMINAR_PIEZA"("{tipo}","{color}")"
MOVIMIENTO_JUGADOR_N"("{casilla}","{casilla}")"
ESTADO"("{fichero}")"
LISTA_MOVIMIENTOS"("")"
^ver_tableroB
^ver_tableroN
^inicio_tablero
Indica que se pueden usar las funciones que dependen del tablero.
^fin_tablero
Indica que se dejan de poder usar las funciones que dependen del
tablero.
^inicio_juego
^fin_juego
Indica que se dejan de poder usar las funciones que dependen del
tablero.
5.3 Consideraciones
● Las casillas se introducirán entre corchetes, por ejemplo: la casilla cuya fila es
2 y columna 3, se pondrá de la siguiente manera: [2,3].
● Las reglas se podrán poner tanto en mayúsculas como en minúsculas ya que se
compila con la opción -i.
● Las definiciones regulares siempre tienen que conservar su nomenclatura de
mayúsculas y minúsculas.
● No se pueden poner espacios en las reglas, ya que no las cumplirían.