MINE-FIELD para ZX-80

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

MINE-FIELD para ZX-80

Mensajepor dancresp » 10 Jun 2020 23:10

MineField_Screen.png
MineField_Screen.png (1.11 KiB) Visto 261 veces


EL JUEGO
El objetivo del juego consiste en descubrir todas las casillas del tablero de juego y localizar las 15 minas que contiene.

Para el movimiento se debe introducir el número de fila y de columna y el programa nos indica la cantidad de minas que hay alrededor de esa casilla. Añadiendo opcionalmente un tercer carácter indicaremos si hay una mina en esa posición.

¿Cómo se juega?
"35"
Introduce un número de 2 cifras para indicar la fila y la columna. Si en esa posición hay una mina, finaliza la partida, y si no no hay una mina nos muestra cuantas minas hay alrededor.

"35*"
Introduce un número de 2 cifras más un tercer carácter para marcar que en esa posición hay una mina. Si en esa posición no hay una mina, finaliza la partida.

El juego finaliza al localizar las 15 minas.


BLOQUES
He dividido el listado en 4 bloques:

- Línea REM usada como matriz numérica donde guardamos el estado de las 100 casillas.
- Borrado de la matriz y generar el campo minado.
- Introducir las coordenadas.
- Revisar la celda y las de alrededor.

Descargar el juego en formato ".O":
MineField.rar
(625 Bytes) Descargado 11 veces


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

Se utilizan las siguientes variables:
A – Variable usada para diversas acciones.
F – Variable usada para bucles.
I – Variable usada para diversas acciones.
M – Número de minas.
P - Puntero a la posición de memoria del carácter número 11 después del REM de la línea 1.
X – Variable para coordenada horizontal al dibujar la pantalla o entrar el movimiento.
Y – Variable para coordenada vertical al dibujar la pantalla o entrar el movimiento.
A$ - Entrada del movimiento a realizar

1– Línea REM que contiene los la cabecera del tablero en pantalla y las 100 casillas de juego.
3- Inicializar los números aleatorios.
5 – Guardamos el número total de minas en la variable “M”.
6 – Guardamos el puntero a la línea REM en la variable “P”.
10 – Inicio del bucle que inicializa la zona de juego.
11 – POKE a la posición correspondiente de la línea REM.
12 – Final del bucle de inicialización.
15 – Inicio del bucle que coloca las minas.
16 – Guardamos en la variable “A” la posición aleatoria de la mina.
17 – Si en esa posición hay una mina vuelve a la línea 16.
18 – POKE a la posición correspondiente de la línea REM.
19 – Final del bucle que coloca las minas.
20 – Guardamos en la variable “I” la primera posición después del REM.
22 – Borrado de pantalla.
24 – Inicio del bucle que controla la posición vertical de la impresión de la pantalla.
26 – Mostramos el número de fila en vídeo inverso.
28 - Inicio del bucle que controla la posición horizontal de la impresión de la pantalla.
30 – Si la posición de memoria de “I” es 1 pone un guion.
32 – Si la posición de memoria de “I” no es 1 muestra el carácter correspondiente.
34 – Incrementa “I” en 1 para avanzar en el puntero al REM.
36 – Final del bucle horizontal.
38 – Salto de línea en pantalla.
40 - Final del bucle vertical.
42 – Salto de línea en pantalla.
44 – Muestra en pantalla el número de minas que quedan por localizar.
46 – Salto de línea en pantalla.
50 – Muestra en pantalla el formato de la entrada del movimiento.
51 – Salto de línea en pantalla.
52 – Entrar el movimiento en la variable “A$”.
54 – Coge el primer carácter y lo guarda en la variable “Y”.
56 – Coge el segundo carácter y lo guarda en la variable “X”.
58 - Calcula el puntero en REM del movimiento realizado.
60 – Verifica que el movimiento es correcto.
62 - Coge el tercer carácter y si no se ha introducido nada salta a la línea 68.
63 – Si se indica que hay una mina en una posición donde no la hay muestra un mensaje y finaliza el juego.
64 – POKE a la línea REM para borrar el carácter que haya.
65 – Se decrementa el número de minas.
66 – Si se han localizado todas las minas, finaliza el juego. Se provoca un error mostrando una variable inexistente.
67 – Se vuelve a la línea 20.
68 – Si hay una mina en la posición introducida, muestra un mensaje y finaliza el juego.
70 – Se pone la variable “A” a 0 para usarla como contador de las minas que hay alrededor del movimiento introducido.
72 – Inicio del bucle de posición vertical.
74 – Inicio del bucle de posición horizontal.
76 - Se calcula si en una casilla adjunta al movimiento hay una mina sumando 1 a la variable “A”.
78 - Final del bucle horizontal.
80 – Final del bucle vertical.
82 – Si no hay minas se hace un POKE en la posición correspondiente del REM.
84 – Si hay minas se hace un POKE en la posición correspondiente del REM con el número de minas que hay.
86 – Vuelve a la línea 20.


EL PROGRAMA

MineField-ZX80.png
MineField-ZX80.png (15.83 KiB) Visto 325 veces



PROGRAMANDO EN UN ZX-80
Programar en un intérprete BASIC que ocupa 4 KB es una experiencia dura. Y si quieres hacer algo mínimamente decente, muy dura.

Para situarnos, es un BASIC con unos 30 comandos y funciones, los valores numéricos solo pueden ser enteros de dos bytes, no puedes posicionar nada libremente en la pantalla, solo hay un comando muy simple para gestionar cadenas y no permite matrices alfanuméricas, no puedes consultar el teclado ni entrar caracteres en vídeo inverso, etc. Y así muchas más penurias, hasta llegar al límite de 1 KB de RAM, salvo expansión de memoria o disponer del clon de Wilco2009.

En este caso he vuelto a adaptar un programa que desarrollé en un ZX-81 en el año 2013. Fue mi primer programa de ZX-81 después de 29 años, y el resultado me dejó tan satisfecho que después de este programa han ido cayendo muchos más.

Y como en el caso de otras adaptaciones del ZX-81 al ZX-80, como las del “Sudoku 1K” o el “Light-Out 1K”, el resultado ha superado al original.

Importante destacar que el REM de la línea 1 debe contener 121 caracteres. Los 11 primeros indican las columnas, y los otros 110 hacer de buffer de pantalla e indican la posición de las minas. Al introducir estos 110 caracteres se puede poner cualquier carácter ya que las líneas 6 a 12 se encargan de inicializarlos correctamente.

Cómo adaptar un programa del ZX-81 al ZX-80
El ZX-80 es mucho más simple y limitado que el ZX-81, pero se le puede sacar mucho más rendimiento a ese 1 KB de RAM, ya que tanto las líneas como las variables numéricas ocupan menos. Incluso en algunas cosas es más rápido ya que siempre trabaja en modo FAST.

Así, en la versión del ZX-81 tenías que completar las 100 casillas para saber si habías localizado correctamente las 10 minas que habían ocultas, pero en esta versión hay 15 minas y he podido hacer que muestre el formato del movimiento y otros mensajes, que verifique si el movimiento es correcto y que detecte si hay una mina en una casilla que marques como “mina”, finalizando el juego si te equivocas.

List_ZX80-ZX81.png
List_ZX80-ZX81.png (333.07 KiB) Visto 325 veces

El principal engorro al programar en el ZX-80 es el hecho de no poder acceder libremente a la pantalla, ya que no hay el AT del ZX-81 o del SPECTRUM. Para capear este problema, monto un buffer de pantalla en una línea REM, que puedo POKEar libremente, y después mediante una variable a modo de puntero y un doble bucle la paso a la pantalla. El resultado salta a la vista.

Otra limitación es que, salvo que desconozca como hacerlo, no se pueden introducir caracteres en vídeo inverso directamente desde el teclado, a diferencia del ZX-81. Así, la única forma que he encontrado de introducirlos en el propio listado del programa es POKEando directamente en la memoria. En este caso, la primera fila y la primera columna muestran números en vídeo inverso. Para las columnas he tenido que POKEar en la línea del REM y para las filas mediante un PRINT con un CHR$.


Para terminar
Este es el tercer programa que he programado para el ZX-80, y la verdad es que con la técnica de las líneas REM estoy haciendo programas bastante complejos. Son una auténtica obra de orfebrería, pero pieza a pieza, acaban funcionando.

Pues nada más, que otra prueba superada !!!


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

Avatar de Usuario
javier2112
Mensajes: 72
Registrado: 20 Ene 2020 08:26
Agradecido : 7 veces
Agradecimiento recibido: 9 veces

Re: MINE-FIELD para ZX-80

Mensajepor javier2112 » 11 Jun 2020 00:10

Me parece muy interesante el trabajo que haces con tan poca memoria, en este y otros juegos que has publicado por aquí, así que me he ido corriendo a compilar la última versión del ZEsarUX para probarlo. Lo cargo pero no se que pasa, si es que no se cómo utilizarlo o qué, pero no logro jugarlo bien. En cada tirada da igual lo que introduzca
3/3
0/8
1/3/*

El juego siempre me muestra el tablero en su estado inicial. ¿Alguna idea?

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

Re: MINE-FIELD para ZX-80

Mensajepor dancresp » 11 Jun 2020 00:25

javier2112 escribió:Me parece muy interesante el trabajo que haces con tan poca memoria, en este y otros juegos que has publicado por aquí, así que me he ido corriendo a compilar la última versión del ZEsarUX para probarlo. Lo cargo pero no se que pasa, si es que no se cómo utilizarlo o qué, pero no logro jugarlo bien. En cada tirada da igual lo que introduzca
3/3
0/8
1/3/*

El juego siempre me muestra el tablero en su estado inicial. ¿Alguna idea?

Tendré que añadir algún pantallazo más, pero simplemente hay que poner los números sin la barra.

Así, puedes poner 33 o 33*
Si el movimiento es incorrecto se ignora.

A ver como lo explico mejor...
Buscando la IP de la W.O.P.R. he encontrado mi índice

Avatar de Usuario
javier2112
Mensajes: 72
Registrado: 20 Ene 2020 08:26
Agradecido : 7 veces
Agradecimiento recibido: 9 veces

Re: MINE-FIELD para ZX-80

Mensajepor javier2112 » 11 Jun 2020 07:57

¡Sí, era eso! Como en pantalla aparecen las barras, yo las usaba. Creo que si pones otra captura en mitad de una partida y en medio de un intento, se explicaría mejor.

Me parece muy ingeniosa la técnica de la línea REM.

Saludos.

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

Re: MINE-FIELD para ZX-80

Mensajepor dancresp » 11 Jun 2020 10:09

He modificado la imagen principal donde ya se ve un ejemplo de tirada, y he añadido un texto explicativo de los movimientos y sus consecuencias al principio.
Buscando la IP de la W.O.P.R. he encontrado mi índice

Avatar de Usuario
javier2112
Mensajes: 72
Registrado: 20 Ene 2020 08:26
Agradecido : 7 veces
Agradecimiento recibido: 9 veces

Re: MINE-FIELD para ZX-80

Mensajepor javier2112 » 11 Jun 2020 13:06

He hecho una búsqueda en el foro para recopilar todo tu trabajo y me encuentro con que hay más de lo que esperaba :O ¿No tienes todo ese material recopilado una web propia? Porque en el foro está bien, pero hay que buscarlo (y encontrarlo). Y hablando de recopilar, ¿hace tiempo no se editó una cinta con todos tus programas o me falla la memoria?

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

Re: MINE-FIELD para ZX-80

Mensajepor dancresp » 11 Jun 2020 13:17

javier2112 escribió:He hecho una búsqueda en el foro para recopilar todo tu trabajo y me encuentro con que hay más de lo que esperaba :O ¿No tienes todo ese material recopilado una web propia? Porque en el foro está bien, pero hay que buscarlo (y encontrarlo). Y hablando de recopilar, ¿hace tiempo no se editó una cinta con todos tus programas o me falla la memoria?

Me había planteado hacer un índice aquí, porque lo de la web propia me da pereza...

Los del ZX-80 hablé con una empresa para editar un casete. Está en PAUSE, pero no en STOP.

Y sí, si buscas verás que hay muchos programas... muchísimos, y bastantes posts de equipos y demás.

Respecto a si lo tengo recopilado... Los ladrillos de dancresp
Buscando la IP de la W.O.P.R. he encontrado mi índice

zxpope
Mensajes: 84
Registrado: 02 Ene 2018 02:25
Agradecido : 36 veces
Agradecimiento recibido: 32 veces

Re: MINE-FIELD para ZX-80

Mensajepor zxpope » 11 Jun 2020 15:49

muchas gracias por comentar tu juego
para mi resulta mas interesante que el propio juego


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