Man1k Puzzle para ZX-81

Foro dedicado a la programación en todo tipo de sistemas clásicos.
dancresp
Amiga 1200
Amiga 1200
Mensajes: 1392
Registrado: 23 Dic 2008, 17:53
Sistema Favorito: MSX
primer_sistema: ZX81
Primera consola: Atari 2600
Gracias dadas: 3 veces
Gracias recibidas: 20 veces

Man1k Puzzle para ZX-81

Mensajepor dancresp » 18 Nov 2015, 12:20

Man1k_31.gif
Man1k_31.gif (3.23 KiB) Visto 1638 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.85 KiB) Visto 1638 veces


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

Por evidentes limitaciones de memoria, el programa no detecta movimientos incorrectos.

Descargar el juego:
Man1k Puzzle.rar
(497 Bytes) Descargado 67 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$ - Puzzle desordenado.
B$ - Movimiento realizado.
W$ - Puzzle ordenado.
L – Variable numérica que contiene el nivel de juego.
U – Variable numérica que contiene el valor 1.
X – Posición horizontal del movimiento. También usada para un bucle.
Y– Posición vertical del movimiento.

1 – Se guarda el gráfico de Willy secuencialmente en la variable “W$”.
2 – Inicializamos el generador de números aleatorios.
3 – Definimos la variable “U” con el valor 1.
5 – Inicializamos la variable “L” que contiene el nivel del juego.
8 – Guardamos una copia de la variable “W$” en la variable “A$”.
10 – Inicio del bucle que se encarga de desordenar el gráfico de “A$”, según el nivel de juego.
12 – Generamos un número aleatorio correspondiente de una posición de gráfico a desordenar.
14 – Vamos a la rutina que guarda el cambio de las dos fichas.
16 – Final del bucle.
22 – Inicio del bucle que se encarga de dibujar el gráfico desordenado y el ordenado.
24 – Final del bucle.
26 – Imprime las coordenadas numéricas.
27 – Salta una línea.
28 – Imprime el nivel de juego.
30 – Entramos el movimiento en la variable “B$”.
34 – Calculamos la posición vertical a partir del primer carácter de “B$”.
35 – Calculamos la posición horizontal a partir del segundo carácter de “B$”.
36 – Vamos a la rutina que guarda el cambio de las dos fichas.
40 – Mostramos el cambio en las fichas del gráfico a ordenar.
42 – Si los dos gráficos no son iguales salta a la línea 30.
44 – Se incrementa el nivel de dificultad en 1.
46 – Salta a la línea 8 para volver a desordenar el puzzle.
50 – Intercambiamos las dos partes del gráfico.
52 – Retorno de la subrutina de intercambio.


EL PROGRAMA
Man1k_Listado.gif
Man1k_Listado.gif (8.89 KiB) Visto 1638 veces


APUNTES FINALES
Nuevo juego tipo puzzle que incorporo a mi colección, junto a otros como el “Mine Field”, “Sudoku”, “Lights Out”, “Solitario”, “Pipe Mania” o el “Rush Hour”.Y una vez más, un proyecto que era aparentemente sencillo me ha dado más dolores de cabeza de los que me esperaba.El juego está basado en el juego “Sort-Col” que programé para el NEC PC-8201ª, sustituyendo los números por un gráfico del minero Willy del Manic Miner.
Para aprovechar el tiempo he vuelto a usar el emulador “EightyOne” durante los viajes al trabajo en tren, y una vez más, la mayor parte del juego estaba hecha en menos de una hora, pero acabarlo de encajar sacrificando algunas cosas me ha llevado unas tres horas más.


1. Almacenando los puzzles
En un principio el puzzle disponía de dos gráficos que se debían ir intercambiado, uno para los niveles pares y otro para los impares. Estos dos gráficos estaban almacenados en una línea REM, como hago habitualmente para ahorrar memoria. Un pequeño bloque de líneas se encargaban de almacenar el gráfico activo en la variable “A$”, que posteriormente se desordenaba, y en “B$” me guardaba el gráfico sin desordenar.

Teniendo en cuenta que cada gráfico ocupa 48 bytes, 96 bytes se gastaban en la línea REM y otros 96 se guardaban en la zona de variables de la RAM, solo esta parte se comía un 40% de la memoria disponible. Llegó la época de los recortes…

Así que el tema ha quedado tal y como se ve, hay un único gráfico cargado directamente en la variable “W$”, que se duplica en “A$” para ser desordenado. De esta forma nos ahorramos unos 50 bytes, más las líneas de carga y la rutina de comprobación. Esto ha sido determinante para poder acabar el juego.

2. Mostrando el tablero
En este apartado era básico mostrar el gráfico desordenado y el ordenado, con un sistema de coordenadas para poder introducir el movimiento.

Teniendo en cuenta que cada gráfico ocupa 8 caracteres verticales por 6 horizontales, más la columna separadora, las coordenadas horizontales y el indicador de nivel, la memoria de pantalla ha consumido unos 140 bytes. Junto con el apartado anterior, la mitad de la RAM disponible. Y aún queda por programar el resto…

3. Indicar el movimiento
Inicialmente el movimiento se realizaba con las teclas de los cursores, desplazando un par de “*” donde actualmente hay las coordenadas, pero una vez más, el fatídico error 4 me ha obligado a simplificar el apartado, sustituyendo unas líneas bastante densas con varios INKEY$ y controles de límites por un simple INPUT.

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. Un proceso sencillo de rápida ejecución.

Al finalizar comparo las variables “W$” (gráfico original) y “A$” (gráfico desordenado) y si es distinto pido un nuevo movimiento, y si es igual incremento el nivel y genero un nuevo puzzle más desordenado.

He tenido que prescindir de la verificación de que el movimiento es correcto, nada complicado, porque por unos pocos bytes el programa no da error de memoria.

Man1k_Versiones.gif
Man1k_Versiones.gif (20.73 KiB) Visto 1638 veces


Y para terminar
Como se puede ver en el gráfico superior, el juego ha ido mutando por gentileza del error 4 de "Out of Memory".

Desde lo que debía ser una primera versión con dos gráficos distintos y movimiento con cursores, seguida por otra en el que los movimientos se introducen mediante un INPUT pero conserva los dos gráficos, hasta llegar a la versión definitiva en que se pierde el segundo gráfico para poder finalizar el juego.

Afortunadamente todas estas "mutaciones" se han producido en un periodo de unas 4 horas, y el resultado ha sido más que satisfactorio.


Os invito a probarlo…

Man1k_31.gif
Man1k_31.gif (3.23 KiB) Visto 1638 veces

Man1k_32.gif
Man1k_32.gif (3.21 KiB) Visto 1638 veces

Man1k_33.gif
Man1k_33.gif (3.18 KiB) Visto 1638 veces

Man1k_34.gif
Man1k_34.gif (3.11 KiB) Visto 1638 veces
Buscando la IP de la W.O.P.R.

Avatar de Usuario
Lenko
Atari 1040 STf
Atari 1040 STf
Mensajes: 682
Registrado: 29 Mar 2005, 11:39
Gracias dadas: 77 veces
Gracias recibidas: 17 veces

Re: Man1k Puzzle para ZX-81

Mensajepor Lenko » 18 Nov 2015, 14:23

Lo suyo hubiera sido poner un cargador para ir instalando las imágenes desde cinta y que se pudiera usar un ratón. Sin contar que con unos cuantos colores estaría más mono.

Pero vamos, nos contentaremos con esto :mrgreen: ;)
Material para cambio y venta

Busco:
- Manual Spectrum +3 español

Avatar de Usuario
zitror
Amiga 2500
Amiga 2500
Mensajes: 5296
Registrado: 02 Jul 2006, 00:16
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
Ubicación: El interior de un Z80
Gracias dadas: 175 veces
Gracias recibidas: 73 veces
Contactar:

Re: Man1k Puzzle para ZX-81

Mensajepor zitror » 18 Nov 2015, 22:48

Y en solo un Kb, ¡Impresionante! =D>
(C) 1.982 Sinclair Research Ltd

La buhardilla de Zitror


Volver a “Programación”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 4 invitados