RYG: función de evaluación – segunda versión #Programación retro del Commodore 64

Bueno, pues vamos a intentar mejorar la función de evaluación para que el C64 juegue mejor. Hasta ahora veníamos considerado estos dos criterios posicionales:

  • La fila del ratón.
  • El número de movimientos del ratón.

Esto se puede ver en la rutina "evaluaTablero" del fichero "EvalTableros.asm":

Rutina evaluaTablero

Parecen criterios un poco pobres, insuficientes para saber si un tablero es prometedor para el ratón o los gatos, que en el fondo es la información que usa el C64 para decidir su jugada.

Pero podemos observar que, si los gatos consiguieran guardar una fila cerrada, o al menos lo intentaran, sería mucho más difícil para el ratón rebasarlos. Mantener una fila cerrada no será siempre posible, ya que el ratón puede forzar que los gatos rompan la formación acercándose a ellos todo lo posible. Recordemos que en este juego no hay capturas.

Podemos intentar que los gatos guarden una fila cerrada obteniendo la fila mínima de los gatos, la máxima, y calculando la diferencia entre ellos. Si esa diferencia es cero, los gatos tienen que estar en fila; si es uno, no será una fila, pero al menos los gatos no estarán muy dispersos por el tablero; y así sucesivamente.

Total, añadimos la llamada a la nueva rutina "evaluaDifFilasGatos" en "evaluaTablero":

Rutina evaluaTablero V2

La nueva rutina "evaluaDifFilasGatos" es así:

Rutina evaluaDifFilasGatos

Es decir, calcula la fila máxima con "maxFilaGatos", la fila mínima con "minFilaGatos", calcula la diferencia entre máximo y mínimo con la instrucción "sbc" y, el resultado (0, 1, 2, …, 7) lo usa como índice para acceder a la tabla con las evaluaciones parciales. Si la diferencia es 0 la evaluación parcial será $f0 = -16, si la diferencia es 1 será $f8 = -8 y, a partir de ahí, cero. Estas evaluaciones parciales son negativas porque se supone que guardar una fila cerrada, o casi, es una situación que favorece a los gatos.

Para calcular la fila máxima y la fila mínima las rutinas "maxFilaGatos" y "minFilaGatos" hacen básicamente lo mismo que las rutinas equivalentes del procedimiento minimax (máximo valor y mínimo valor), es decir, partir del valor más bajo ($00) o más alto ($ff), ir comparando las filas de los gatos contra ese valor, y quedarse al final con el valor más alto o más bajo de los comparados. Nada nuevo que merezca la pena detallar más.

Si tras este cambio de la versión 16 ensamblamos y jugamos, veremos que el C64 ya juega mejor. El juego no es tan naif como en la versión 15. Parece que el C64 ya juega como con más intención, como con más "mala leche", buscando tapar las vías de escape. Aun así, todavía es posible ganarle con relativa facilidad, por lo que tendremos que seguir mejorando la función de evaluación.


Código del proyecto: RYG16


Editar

Josepzin

No hay comentarios:

Publicar un comentario