Ingeniería del Conocimiento (2021-22)

Honestidad académica y copias

Un trabajo práctico es un examen, por lo que debe realizarse de manera individual. La discusión y el intercambio de información de carácter general con los compañeros se permite (e incluso se recomienda), pero NO AL NIVEL DE CÓDIGO. Igualmente el remitir código de terceros, OBTENIDO A TRAVÉS DE LA RED o cualquier otro medio, se considerará plagio.

Cualquier plagio o compartición de código que se detecte, significará automáticamente la calificación de CERO EN LA ASIGNATURA para TODOS los alumnos involucrados. Por tanto, a estos alumnos NO se les conservará, para futuras convocatorias, ninguna nota que hubiesen obtenido hasta el momento, SIN PERJUICIO DE OTRAS MEDIDAS DE CARÁCTER DISCIPLINARIO QUE SE PUDIERAN TOMAR.

Estrategias para el juego Reversi/Othello en CLIPS

El Reversi, también conocido como Othello o Yang, es un juego de tablero de dos jugadores. Ambos jugadores juegan con un mismo conjunto de 64 fichas, que tienen caras de distinto color: blanco y negro. Según la cara mostrada de cada ficha podremos hablar de fichas blancas o fichas negras, y cada uno de esos colores se asocia a cada uno de los jugadores, que realizan movimientos de forma alternada sobre el tablero. El tablero de juego es cuadrado y está dividido en 8 filas y 8 columnas, lo que hace un total de 64 casillas. En los tableros de Othello los escaques no están coloreados, como ocurre en el ajedrez.

La situación inicial del tablero es la que se muestra en la siguiente imagen, en la que ya hay situadas cuatro fichas en las casillas centrales del tablero:

Empezando por el jugador que lleve las fichas negras, los jugadores deben realizar un movimiento por turno, a menos que no puedan hacer ninguno, pasando en ese caso el turno al jugador contrario. Cada movimiento consiste en colocar una ficha que atrape una o varias fichas del color contrario para después voltearlas de forma que pasen a mostrar el color propio. Las fichas quedan atrapadas si forman una línea continua horizontal, vertical o diagonal de fichas del mismo color situadas entre otras dos del color contrario (una es una ficha que ya estaba colocada en el tablero y la otra debe ser la recién colocada).

Veamos los movimientos posibles en el siguiente tablero:

El jugador blanco puede colocar en las siguientes posiciones:

  • La casilla (2,D), desde la que se atrapa la ficha negra situada en la casilla (3,D), en una línea vertical.
  • La casilla (3,E), desde la que se atrapan las fichas negras situadas en las casillas (3,D) y (4,E), en dos líneas distintas, una horizontal y otra vertical.
  • La casilla (2,F), desde la que se atrapan las fichas negras situadas en las casillas (3,F), (4,F) y (5,F), en una línea vertical.
  • La casilla (2,G), desde la que se atrapan las fichas negras situadas en las casillas (3,F) y (4,E), en una línea diagonal.
  • La casilla (3,G), desde la que se atrapa la ficha negra situada en la casilla (4,F), en una línea diagonal.
  • La casilla (4,H), desde la que se atrapan las fichas negras situadas en las casillas (4,G), (4,F) y (4,E), en una línea horizontal.
  • La casilla (5,G), desde la que se atrapa la ficha negra situada en la casilla (5,F), en una línea horizontal.
  • La casilla (7,F), desde la que se atrapa la ficha negra situada en la casilla (6,E), en una línea diagonal.
  • La casilla (7,E), desde la que se atrapa la ficha negra situada en la casilla (6,E), en una línea vertical.
  • La casilla (6,D), desde la que se atrapa la ficha negra situada en la casilla (6,E), en una línea horizontal.

La partida finaliza cuando ningún jugador puede mover y gana quien en ese momento tenga en el tablero mayor número de fichas de su color. Normalmente la condición de fin de juego se alcanza cuando ya no quedan más casillas libres en el tablero pero puede ocurrir que, habiendo casillas libres, ninguno de los jugadores pueda realizar ningún movimiento legal.

El objetivo de este trabajo es implementar un sistema de producción en CLIPS que permita jugar al Reversi entre un jugador humano y la computadora. Para ello será necesario desarrollar reglas que analicen la situación del tablero de juego, los movimientos posibles para cada jugador y las estrategias de juego de la computadora. Todo ello siguiendo el modelo de juego desarrollado en clase en la unidad 5, "Juegos en CLIPS".

Se proporciona un fichero base reversi.clp que sigue el modelo de juego desarrollado en clase en la unidad 5, en el que se definen entre otros los siguientes constructores:

  • Una plantilla fila en el módulo MAIN, para almacenar la información sobre las fichas situadas en el tablero.
    (deftemplate MAIN::ficha
      (slot fila
         (type INTEGER)
         (range 1 9)
         (default ?NONE))
      (slot columna
         (type INTEGER)
         (range 1 9)
         (default ?NONE))
      (slot color
         (type SYMBOL)
         (allowed-symbols blanco negro)))
    
    • Los campos fila y columna sirven para almacenar los números de fila y columna en las que se encuentra la ficha. Se opta por usar números para ambos campos en lugar de letras.
    • El campo color sirve para almacenar el color que muestra la ficha. Sus posibles valores son blanco y negro.
    Esta plantilla se puede modificar libremente para añadir más campos si se considera necesario.
  • Un conjunto de hechos iniciales en el módulo MAIN, que describe la situación inicial del tablero de juego.
    (deffacts MAIN::tablero-inicial
      (ficha (fila 4) (columna 4) (color blanco))
      (ficha (fila 4) (columna 5) (color negro))
      (ficha (fila 5) (columna 4) (color negro))
      (ficha (fila 5) (columna 5) (color blanco)))
    
  • Las reglas imprime-tablero, imprime-casilla-libre e imprime-casilla-ocupada en el módulo DIBUJO, para imprimir el tablero de juego.
    (defrule DIBUJO::imprime-tablero
      (not (imprime ? ?))
      =>
      (printout t "+---+---+---+---+---+---+---+---+" crlf)
      (assert (imprime 1 1)))
    
    (defrule DIBUJO::imprime-casilla-libre
      ?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 crlf "+---+---+---+---+---+---+---+---+" crlf)
               (if (< ?i 8) then (assert (imprime (+ ?i 1) 1))
                            else (return))
          else (assert (imprime ?i (+ ?j 1)))))
    
    (defrule DIBUJO::imprime-casilla-ocupada
      ?h <- (imprime ?i ?j)
      (ficha (fila ?i) (columna ?j) (color ?c))
      =>
      (retract ?h)
      (if (= ?j 1) then (printout t "|"))
      (if (eq ?c blanco) then (printout t " O ") else (printout t " X "))
      (printout t "|")
      (if (= ?j 8)
          then (printout t t "+---+---+---+---+---+---+---+---+" crlf)
               (if (< ?i 8) then (assert (imprime (+ ?i 1) 1))
                            else (return))
          else (assert (imprime ?i (+ ?j 1)))))
    

Objetivos del trabajo

El trabajo consiste en desarrollar un sistema de producción en CLIPS que permita jugar al Reversi entre un jugador humano y la computadora. Para ello será necesario desarrollar reglas que analicen la situación del tablero de juego, los movimientos posibles para cada jugador y las estrategias de juego de la computadora.

El trabajo se ha de enviar a través de la aplicación Web disponible a tal efecto antes del día 16 de febrero de 2022. Se podrán enviar tantos ficheros como sea necesario, incluyendo en todos ellos la identificación (nombre y dni) del autor del trabajo. En estos ficheros se debe incluir la descripción y justificación de las reglas implementadas y el código CLIPS de la implementación.

Documentación adicional

  • Brian Rose. Othello: A minute to learn ... A Lifetime to Master
  • Emmanuel Lazard. Descubriendo el Othello

Criterios de evaluación

Los criterios de evaluación serán los siguientes:

  • El número y la corrección de las reglas implementadas
  • El grado de complejidad de las estrategias implementadas
  • Claridad y buen estilo de programación CLIPS
  • Documentación del trabajo
  • Presentación del trabajo realizado (sólo si es necesario)