SUB-K-MARINE para ZX-81

dancresp
Mensajes: 5251
Registrado: 13 Nov 2010 02:08
Agradecido : 90 veces
Agradecimiento recibido: 185 veces

SUB-K-MARINE para ZX-81

Mensajepor dancresp » 15 Abr 2016 00:01

Sub-K-Marine_2.gif
Sub-K-Marine_2.gif (42.86 KiB) Visto 1622 veces


EL JUEGO
El objetivo del juego consiste en evitar que los submarinos lleguen a la derecha de la zona de juego.
Para evitarlo controlamos un barco que puede disparar cargas de profundidad para destruir a los submarinos.

Cada submarino destruido nos proporciona un punto.

Disponemos de una única vida.

Controles:
Movemos el barco a la izquierda con "1" y a la derecha con "3".
Disparamos una carga de profundidad con la tecla "0".

Descargar el programa en formato ".p":
Sub-K-Marine.rar
(523 Bytes) Descargado 65 veces


BLOQUES
He dividido el listado en 4 bloques:
- Impresión de la zona de juego e inicialización de variables.
- Mover los submarinos.
- Mover el disparo.
- Mover el barco.


COMO FUNCIONA
A continuación detallo el funcionamiento de las 30 líneas del programa.

Se utilizan las siguientes variables:
F – Variable numérica de apoyo.
H – Variable numérica coordenada horizontal del barco.
P - Puntero al buffer de la impresora
U - Variable numérica que contiene el valor 1.
X - Variable numérica coordenada horizontal del disparo.
Y - Variable numérica coordenada vertical del disparo.

2 - La variable "P" apunta al inicio del buffer de impresora.
3 - La variable "U" contiene 1.
10 - Dibujamos el mar y el fondo.
15 - La variable "H" contiene la posición inicial del barco.
17 - La variable "Y" contiene la posición vertical del disparo. Inicialmente a 0.
18 - La variable "X" contiene la posición horizontal del disparo.
20 - Dibujamos el barco en su posición.
21 - Generamos un número aleatorio correspondiente al submarino a mover.
22 - Si el submarino ya existe salta a la línea 24.
23 - Generamos un número aleatorio entre 1 y 3, y si es menor de 1 salta a la línea 30.
24 - Incrementamos en 1 la posición horizontal del submarino seleccionado.
25 - Dibujamos el submarino en su posición correspondiente.
26 - Si el submarino ha llegado a la posición máxima, mostramos la puntuación y acaba el programa.
30 - Si el disparo no está activo salta a la línea 40.
31 - Borramos el disparo de la pantalla.
32 - Incrementamos en 2 la posición vertical del disparo.
33 - Si la posición vertical del disparo es 18, la ponemos a 0.
34 - Si el disparo no toca el submarino de esa fila salta a la línea 40.
35 - Borramos el submarino al que hemos tocado.
36 - Ponemos a 0 la posición del submarino.
37 - Incrementamos la puntuación en 1.
38 - Ponemos la posición vertical del disparo "Y" a 0.
39 - Si el disparo está activo lo dibujamos en pantalla.
40 - Si no se pulsa ninguna tecla saltamos a 21.
42 - Si pulsamos "1" movemos el barco a la izquierda.
43 - Si pulsamos "3" movemos el barco a la derecha.
44 - Si no pulsamos "0" o el disparo ya está activo saltamos a la línea 20.
50 - Ponemos la posición vertical del disparo "Y" a 2.
51 - Ponemos la posición horizontal del disparo "X" al final del barco.
52 - Saltamos a la línea 21.


EL PROGRAMA
Sub-K-Marine.gif



APUNTES FINALES
Después de mi reencuentro con la programación de juegos de acción para el ZX-81 1K, con el desarrollo de "Jumping Ja-K", he aprovechado para programar un juego al que le tenía muchas ganas. Hace muchos años programé una versión para el equipo con 16 K, pero el movimiento era excesivamente lento.

Esta versión, pese a sus limitaciones, funciona bastante mejor.

A falta de tiempo libre he usado el emulador “EightyOne” en mis viajes al trabajo en tren, y la verdad es que finalizar el juego me ha llevado unas 5 horas.

La verdad es que lo empecé a programar y lo dejé a medias porque en un principio no tiraba bien, y tuve el presentimiento de que no cabría porque faltaban las partes más importantes del programa por introducir. Pero dándole vueltas al tema llegue a la conclusión de que si que podía caber. Y estudié como ahorrar memoria... una vez más.

Metiendo el juego en 1K
El sistema dispone de 1024 bytes, y se reserva 125 bytes para su uso interno, más una cantidad variable de bytes para las pilas del calculador y otras.

Esto hace que, por norma general, los programas no ocupen más de 550 bytes y la zona de juego no supere los 12x12 caracteres. En total suma unos 700 bytes, a los que hay que sumar la zona de variables y lo anteriormente dicho.

En este caso, el programa en BASIC ocupa 525 bytes, y he tenido que definir 6 variables numéricas que ocupan unos 42 bytes más. Sumado a lo anterior ya vamos por los 717 bytes, más la zona de las pilas.

La zona de juegos mide 19x16=304 bytes, más los 25 códigos de fin de línea. En total 329 bytes.

En resumen: 329 bytes de vídeo + 567 del programa + 125 del sistema = 1021 bytes de un total de 1024 bytes.

En estas condiciones, el programa no cabe ni en broma.


¿Un área de juego de 19x16 en 1KB?
Como decía, con un programa de más de 500 bytes, la zona de juego no suele superar los 12x12 caracteres, ya que ocupa 144+25=169 bytes.

En este programa la zona de juego mide 19x16 caracteres, lo que ocupa 304+25= 329 bytes.
¿Y como se hace?

El truco es muy sencillo: el barco, los submarinos y el disparo solo se muestran en las filas pares (excepto la 4), y todas las filas impares están vacías (excepto la 1), con lo que no ocupan memoria. Esto provoca que el disparo se mueva más bruscamente, pero da la sensación de ser un juego que ocupa casi la mitad de la pantalla.

Y como se puede ver en el gráfico, de las 7 filas donde aparecen los submarinos solo una llega a la columna 15, ya que las otras como mucho llegan a la 14, detalle que permite ahorrar 6 bytes.

Sub-K-Marine_VRAM.gif
Sub-K-Marine_VRAM.gif (58.98 KiB) Visto 1622 veces


Creo que es el programa con la zona de juego más grande que he programado nunca en el ZX-81 de 1KB.


Ahorrando más memoria...
El programa debe gestionar varias cosas y sigue siendo necesario aprovechar hasta el último byte. Para ello he vuelto a prescindir del uso de matrices numéricas para almacenar las posiciones de los 7 submarinos, y he vuelto a usar parte de los 33 bytes del buffer de la impresora, usando la posición vertical del submarino como índice en el buffer, y usando el primer byte para almacenar la puntuación.

Esta técnica me obliga a usar POKE y PEEK para guardar o recuperar los valores del buffer, cosa que le da al listado un toque “Commodoriano”.


... y mejorando el rendimiento
Para que el programa vaya lo más rápido posible en uno de los BASIC más lentos de los 8 bits he estructurado el programa lo mejor posible y he usado la función CODE para almacenar valores numéricos en lugar de VAL, ya que tengo comprobado que la conversión del valor correspondiente con CODE es un 35% más rápido que con VAL. El problema es que el rango de CODE es muy pequeño, y a veces, no hay más remedio que usar VAL.

El submarino a mover se selecciona aleatoriamente para que no se pueda predecir la velocidad con la que se mueven y así ser más difícil tocarlo, pero en cada pasada por el bucle principal de desarrollo del juego, solo se mueve uno.

Sea como sea, para mover el barco, el submarino correspondiente y el disparo, funciona más que bien.


Os invito a probarlo.

Sub-K-Marine_1.gif
Sub-K-Marine_1.gif (42.75 KiB) Visto 1622 veces

Sub-K-Marine_3.gif
Sub-K-Marine_3.gif (43.74 KiB) Visto 1622 veces

Sub-K-Marine_2.gif
Sub-K-Marine_2.gif (42.86 KiB) Visto 1622 veces

Avatar de Usuario
minter
Mensajes: 1982
Registrado: 22 Jul 2014 18:51
Agradecido : 1426 veces
Agradecimiento recibido: 592 veces

Re: SUB-K-MARINE para ZX-81

Mensajepor minter » 15 Abr 2016 00:39

Ostras!!! Que bueno!!!

Este juego lo tecleé hace muchos años en el commodore, y su listado era largo de narices. Y para colmo, sólo tenía un submarino por enemigo.

La diferencia con el juego original (Recreativa DeepScan) era que los submarinos disparaban cargas hacia arriba también. Y que podías soltar varias cargas de una vez.

Imagen

Pero que versión mas chula la tuya EN UN SOLO KA!!! -thumbup

También recuerdo que la recreativa sonaba un BIP!!! mogollón de fuerte. Y para colmo, cuando jugábamos, también hacíamos BIP nosotros. Y la Jefa de los recreativos siempre nos reñía con apagarnos la máquina!!! -507

Como siempre, te sales en 1Kb!!! Enhorabuena!!! -thumbup

Avatar de Usuario
ron
Mensajes: 18109
Registrado: 28 Oct 2010 14:20
Ubicación: retrocrypta
Agradecido : 1005 veces
Agradecimiento recibido: 1071 veces

Re: SUB-K-MARINE para ZX-81

Mensajepor ron » 15 Abr 2016 07:56

Wally Dancresp desde que te entró el virus 1K estás que te sales.
Bravo AGAIN !!! +1

Ben-kenobi
Mensajes: 513
Registrado: 01 May 2014 23:06
Agradecido : 9 veces
Agradecimiento recibido: 32 veces

Re: SUB-K-MARINE para ZX-81

Mensajepor Ben-kenobi » 15 Abr 2016 09:06

Me estais picando ! Lo mismo me llevo el zx81 a retroparla mañana jeje.

dancresp
Mensajes: 5251
Registrado: 13 Nov 2010 02:08
Agradecido : 90 veces
Agradecimiento recibido: 185 veces

Re: SUB-K-MARINE para ZX-81

Mensajepor dancresp » 15 Abr 2016 20:18

Minter escribió:Este juego lo tecleé hace muchos años en el commodore, y su listado era largo de narices. Y para colmo, sólo tenía un submarino por enemigo.

La diferencia con el juego original (Recreativa DeepScan) era que los submarinos disparaban cargas hacia arriba también. Y que podías soltar varias cargas de una vez.

Evidentemente este juego me trae muy buenos recuerdos, sonido incluido, y ha sido la fuente de inspiración de esta versión.

Y ni que decir que me habría encantado poder lanzar varios disparos y que dispararan los submarinos, pero... 1K es 1K.
Eso si, no tengo ninguna duda que antes o después caerá una versión para el MSX.

ron escribió:Wally Dancresp desde que te entró el virus 1K estás que te sales.

Por temas de tiempo libre no me puedo liar con programas más complejos, pero coñe... el tiempo que lleva meter el programa con calzador en 1K !!! -banghead

Avatar de Usuario
kikems
Mensajes: 2639
Registrado: 30 May 2013 19:23
Agradecido : 620 veces
Agradecimiento recibido: 916 veces

Re: SUB-K-MARINE para ZX-81

Mensajepor kikems » 16 Abr 2016 07:27

Dancreep gracias por este aporte. Siempre es de agradecer que alguien cree y comparta libremente este tipo de contenidos retro.


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