023:software

Microhobby 23. Año II, del 09 al 15 de abril de 1985

Pedro Sudón

Tenemos aquí un programa que le permitirá resolver todos los puzzles que usted quiera. Trabaja con pantallas (screen$) del Spectrum, esto es, usted crea u obtiene de alguna parte una pantalla de presentación, la carga con este programa y ya tiene preparado un puzzle para entretenerse.

Su manejo no presenta ninguna dificultad; existe un menú de tres opciones para manipularlo:

  • Opción 1: cargar pantalla. Su función es obvia.
  • Opción 2: nivel de dificultad. Por defecto, el nivel es el 1. A mayor nivel, la imagen de la pantalla estará más desordenada y será más difícil de recomponer.
  • Opción 3: comenzar el juego.

En la pantalla aparece un cuadrado negro en cuyo interior se puede ver el tiempo transcurrido desde que comenzamos a jugar; mediante las teclas del cursor o el joystick, podemos desplazarlo en las cuatro direcciones; el hueco que deja es rellenado con otro trozo de la imagen en pantalla.

Pulsando simultáneamente CAPS SHIFT + A finaliza el programa.

Este programa archiva una pantalla, la descompone en bloques y desordena éstos. El juego consiste en volver a ordenarlos para recuperar la pantalla inicial.

El programa es una aplicación de las rutinas básicas de almacenamiento y volcado de figuras en pantalla. En este caso, se trata de una sola rutina que es transformada desde el basic para ser utilizada en unos momentos para archivar y en otros, para dibujar o borrar.

La descripción del basic se hará en orden de ejecución ya que, de esta forma es más comprensible.

Una vez escrito el programa deberá salvarse con GO TO 800, de este modo se autoejecutará a partir de la línea 600.

No es recomendable jugar sin haberlo salvado pues un error en el código máquina podría provocar un crash que echará por tierra todo el trabajo de copiar el listado.

Esta rutina básicamente vuelca detrás de ramtop el código máquina. Este está escrito en hexadecimal y no en decimal por dos razones: ocupa mucha menos memoria y es más cercano al lenguaje de la máquina.

No obstante, como estamos en basic, los pokes han de hacerse en decimal, la conversión la realizan las funciones definidas H y C de la línea 10.

Una vez ejecutada esta rutina el programa siempre podrá iniciarse con RUN.

La línea 10 ajusta inicialmente el nivel de dificultad a 1, señala las direcciones de las subrutinas del programa, define la variable dimensionada T, que será el corazón del puzzle, y también define las funciones usadas por la rutina «inicializa».

Las líneas 20 y 30 muestran en pantalla el menú y los comandos de juego.

40-60: Comandos menú.

El comando 1 es obligatorio la primera vez que se ejecuta el programa, pues es necesaria una pantalla para poder jugar. En el apartado que explica la rutina de grabación veremos cómo salvar una pantalla con el programa.

El comando 2 sirve para cambiar el nivel de dificultad.

La línea 60 cierra un bucle en caso de no haber pulsado la tecla «3». Sólo en este caso, la ejecución del programa continúa.

Es ejecutada desde la línea 40 por el comando 1 del menú. Dos pokes convierten la rutina de volcado en rutina de archivo, por lo que la subrutina «Pinta» archivará en ramtop los 48 bloques en que descompondrá la pantalla cargada en la línea 410.

Se establece inicialmente en uno en la línea 10 y puede cambiarse por el comando 2 del menú que se ejecuta en la línea 50. Más adelante estudiaremos cómo funciona.

Los dos pokes iniciales convierten la rutina máquina en rutina de volcado de dibujo y color.

El resto, hace el mismo recorrido por la pantalla que hizo la línea 420 al archivar los bloques, esta vez dibujándolos.

Vemos así, dos formas de recorrer la pantalla: En una un solo bucle va calculando las coordenadas (LP y CP) donde establece los punteros de archivo. En la línea 70, son dos bucles los que lo hacen: uno para las líneas y otro, interior, para las columnas.

Al mismo tiempo la variable dimensionada T es llenada con los números de las piezas del puzzle.

La variable T es básicamente el puzzle. En ella se van a mover las piezas y sobre ella se efectuará, a cada ciclo de programa, la comprobación de la correcta colocación de las piezas.

Cada pieza está numerada y se encuentra archivada en el fondo de la memoria a partir de la dirección 42200 ocupando cada una 144 bytes, que corresponden 128 al dibujo y 16 al color.

El movimiento de las piezas del puzzle es posible gracias a que falta una. Una de las piezas de alrededor puede desplazarse a este hueco dejando su lugar vacío que puede, a su vez, ser ocupado por otra y, así sucesivamente.

La línea 80, convierte el código máquina al modo borrado.

La 90, elige un bloque al azar y guarda en la variable «negro» el código de este bloque obtenido de T.

La línea 110, utiliza la subrutina «pinta», esta vez para borrar el bloque elegido que pasará a ser el hueco que necesita el puzzle.

Mediante un bucle —for next— se producen cinco desplazamientos por cada unidad de nivel de dificultad.

Si el movimiento fuese totalmente al azar, podría darse el caso de que una pieza se colocase en el mismo lugar de donde procede. Esto se evita provocando alternativamente un movimiento vertical y otro horizontal. Lo consigue la variable HOR que se crea en la línea 18 tomando valor 1, cuando D es impar y 0, cuando es par.

La línea 119 establece al azar si el movimiento será hacia arriba o hacia abajo, en caso de HOR = 1, o derecha o izquierda, en caso contrario.

Una nueva corrección al azar es necesaria para el caso de que las piezas tiendan a salirse del tablero, de lo que se encarga la línea 122.

La línea 124 se encarga de mover la ficha en la tabla T y borrar el dibujo de la pieza movida.

La 130 dibuja la pieza en su nueva situación.

El juego propiamente dicho consiste en una rutina cíclica con una salida mínima que es la victoriosa o de terminación y otras que varían de un juego a otro y que, en este caso, sólo es la de abandono.

Este ciclo consta de varias fases que en el presente juego son: Tiempo, teclado y joystick, movimiento y texto de fin.

Los dos bytes bajos de la variable del sistema Frames son puestos a cero en la línea 145. Esta variable es incrementada en una unidad a cada interrupción, y esto ocurre 50 veces por segundo. Durante la ejecución de un Beep se desactivan las interrupciones, por lo que el tiempo en segundos será ligeramente mayor del marcado por el programa.

A cada ciclo de juego la línea 150 expone en el hueco del puzzle el tiempo transcurrido. La misma fórmula es utilizada por la línea 250 al final de la partida.

Para la inspección del teclado conviene usar una variable, en este caso i$ para evitar que en un ciclo sean identificadas dos órdenes incompatibles.

La inspección de joystick se hace conjuntamente con el teclado, de esta forma pueden usarse indistintamente.

Ya vimos en las líneas 124 y 130 cómo se movían los bloques de una sola vez. Ello era necesario para una mínima rapidez en niveles de dificultad altos.

En las líneas siguientes vemos una forma más sofisticada que supone un movimiento caracter a caracter.

La línea 180 localiza el bloque a mover y lo borra.

La línea 190 vuelve al comienzo del bucle en caso de haber ordenado un movimiento imposible.

La 200, en un bucle de cuatro vueltas va dibujando y borrando el bloque desde su posición de origen a la de destino, a excepción de la última que no es borrada. El pitido intermedio y las instrucciones previas a la rutina máquina son suficientes para ver la imagen.

Las líneas 210 a 230 comprueban, bloque a bloque, si éstos están colocados correctamente, saltando al detectar la primera incorrección al comienzo del bucle: línea 150.

En caso de ser todas correctas, se realizan los procesos de fin de partida.

Línea 240; Recuperación de la ficha eliminada al hacer el hueco. Efectos sonoros y visuales indicativos de final de partida; subrutina «Ruido».

Línea 250; Cálculo del tiempo y exposición en pantalla.

Línea 260; Pausas y sonidos.

Línea 290; Salto al comienzo del programa; Menú.

Línea 810; Es una simple instrucción Save con autoejecución a partir de la línea 600 que es la rutina «Inicializa».

Si se desea salvar el programa con pantalla puede modificarse esta rutina de la forma siguiente:

810 CLEAR: SAVE "PUZZLE" LINE 850
820 SAVE "puzzle" CODE 42000, 7112
830 STOP
850 BORDER 0: PAPER 0: INK 7
860 CLEAR 41000: LOAD "puzzle" CODE
870 RUN

Podrá eliminarse totalmente la rutina «Inicializa»; líneas 600 a 640.

Por supuesto, para esto habría que haber inicializado el juego y cargado una pantalla desde la opción «1» del menú.

IMAGEN —Ordinograma del Puzzle.

  • 023/software.txt
  • Última modificación: d/m/Y H:i
  • por miguel