Inicialización e impresión del tablero

Ahora que ya sabemos cómo representar el tablero en la memoria del C64 los siguientes pasos van a ser inicializar el tablero y “pintarlo”.

Inicializar el tablero es colocar sobre él el ratón y los gatos en su posición inicial. Esto es necesario para empezar el juego.

E imprimir el tablero es hacer una representación del mismo en la pantalla del C64, de momento en modo texto. Esto será necesario casi para cualquier cosa, por ejemplo, para depurar los programas.

Todo esto lo vamos a hacer en una versión inicial del programa que iremos sofisticando de manera incremental. De momento, nos llega con cuatro ficheros *.asm:

  • “Globals.asm”: Recoge las constantes como el valor de las piezas, las direcciones de movimiento, los bandos (ratón o gatos), etc.
  • “Init.asm”: Recoge las variables y estructuras de datos principales, como el tablero, el bando que mueve, la profundidad de análisis, el número de nodos / tableros analizados, etc.
  • “Display.asm”: Recoge todo lo que tiene que ver con la impresión por pantalla.
  • “Main.asm”: Es el programa principal. En este primer paso, va a inicializar el tablero y pintarlo.

Inicialización del tablero:

Para inicializar el tablero nos apoyaremos en una tabla como ésta (etiqueta “init_board”):

Obsérvese que tiene un 0 (PIECE_MOUSE) sobre el índice 4 (casilla E1), un 1 (PIECE_CAT1) sobre el índice 57 (casilla B8), un 2 (PIECE_CAT2) sobre el índice 59 (casilla D8), un 3 (PIECE_CAT3) sobre el índice 61 (casilla F8), un 4 (PIECE_CAT4) sobre el índice 63 (casilla H8), y un 6 (PIECE_EMPTY) sobre el resto de casillas.

Pues bien, para inicializar el tablero simplemente definimos una rutina que recorra “init_board”, lea la pieza que hay almacenada en cada casilla, y la escriba en el tablero “board”. Se trata de la rutina “initBoard”:

Además de lo ya mencionado (copiar el tablero inicial sobre “board”), también hace otras labores de inicialización de la partida:

  • Mete el valor “SIDE_MOUSE” en la variable “side”, puesto que el primer bando que mueve al comienzo de la partida es el ratón.
  • Mete cero en “ply” y “hply”. Estas variables controlan la profundidad del árbol de jugadas que se está analizando (“ply”) y el número de movimientos jugados desde el comienzo de la partida (“hply”).
  • También mete cero en “first_move”. Esto es como decir que de momento no hay movimientos generados.

Bueno, pues ya está. Tenemos una rutina que inicializa el tablero y, más en general, para inicializar la partida.

Impresión del tablero:

Para imprimir el tablero inicialmente buscamos una representación de este tipo:

Es decir, primero las letras “ABCDEFGH”, luego las ocho filas del tablero, y finalmente las letras “ABCDEFGH” de nuevo. Los gatos los representaremos con una “C”, aunque podríamos usar letras distintas porque somos capaces de distinguirlos, el ratón con una “M”, las casillas blancas con un “.”, y las casillas negras con una “X”.

Más adelante podemos buscar una representación más sofisticada usando caracteres personalizados o, incluso, sprites.

La impresión la resolvemos con la rutina “displayBoard”, que sigue el mismo esquema anterior:

  • Imprime las letras con la rutina “displayLetters”.
  • Imprime las ocho filas con la rutina “displayRow”.
  • Vuelve a imprimir las letras con la rutina “displayLetters”.
  • E imprime algunos datos adicionales con la rutina “displayOther” (el bando al que le toca mover, la profundidad de análisis actual “ply”, y el número de movimientos de la partida “hply”).

A su vez, las rutinas anteriores se apoyan en las rutinas auxiliares:

  • “displaySq” para imprimir una casilla, ya sea “M” si contiene el ratón, “C” si contiene un gato, o “X” / “.” si está vacía.
  • “displayHex” para imprimir un número en formato hexadecimal.
  • “displayText” para imprimir un texto, ya sea “ABCDEFGH” o cualquier otro texto.

Programa principal:

El programa principal lo iremos complicando poco a poco, igual que los demás programas. De momento, nos vale para probar lo ya programado (inicialización e impresión del tablero) e ir construyendo sobre esa base:

Total, si ensamblamos, cargamos y ejecutamos vemos esto:

El siguiente paso será empezar a generar jugadas.


Código del proyecto: RYG3-01

Deja un comentario