Lights-Out para ZX-80

dancresp
Mensajes: 5332
Registrado: 13 Nov 2010 02:08
Agradecido : 142 veces
Agradecimiento recibido: 274 veces

Lights-Out para ZX-80

Mensajepor dancresp » 30 Mar 2019 00:24

Imagen

EL JUEGO
El objetivo del juego consiste en apagar todas las luces del tablero de juego.

Debemos introducir dos números entre 1 y 5, primero la fila y después la columna, y pulsar la tecla “New Line” para invertir el estado de la luz de la posición indicada y de las que está arriba, abajo, a la derecha y a la izquierda.

El juego finaliza al resolver los 10 niveles disponibles.

Descargar en formato ".O":
LightsOut.rar
(593 Bytes) Descargado 3 veces


BLOQUES
He dividido el listado en 6 bloques:

- Datos de los primeros 10 tableros.
- Decodificar los datos del tablero.
- Impresión del tablero.
- Pasar de nivel.
- Introducir la posición y cambiar los estados correspondientes.
- Invertir el estado de una luz.


COMO FUNCIONA
A continuación detallo, línea por línea, el funcionamiento del programa.

Se utilizan las siguientes variables:
P – Variable usada como puntero a los datos del nivel activo en el REM de la línea 1.
O – Variable usada como puntero al estado de las luces del nivel en el REM de la línea 2.
A – Variable usada como contador.
I – Variable numérica para bucles.
N – Variable numérica usada como puntero en el conversor de CHAR→BIN.
B – Variable numérica usada como potencia de 2 en el conversor de CHAR→BIN.
F – Variable numérica para bucles.
A$ - Variable usada para la entrada del movimiento.


1 – Línea REM que contiene los datos de los 10 niveles, agrupados de 5 en 5 caracteres.
2 – Línea REM que contiene el estado de las 25 luces del nivel.
4 – La variable P apunta al primer carácter del REM de la línea 1.
6 – La variable O apunta al primer carácter del REM de la línea 2.
8 – Se pone la variable A=0, y se usa como contador del conversor CHAR-BIN.
10 – Inicio del bucle del conversor CHAR→BIN, que lee los 5 bits de la derecha del carácter.
12 – Se guarda en N un carácter del REM de la línea 1. Es un valor entre 0 y 31.
14 – Guarda en B el valor 16.
16 – Guarda en F un valor 0 o 1, si N+1 es mayor que B.
18 – Guarda en el REM de la línea 2 el valor de F, que puede ser o 0 1.
20 – Incrementa en 1 el valor de A.
22 – Si F=1 resta B a N.
24 – Divide el valor de B entre 2.
26 – Si B es mayor de 0 salta a la línea 16, para procesar el siguiente bit de N.
28 – Final del bucle del conversor CHAR→BIN.
30 – Borra la pantalla.
32 – Pone la variable A a 0. Se usa para saber si se ha completado del nivel.
34 – Inicio del bucle F que controla la impresión de filas.
36 – Inicio del bucle I que controla la impresión de columnas.
38 – Pone en N un valor del REM de la línea 2.
40 – Suma a la variable A el valor de N.
42 – Imprime uno de los dos caracteres del tablero según la luz esté encendida o apagada.
44 – Final del bucle de las columnas.
46 – Salta a la siguiente línea de la pantalla.
48 – Salta a la siguiente línea de la pantalla.
49 – Final del bucle de las filas.
50 - Muestra el número del nivel a partir de la posición del puntero P.
51 - Salta a la siguiente línea de la pantalla.
52 – Si A no vale 0 salta a 60 para empezar a entrar los movimientos.
53 – Incrementa el valor P en 5 para que apunte a los datos del siguiente nivel.
54 – Muestra el mensaje de “LIGHTS OUT”.
55 – Salta a la siguiente línea de la pantalla.
56 – Si se han completado los 10 niveles muestra “GAME OVER” y finaliza el programa.
58 – Hay un INPUT para esperar que se pulse una tecla.
59 – Se salta a la línea 8 para mostrar el siguiente nivel.
60 – Se muestra el formato de la entrada.
61 – Se introduce el movimiento en A$.
62 – Se guarda en la variable I Ia fila.
63 – Se guarda en la variable F la columna.
64 – Si uno de los dos valores es menor de 1 o mayor de 5 se vuelve a la línea 61.
67 – Se guarda en N un valor entre 1 y 25 en función del movimiento introducido.
68 – Se salta a 90 para invertir el valor de la luz de la posición introducida.
69 – Se resta 5 a N para apuntar a la luz de la fila superior.
70 – Si no estamos en la primera fila salta para cambiar el estado de la luz superior.
72 - Se suma 10 a N para apuntar a la luz de la fila inferior.
74 – Si no estamos en la última fila salta para cambiar el estado de la luz inferior.
76 - Se resta 6 a N para apuntar a la luz de la izquierda.
78 – Si no estamos en la primera columna salta para cambiar el estado de la luz izquierda.
80 - Se suma 2 a N para apuntar a la luz de la derecha.
82 – Si no estamos en la última columna salta para cambiar el estado de la luz derecha.
84 – Salta a la línea 30 para volver a imprimir el tablero y comprobar si se ha resuelto.
90 – Invierte el valor de N. Si es 0 lo pone a 1, y si es 1 lo pone a 0.
92 – Hace in POKE a la posición correspondiente del REM de la línea 2.
94 – Vuelve de la subrutina.


EL PROGRAMA
LightOut_ZX80_Listado.png
LightOut_ZX80_Listado.png (14.99 KiB) Visto 112 veces


APUNTES FINALES
Esta es otra adaptación de un programa de 1K del ZX-81 programado hace unos años por mí, y como en el caso del Sudoku, el disponer de más memoria me ha permitido hacer una versión mejorada, ya que muestra el número del nivel en el que estamos, controla el final del juego al superar los 10 niveles disponibles y comprueba que el movimiento introducido sea correcto. En la versión del ZX-81 no se pudo realizar nada de esto, aunque por el resto, los dos programas funcionan exactamente igual.

Se ha respetado la codificación de los niveles de la versión del ZX-81, que consiste en introducir 5 caracteres, uno por cada fila de luces y con un sencillo conversor hexadecimal, se comprueba el valor de los 5 bits de la derecha, y se van guardando en el REM de la línea 2.

Tabla.gif
Tabla.gif (2.61 KiB) Visto 112 veces

Tabla de codificación de filas

En su día ya me sorprendió poder introducir 40 líneas en la versión del ZX-81, aunque quedé al borde del error 4 de falta de memoria. En el caso del ZX-80 el programa ocupa 54 líneas y no ha dado señales de falta de memoria, con lo que se podrían introducir algunos niveles más. Se deberían introducir a continuación del último carácter del REM de la línea 1, y se debería modificar el valor de la comparación de P en la línea 56, sumando 5 por cada nivel extra.

Aunque no se vea, el REM de la línea 2 debe contener 25 caracteres cualesquiera. Si no se hace, al ejecutar el programa los POKE de las líneas 18 y 92 alterarán el programa BASIC y provocarán un error.


Otra prueba superada, y un nuevo juego para el Sinclair ZX-80 ¡!!


Os invito a probarlo.
Adjuntos
LightsOut_Screen_ZX80.png
(636 Bytes) No descargado aún

Volver a “Lenguajes de Programación y herramientas Dev”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado