Análisis de la situación del rey en ajedrez

Trabajo: Análisis de la situación del rey en ajedrez

El ajedrez es un juego de mesa para dos jugadores. Se juega sobre un tablero cuadriculado de 8×8 casillas, alternadas en colores blanco y negro, que constituyen las 64 posibles posiciones para el desarrollo del juego. Al principio del juego cada jugador tiene dieciséis piezas: un rey, una dama, dos alfiles, dos caballos, dos torres y 8 peones. Se trata de un juego de guerra en el que el objetivo es derrocar al rey del oponente. Esto se hace alcanzando la casilla que ocupa el rey con alguna de las piezas propias sin que el otro jugador pueda zafarse del ataque, en una jugada llamada jaque mate.

Las fichas

Las fichas en el juego de ajedrez son de seis tipos:

El rey: Es la ficha más importante del juego. El rey se puede mover una única casilla en cualquier dirección (horizontal, vertical o diagonal); siempre y cuando dicha casilla esté libre u ocupada por una ficha contraria, a la que captura, y no esté amenazada por ninguna ficha contraria.

La dama: Es la ficha con más libertad de movimientos en el juego. La dama se puede mover cualquier cantidad de casillas en cualquier dirección (horizontal, vertical o diagonal); siempre y cuando dicha casilla esté libre u ocupada por una ficha contraria, a la que captura, y todas las casillas de su recorrido estén libres. La dama no puede saltar por encima de ninguna ficha para realizar su movimiento.

La torre: Se puede mover cualquier cantidad de casillas en dirección horizontal o vertical; siempre y cuando dicha casilla esté libre u ocupada por una ficha contraria, a la que captura, y todas las casillas de su recorrido estén libres. La torre no puede saltar por encima de ninguna ficha para realizar su movimiento.

El alfil: Se puede mover cualquier cantidad de casillas en dirección diagonal; siempre y cuando dicha casilla esté libre u ocupada por una ficha contraria, a la que captura, y todas las casillas de su recorrido estén libres. El alfil no puede saltar por encima de ninguna ficha para realizar su movimiento.

El caballo: Se puede mover a cualquiera de las ocho casillas que se encuentran desplazándose dos casillas en una dirección no diagonal (horizontal o vertical) y después una casilla en la dirección no diagonal contraria (vertical u horizontal), describiendo una ‘L’; siempre y cuando dicha casilla esté libre u ocupada por una ficha contraria a la que captura. El caballo es la única ficha que puede saltar por encima de otras fichas para realizar su movimiento.

El peón: Es la ficha más débil del juego. El peón se puede mover de tres formas distintas:

  • Una única casilla en dirección vertical hacia el campo contrario (los blancos hacia arriba y los negros hacia abajo); siempre y cuando dicha casilla esté libre.

  • Dos casillas en dirección vertical hacia el campo contrario en su primer movimiento (desde la segunda fila para los blancos y desde la septima fila para los negros); siempre y cuando las dos casillas que avanza esté libres.
  • Una única casilla en diagonal hacia el campo contrario (los blancos hacia arriba y los negros hacia abajo); siempre y cuando dicha casilla esté ocupada por una ficha contraria, a la que captura.

No se consideran movimientos que dependan del desarrollo previo de la partida tales como enroque entre rey y torre, o captura del peón al paso.

La situación del rey

La situación del rey en una posición de ajedrez es fundamental para identificar el final de la partida. El rey puede estar en alguno de los siguientes estados:

  • Libre: El rey no está amenazado por ninguna pieza contraria

  • En jaque: El rey está amenazado por una o varias piezas contrarias, pero puede librarse de la amenaza de alguna de las siguientes formas:
    • Capturando la pieza atacante
    • Interponiendo una pieza entre la pieza atacante y el rey
    • Moviendo el rey a una casilla que no esté amenazada
  • En jaque mate: El rey está amenazado por una o varias piezas contrarias y no puede librarse de dicha amenaza
  • Ahogado: El rey está libre, pero es la única pieza que se puede mover y todas las casillas a las que se puede mover están amenazadas por piezas contrarias

Objetivos del trabajo

El trabajo consiste en implementar un sistema de producción en CLIPS que analice la situación del rey negro en una posición de ajedrez. El programa debe identificar si el rey negro está libre, en jaque, en jaque mate o ahogado. Además, en el caso en que el rey negro esté en jaque, debe indicar todas las formas que tiene de librarse de dicho estado.

Para ello se proporciona un fichero ejemplos.txt que contiene 20 posiciones de ajedrez con el siguiente formato:

# 01 Rey libre
--t-----
--pTP-pp
--p-----
p---rpC-
--D---c-
d-----P-
P---PP-P
------R-

Donde la primera línea tiene que comenzar con # y contiene una descripción de la posición (procedencia, tipología o dificultad) y las restantes 8 líneas se corresponden con las filas del tablero de ajedrez, donde una letra indica la presencia de una ficha y el símbolo - indica que la casilla correspondiente está vacía. Cada ficha está representada con su inicial (R – rey, D – dama, T – torre, A – alfil, C – caballo, P – peón) que será mayúscula para las fichas blancas y minúscula para las fichas negras.

También se proporciona un fichero base ajedrez.clp en el que se definen los siguientes constructores:

  • Una plantilla ficha para almacenar la información sobre las fichas del juego:

    (deftemplate ficha
      (slot fila)
      (slot columna)
      (slot tipo
            (type SYMBOL)
            (allowed-symbols rey dama torre alfil caballo peon))
      (slot color
            (type SYMBOL)
            (allowed-symbols blanco negro)))
    
    • Los campos fila y columna sirven para almacenar los números de fila y columna en los que se encuentra la ficha.
    • El campo tipo sirve para almacenar el tipo de ficha.
    • El campo color sirve para almacenar el color de la ficha.
  • La regla ajedrez-numero y las funciones tipo-ficha, color-ficha y lee-ajedrez sirven para cargar un ejemplo desde el fichero ejemplos.txt
    (deffunction tipo-ficha (?v)
      (switch ?v
              (case "R" then rey)
              (case "r" then rey)
              (case "D" then dama)
              (case "d" then dama)
              (case "T" then torre)
              (case "t" then torre)
              (case "A" then alfil)
              (case "a" then alfil)
              (case "C" then caballo)
              (case "c" then caballo)
              (case "P" then peon)
              (case "p" then peon)))
    
    (deffunction color-ficha (?v)
      (if (member$ ?v (create$ "R" "D" "T" "A" "C" "P"))
          then blanco
          else negro))
    
    (deffunction lee-ajedrez (?n)
      (open "ejemplos.txt" data "r")
      (loop-for-count (?i 1 (- ?n 1))
        (loop-for-count (?j 1 10) (readline data)))
      (readline data)
      (loop-for-count (?i 1 8 )
        (bind ?fila (readline data))
        (loop-for-count (?j 1 8 )
          (bind ?v (sub-string ?j ?j ?fila))
          (if (not (eq ?v "-"))
              then (assert (ficha (fila ?i)
                                  (columna ?j)
                                  (tipo (tipo-ficha ?v))
                                  (color (color-ficha ?v)))))))
      (close data))
    
    (defrule ajedrez-numero
      (declare (salience 50))
      =>
      (printout t "Que problema quieres analizar (1-20): ")
      (lee-ajedrez (read))
      (assert (imprime)))
    
    • La regla ajedrez-numero tiene prioridad 50 para asegurar que se ejecuta antes que las reglas que analizan la situación del rey negro.
    • La regla ajedrez-numero evalúa una llamada a la función lee-ajedrez que carga todos los datos de la posición que se haya escogido como ejemplo.
  • Las reglas imprime-tablero, imprime-casilla-libre e imprime-casilla-ocupada, que junto con la función imprime-ficha sirven para imprimir en pantalla la posición que se ha escogido como ejemplo.
    (defrule imprime-tablero
      (declare (salience 50))
      ?h <- (imprime)
      =>
      (printout t "+-+-+-+-+-+-+-+-+" t)
      (retract ?h)
      (assert (imprime 1 1)))
    
    (deffunction imprime-ficha (?t ?c)
      (switch ?t
          (case rey then (if (eq ?c blanco) then "R" else "r"))
          (case dama then (if (eq ?c blanco) then "D" else "d"))
          (case torre then (if (eq ?c blanco) then "T" else "t"))
          (case alfil then (if (eq ?c blanco) then "A" else "a"))
          (case caballo then (if (eq ?c blanco) then "C" else "c"))
          (case peon then (if (eq ?c blanco) then "P" else "p"))))
    
    (defrule imprime-casilla-libre
      (declare (salience 50))
      ?h <- (imprime ?i ?j)
      (not (ficha (fila ?i) (columna ?j)))
      =>
      (retract ?h)
      (if (= ?j 1) then (printout t "|"))
      (printout t " |")
      (if (= ?j 8 )
          then (printout t t "+-+-+-+-+-+-+-+-+" t)
               (if (< ?i 8 ) then (assert (imprime (+ ?i 1) 1)))
          else (assert (imprime ?i (+ ?j 1)))))
    
    (defrule imprime-casilla-ocupada
      (declare (salience 50))
      ?h <- (imprime ?i ?j)
      (ficha (fila ?i) (columna ?j) (tipo ?t) (color ?c))
      =>
      (retract ?h)
      (if (= ?j 1) then (printout t "|"))
      (printout t (imprime-ficha ?t ?c))
      (printout t "|")
      (if (= ?j 8 )
          then (printout t t "+-+-+-+-+-+-+-+-+" t)
               (if (< ?i 8 ) then (assert (imprime (+ ?i 1) 1)))
          else (assert (imprime ?i (+ ?j 1)))))
    

Observaciones

  • Puede ser conveniente determinar que casillas del tablero se encuentran amenazadas por alguna pieza
  • Ninguna pieza, salvo el caballo, puede moverse saltando por encima de otras piezas
  • El peón es la única pieza que amenaza casillas a las que no puede moverse y se mueve a casillas que no amenaza
  • Para librarse de un jaque doble en el que dos piezas distintas amenazan al rey, éste debe moverse a una casilla no amenazada

Ejemplos

A continuación se muestran algunos ejemplos de cómo debería funcionar el programa pedido

Rey libre

Que problema quieres analizar (1-20): 1
+-+-+-+-+-+-+-+-+
| | |t| | | | | |
+-+-+-+-+-+-+-+-+
| | |p|T|P| |p|p|
+-+-+-+-+-+-+-+-+
| | |p| | | | | |
+-+-+-+-+-+-+-+-+
|p| | | |r|p|C| |
+-+-+-+-+-+-+-+-+
| | |D| | | |c| |
+-+-+-+-+-+-+-+-+
|d| | | | | |P| |
+-+-+-+-+-+-+-+-+
|P| | | |P|P| |P|
+-+-+-+-+-+-+-+-+
| | | | | | |R| |
+-+-+-+-+-+-+-+-+
- El rey está libre

Rey en jaque

Que problema quieres analizar (1-20): 15
+-+-+-+-+-+-+-+-+
| | |t| | | | | |
+-+-+-+-+-+-+-+-+
| | |p|P|T| |p|p|
+-+-+-+-+-+-+-+-+
| | |p| | | | | |
+-+-+-+-+-+-+-+-+
|p| | | |r|p|C| |
+-+-+-+-+-+-+-+-+
| | |D| | | |c| |
+-+-+-+-+-+-+-+-+
|d| | | | | |P| |
+-+-+-+-+-+-+-+-+
|P| | | |P|P| |P|
+-+-+-+-+-+-+-+-+
| | | | | | |R| |
+-+-+-+-+-+-+-+-+
- El rey está en jaque - Opciones:
-- Mover el rey negro de f4c5 a f3c4
-- Mover el rey negro de f4c5 a f4c6
-- Mover la dama negra de f6c1 a f2c5 capturando la torre blanca

Rey en jaque mate

Que problema quieres analizar (1-20): 2
+-+-+-+-+-+-+-+-+
| | |T| | | | |r|
+-+-+-+-+-+-+-+-+
| | | | | |p|p|p|
+-+-+-+-+-+-+-+-+
| | | | | | | | |
+-+-+-+-+-+-+-+-+
| | | | | | | | |
+-+-+-+-+-+-+-+-+
| | |R| | | | | |
+-+-+-+-+-+-+-+-+
| | | | | | | | |
+-+-+-+-+-+-+-+-+
| | | | | | | | |
+-+-+-+-+-+-+-+-+
| | | | | | | | |
+-+-+-+-+-+-+-+-+
- El rey está en jaque mate

Rey ahogado

Que problema quieres analizar (1-20): 14
+-+-+-+-+-+-+-+-+
| | | | | | | | |
+-+-+-+-+-+-+-+-+
| |T| | | |p| | |
+-+-+-+-+-+-+-+-+
| | | | |r|P| | |
+-+-+-+-+-+-+-+-+
|T| | | | | |P| |
+-+-+-+-+-+-+-+-+
| | | | | | | | |
+-+-+-+-+-+-+-+-+
| | | | | | | | |
+-+-+-+-+-+-+-+-+
| | | | | | | | |
+-+-+-+-+-+-+-+-+
| | | |D| | |R| |
+-+-+-+-+-+-+-+-+
- El rey está ahogado

Deja un comentario

Tienes que iniciar sesión para escribir un comentario.