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

La función de evaluación es una funcionalidad nueva. Por tanto, vamos de dotarla en un fichero nuevo: "EvalTableros.asm". En este fichero encontramos:

Rutina "evaluaTablero":

La rutina principal de este nuevo fichero es "evaluaTablero":

Rutina evaluaTablero

Esta rutina recibe un tablero y devuelve su valor. Para ello:

  • Inicializa la evaluación al valor neutro $80.
  • Evalúa la posición del ratón con la rutina "evaluaFilaRaton".
  • Evalúa la movilidad del ratón con la rutina "evaluaMovsRaton".

La rutina no sólo devuelve el valor en la variable "etValor". Además, lo almacena en el propio tablero evaluado llamando a "meteValorTablero". Recordemos que uno de los campos de todo tablero es el campo "valor".

Rutina "evaluaFilaRaton":

La fila del ratón es el primer criterio posicional. Como ya adelantamos, vamos a evaluarla así:

  • Situaciones favorables al ratón:
    • Ratón en fila 7 => +0 puntos
    • Ratón en fila 6 => +1 puntos
    • Ratón en fila 5 => +2 puntos
    • Ratón en fila 4 => +3 puntos
    • Ratón en fila 3 => +4 puntos
    • Ratón en fila 2 => +5 puntos
    • Ratón en fila 1 => +6 puntos
    • Ratón en fila 0 (gana el ratón) => +32 puntos = $20

Esto es fácil de implementar con una tabla de datos que, en función de la fila ocupada por el ratón, devuelve la evaluación:

Rutina evaluaFilaRaton

Para hacer esto, la rutina:

  • Localiza el ratón sobre el tablero con "dameRaton".
  • Convierte el offset del ratón en (fila, columna).
  • Usando la fila como índice, accede a la tabla con las valoraciones.
  • Suma la nueva valoración a la de partida ($80).

Rutina "evaluaMovsRaton":

La movilidad del ratón es el segundo criterio posicional. Como ya dijimos, también, vamos a evaluarlo así:

  • Situaciones favorables a los gatos:
    • Ratón con 4 movimientos => -0 puntos
    • Ratón con 3 movimientos => -1 puntos = $ff
    • Ratón con 2 movimientos => -2 puntos = $fe
    • Ratón con 1 movimientos => -3 puntos = $fd
    • Ratón con 0 movimientos (ganan los gatos) => -32 puntos = $e0

Esto también se puede resolver con una tabla de datos, pero requiere un poco más de trabajo, porque previamente hay que calcular cuántos movimientos admite el ratón en el tablero evaluado.

Por ello, la rutina es así (primera parte):

Rutina evaluaMovsRaton - parte1

Es decir:

  • Localiza el ratón sobre el tablero.
  • Convierte el offset del ratón en (fila, columna).
  • Y genera las jugadas válidas del ratón.

Posteriormente, la rutina sigue así (parte 2):

Rutina evaluaMovsRaton - parte2

Es decir:

  • Cuenta las jugadas válidas del ratón con el registro Y.
  • Usando Y como índice, accede a la tabla con las valoraciones.
  • Suma la nueva valoración a la anterior ($80 + fila del ratón).

De este modo, ya tenemos la valoración completa, al menos en lo que respecta a esta primera versión de la función de evaluación.

Pero, además de devolver el valor con "etValor", resulta cómodo tenerlo a mano en el propio tablero evaluado, motivo por el que "evaluaTablero" termina llamando a "meteValorTablero".

Rutina "meteValorTablero":

La rutina que almacena el valor en el tablero evaluado es así:

Rutina meteValorTablero

Y como el valor forma parte de la terna que hemos llamado "datos básicos" (nivel, turno y valor), la rutina:

  • Utiliza "dameDatosBasicos" para obtener la terna.
  • Y utiliza "fijaDatosBasicos" para volver a fijar la terna, previo cambio del valor original ("ddbValor") por el nuevo valor ("etValor").

En alguna versión posterior del proyecto haremos una rutina más directa ("fijaValor") que permita cambiar sólo el valor sin tanto trasiego de datos.

Y con esto la versión 12 del proyecto ya tiene su primera versión de la función de evaluación. Pero falta aplicarla a un tablero o conjunto de tableros, cosa que ya haremos en la siguiente entrada.


Código del proyecto: RYG12


Editar

Josepzin

No hay comentarios:

Publicar un comentario