RYG: árbol de juego – algunas mejoras

Programación retro del Commodore 64

  • Programación retro del Commodore 64
  • “Programación Retro del Commodore 64” es un blog sobre el hardware, el sistema operativo, y la programación del Commodore 64. Y más específicamente sobre programación en ensamblador. Pretende ser un blog con información de calidad, y referencia en español de la programación retro de esta maravillosa máquina.
    • Mi blog
« Publicado el: 25/05/2020 »

Hace unas pocas entradas, en la versión 7 del proyecto, desarrollamos la rutina “aplicaJugadaGatoHijo”. El ratón tendrá una rutina equivalente un poco más adelante.

Esta rutina permite aplicar una jugada de un gato a un tablero. Pero, en vez de modificar directamente ese tablero, genera un tablero hijo. De este modo, permite ir generando el árbol de juego que hace falta para que el C64 decida su jugada.

Pues bien, entonces decíamos que esta rutina hacía:

<<

  • Saca una copia del tablero de entrada (ahora la raíz del árbol) en un nuevo tablero que será el hijo. Para esto hace falta una nueva rutina de apoyo “copiaTablero” en el fichero “Tableros.asm”.
  • Actualiza el puntero a la memoria libre (libreLo – libreHi), puesto que hemos creado un nuevo tablero en el árbol.
  • Sobre el tablero hijo, aplica el movimiento.
  • Más adelante, enlazará el tablero padre con el tablero hijo, y viceversa, aunque en esta fase del proyecto esto todavía no está implementado.
  • A modo de depuración, y de forma temporal, imprime el tablero hijo.

>>

Lo anterior admite varias mejoras, a saber:

Copia del tablero padre en el hijo:

La rutina “copiaTablero” copia el tablero origen en el destino tal cual. Ahora bien, hay campos del tablero origen, como los hijos, que no tienen sentido en el tablero de destino.

Podemos esperar a que el programa vaya “machacando” esos campos, y dándoles nuevos valores con sentido o, para no crear confusión, inicializarlos en el hijo desde el comienzo.

Por esto último se desarrolla la rutina de apoyo “copiaTableroSinHijos” (fichero “Tableros.asm”), que en el fondo es igual que “copiaTablero” pero inicializando los hijos del destino.

Incrementar nivel y turno:

Más ejemplos de campos que no tiene sentido copiar tal cual del padre al hijo son los campos “nivel” y “turno”. El nivel hay que incrementarlo en uno del padre al hijo. Y el turno hay que ir alternándolo entre ratón y gatos.

Estas modificaciones se podrían hacer en la de rutina de copia (ya sea la original “copiaTablero” o la nueva “copiaTableroSinHijos”). Pero como también hay que hacerlas cuando se aplica una jugada directamente a un tablero, sin dar lugar a un tablero hijo (por ejemplo, cuando el humano decide su jugada y hay que aplicarla al tablero actual), estos cambios se llevan a las rutinas “aplicaJugadaGato” y “aplicaJugadaRaton”.

Ahora estas dos rutinas incluyen una llamada a la nueva rutina de apoyo “incrementaNivelYTurno” (fichero “Tableros.asm”). Como esta rutina no tiene mucho misterio, no abundaremos más en ella.

Vincular padre e hijos:

Para construir un árbol de verdad no sólo hay que generar tableros. Además, hay que vincular el padre con los hijos y al revés.

Vincular un hijo con su padre es fácil porque, como dicen, “padre no hay más que uno” (en realidad, se dice de las madres que es con las que no hay duda