MANIC PUZZLE para ZX-80

dancresp
Mensajes: 5647
Registrado: 13 Nov 2010 02:08
Agradecido : 334 veces
Agradecimiento recibido: 459 veces

MANIC PUZZLE para ZX-80

Mensajepor dancresp » 02 Jul 2020 00:40

ManicPuzzle_Screen.png
ManicPuzzle_Screen.png (2.54 KiB) Visto 340 veces


EL JUEGO
El objetivo del juego consiste en intercambiar horizontalmente los gráficos del puzzle de la izquierda hasta conseguir que quede como el dibujo de la derecha.

Movimiento:
El movimiento se compone de una letra, comprendida entre A y H, y un número entre 1 y 5.
Esto provoca que se intercambie el gráfico de la posición indicada con el gráfico que hay a su derecha.

Por ejemplo, “A3” provoca que en esa posición se coloque el gráfico de la posición “A4”, y en “A4” el que hay en “A3”.

Play_Seq.gif
Play_Seq.gif (6.83 KiB) Visto 340 veces


Cuando el programa detecta que los dos gráficos son iguales incrementa el nivel de dificultad y el desorden aumenta.

Descargar juego en formato ".o":
ManicPuzzle.rar
(585 Bytes) Descargado 7 veces


BLOQUES
He dividido el listado en 4 bloques:
- Definir el puzzle e inicializar las variables.
- Desordenar el puzzle.
- Mostrar el puzzle en pantalla.
- Introducir y realizar el movimiento.


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

Se utilizan las siguientes variables:
A - Puntero a la línea REM.
E - Controla si el gráfico es correcto.
F - Variable para bucles o auxiliar para otras cosas.
I - Variable para bucles o auxiliar para otras cosas.
L - Nivel del juego.
A$ - Movimiento a realizar.

1 - Línea REM usada como buffer de pantalla y que contiene la figura desordenada y la correcta.
2 - Guardamos un 1 en la variable "L", usada como contador de nivel de juego.
3 - Modificamos la generación de números aleatorios.
4 - Guardamos en la variable "A" el puntero al primer carácter después del REM de la línea 1.
5 - Inicio del bucle que controla la posición vertical del duplicado de la figura.
6 - Inicio del bucle que controla la posición horizontal del duplicado de la figura.
7 - Pone el carácter de la posición A+7 en la posición A.
8 - Incrementa en 1 el valor del puntero guardado en la variable "A".
9 - Final del bucle de control horizontal.
10 - Incrementa en 7 el valor del puntero guardado en la variable "A", para saltar de línea.
11 - Final del bucle de control vertical.
15 - Inicio del bucle que desordena la figura de la izquierda.
16 - Guardamos en la variable "I" la posición del gráfico que vamos a mover.
17 - Salta a la subrutina de la línea 90 que intercambia la posición de dos gráficos.
18 - Final del bucle que desordena.
20 - Volvemos a guardar en la variable "A" el puntero al primer carácter después del REM de la línea 1.
21 - Guardamos un 0 en la variable "E".
22 - Borrado de la pantalla.
23 - Inicio del bucle que controla la posición vertical de la impresión en pantalla.
24 - Inicio del bucle que controla la posición horizontal de la impresión en pantalla
25 - Imprime un carácter en pantalla.
26 - Comprueba si ese carácter es igual en los dos gráciso, sino pone un 1 en la variable "E".
27 - Incrementa en 1 el valor del puntero guardado en la variable "A".
28 - Final del bucle de control horizontal.
29 - Salto de línea en pantalla.
30 - Final del bucle de control vertical.
31 - Imprime en pantalla el pie de los gráficos.
32 - Salto de línea en pantalla.
33 - Imprime en pantalla el número del nivel de juego.
34 - Salto de línea en pantalla.
35 - Si los gráficos no son iguales "E=1" y salta a la línea 40.
36 - Incrementa en 1 el valor de la variable "L", que contiene el nivel de juego.
37 - Imprime en pantalla el mensaje de nivel superado.
38 - INPUT para forzar una pausa hasta que se pulsa "Enter".
39 - Saltar a la línea 10.
40 - Imprime en pantalla el formato del movimiento.
41 - Entrar el movimiento en la variable A$.
42 - Guardamos en la variable "F" la fila.
43 - Guardamos en la variable "I" la columna.
44 - Si el movimiento es incorrecto salta a la línesa 41.
45 - Calcula la posición del gráfico a mover y lo guarda en la variable "I".
46 - Salta a la subrutina de la línea 90 que intercambia la posición de dos gráficos.
47 - Saltar a la línea 20.
90 - Usamos la variable "I" como puntero al gráfico del REM de la línea 1.
91 - Guardamos en la variable "A" el gráfico indicado según la posición de "I".
92 - POKE a la posición del gráfico para poner el gráfico siguiente.
93 - POKE a la siguiente posición del gráfico para poner el gráfico guardado en "A".
94 - Final de la subrutina.


EL PROGRAMA
ManicPuzzle_List.png
ManicPuzzle_List.png (11.2 KiB) Visto 340 veces


APUNTES FINALES
Nuevo juego tipo puzzle que incorporo a mi colección, junto a otros como el “Mine Field”, “Sudoku”, “Lights Out”, “Solitario” o el “Rush Hour”.

El juego está basado en el juego “Sort-Col” que programé para el NEC PC-8201A, sustituyendo los números por un gráfico del minero Willy del Manic Miner.


Almacenando los puzzles
En la versión original de ZX-81 estaba contemplado disponer de dos gráficos que se debían ir intercambiado, uno para los niveles pares y otro para los impares. Por tema de memoria se tuvo que descartar, y en esta versión tampoco ha sido posible implementarlo.

Mostrando el tablero
Como en otros juegos para el ZX-80, he aprovechado una línea REM para usarla como buffer del contenido de la pantalla, y a su vez para tener el gráfico correcto y el desordenado.

Mediante tres bucles puedo duplicar el gráfico bueno, almacenar el gráfico desordenado y mostrarlo por pantalla. Este último bucle se encarga de revisar si los dos gráficos son iguales.

Introducir el movimiento
La entrada consta de dos caracteres: “Letra de la coordenada vertical” y “Número de la coordenada horizontal”.

Con unas pocas líneas en BASIC puedo calcular las coordenadas de pantalla, intercambiar los dos segmentos afectados y actualizar la pantalla.

A diferencia de la versión del ZX-81, aquí sí he podido verificar que el movimiento introducido es correcto.

ManicPuzzle_List8081.png
ManicPuzzle_List8081.png (236.25 KiB) Visto 340 veces


Os invito a probarlo…
Buscando la IP de la W.O.P.R. he encontrado mi índice

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