EL juego original fue publicado por la compañía QUICKSILVA en el año 1983 para el ordenador DRAGON-32.
El objetivo del juego consiste en ayudar a un gusano a atravesar un campo minado, cruzando desde la parte inferior a la parte superior.
Las minas están ocultas bajo el suelo, pero al movernos nos avisa si hay alguna mina cerca del gusano, para ir con cuidado y tratar de sortearla. Las filas que están junto a la salida y la llegada no tienen minas. Son zonas seguras.
Cada nivel superado supondrá cruzar un nuevo campo con más minas, consiguiendo puntos de BONUS extra si lo hacemos en el menor tiempo posible.
BLOQUES
He dividido el listado en 8 bloques:
- Mostrar la pantalla de presentación.
- Nudo principal de desarrollo.
- Final de juego.
- Pasar Nivel.
- Pantalla de presentación.
- Pantalla de juego.
- Poner las minas en la zona de juego.
- Rutinas varias.
COMO FUNCIONA
Todo el programa ocupa 53 líneas.
A continuación indico el principio de las distintas partes del programa:
10 – Muestra la presentación del juego.
14 – Leemos el teclado y movemos la posición del gusano, si podemos.
170 – Si ha llegado arriba va a 600 y pasa de nivel.
180 – Comprueba si el gusano está encima de una mina. En caso afirmativo salta a 500 y acaba el juego.
190 – Mira si tiene minas a derecha, izquierda y debajo cuando estamos por encima de la zona de seguridad.
195 – Mira si hay una mina encima cuando estamos por debajo de la zona de seguridad.
200 – Si no hay minas (M=0) muestra el mensaje “SAFE”.
210 – Si hay minas indica cuantas hay (M).
220 – Cuando avanzamos nos da 5 puntos (P).
230 – Descuenta el tiempo que se usa para calcular los puntos del BONUS (B).
500 – Rutina de muerte. Hace un sonido, muestra la posición de las minas, imprime el gusano muerto y espera que pulsemos una tecla.
600 – Rutina de pasar nivel. Hace un sonido, una pausa, suma los puntos del bonus, aumenta el número de minas (L) y vuelve a jugar.
1000 – Borra la pantalla y muestra la presentación. Inicializa los puntos (P) y número de minas extras (L).
2000 – Dibuja los bordes de la zona de juego.
2040 – Pone los bordes inferiores pokeando directamente en la memoria de video para evitar el SCROLL automático del sistema.
2050 – Dibuja la zona minada.
3000 –Rutina que coloca las minas en la zona de juego.
3010 – Dibuja las puertas de entrada y salida.
3020 – Inicializa la matriz de las minas.
3030 – Bucle que coloca las minas en la zona de juego.
3040 – Se calcula una posición aleatoria.
3050 – Si esta libre (=0) marca la posición como ocupada (=1), sino busca una nueva posición.
3080 – Inicializa la posición horizontal (X) y vertical (Y) del gusano, altura máxima alcanzada (T), cantidad de Bonus (B) y el Flip-Flop del tiempo (C).
EL LISTADO
Código: Seleccionar todo
10 GOSUB60
14 A$=INKEY$:IFA$=""THEN34
15 C=13:G=32:P=Y*40+X:GOSUB98
16 IFA$="q"AND(Y>2OR(Y=2AND(X=19ORX=20)))THENY=Y-1
17 IFA$="a"ANDY<22THENY=Y+1
18 IFA$="o"ANDX>1ANDY<23THENX=X-1
19 IFA$="p"ANDX<38ANDY<23THENX=X+1
20 P=Y*40+X:F=12288+P:IFPEEK(F)=14THEN40
22 G=19:C=178:GOSUB98
24 IFY=1THEN50
26 M=ABS((PEEK(F-1)=14)+(PEEK(F+1)=14)+(PEEK(F-40)=14)+(PEEK(F+40)=14))
28 P=2:IFM<>0THENT$=STR$(M)+" MINES ":GOSUB99:SOUND(20,100)
30 IFM=0THENT$="<<<SAFE>>>":GOSUB99:SOUND(10,50)
32 IFT>YTHENT=Y:S=S+5:P=34:T$=STR$(S):GOSUB99
34 C=-C:IFC=1ANDB>0THENB=B-5
36 GOTO14
40 G=209:C=6:GOSUB98:P=2:T$="GAME OVER ":GOSUB99
41 FORF=30TO50:SOUND(9,F):NEXT
42 FORF=13432TO14192
43 IFPEEK(F)=102THENPOKEF,6
44 NEXT
46 IFINKEY$=""THEN46
48 GOTO10
50 P=2:T$="YOU DID IT!":GOSUB99
52 FORF=100TO0STEP-20:SOUND(20,F):NEXT
54 FORF=1TO3000:NEXT
56 S=S+B:IFL<160THENL=L+20
58 GOSUB80:GOTO14
60 GOSUB97:P=15:T$="MINED-OUT":GOSUB99
62 PRINT:PRINT"Your mission is to rescue Bill the"
64 PRINT"Worm by breaking down the door of his"
66 PRINT"enclosure which is on then final"
68 PRINT"minefield.":PRINT:PRINT"You begin each level at the bottom of"
70 PRINT"the screen.":PRINT:PRINT"Move using the 'QAOP' keys."
72 PRINTTAB(202);"PRESS ANY KEY"
74 PRINTTAB(198);"(C)Scainet Soft, 2012"
76 IFINKEY$=""THEN76
78 S=0:L=0
80 GOSUB97:C=126:G=216:FORF=40TO79:P=F:GOSUB98:P=F+880:GOSUB98:NEXT
81 FORF=80TO880STEP40:P=F:GOSUB98:P=F+39:GOSUB98:NEXT
82 P=28:T$="SCORE:"+STR$(S):GOSUB99
84 P=2:T$="MINE LAYING...":GOSUB99:P=59:T$=" ":GOSUB99:P=939:GOSUB99
86 C=102:G=14:POKE12369,32
88 FORF=1TO50+L
90 P=INT(RND(1)*760)+120:IFPEEK(12288+P)<>32THEN90
92 GOSUB98
93 NEXT
94 P=940:G=19:C=178:GOSUB98
95 X=20:Y=23:T=Y:B=1000+L*100:C=1
96 P=2:T$="GO... ":GOSUB99:RETURN
97 PRINTCHR$(11):RETURN
98 POKE13312+P,C:POKE12288+P,G:RETURN
99 I=12288+P:FORF=1TOLEN(T$):POKEI,ASC(MID$(T$,F,1)):I=I+1:NEXT:RETURN
APUNTES FINALES
Por fin me he lanzado a programar en el AQUARIUS. Puedo asegurar que es un ordenador desconcertante. ¿Es tan malo como su fama? Personalmente creo que no, e incluso en algunos aspectos es superior a ordenadores con mejor fama.
Tenemos un ordenador con aspecto de juguete, un teclado incómodo pero fiable, una pantalla de 40x25, 16 colores, sonido más que decente, un juego de caracteres muy completo y un buen BASIC que encima, es rápido.
¿Que le falla?
Solo 4 KB de RAM (ampliables), de los que 2 KB están reservados por la memoria de vídeo y para BASIC solo quedan 1,7 KB disponibles.
Falta de EDITOR en BASIC. Increíblemente cualquier error en una línea de programa obliga a teclearla de nuevo entera. Cada línea admite un máximo de 72 caracteres. Si la línea que entras ocupa dos líneas en pantalla tampoco puedes hacer un "Backspace" de la parte de la primera.
Falta de LOCATE y COLOR. Parece que para el intérprete BASIC se han basado más en el MBASIC que en el GW-BASIC. Así, no hay comandos para hacer un PRINT en una posición determinada de la pantalla, ni en un color determinado. Se tiene que POKEar directamente en la memoria de video.
Cassette demasiado sensible. Si no das con el punto de volumen exacto no cargas absolutamente nada, y aún y así, a veces dice que ha cargado bien pero ha modificado algún carácter del programa y falla.
El teclado es fiable, pero el aspecto, tamaño y disposición de las teclas no es cómodo. Eso si, muchos comandos BASIC se entran directamente con la pulsación de "CTRL" y una letra.
Pues con este panorama me he decidido a adaptar el juego "MINED-OUT" programado para el LASER 200.
Lo primero que hice fue programarme 3 sencillas rutinas que me han facilitado mucho las cosas. Se asigna el valor a las variables correspondientes y se hace un GOSUB.
GOSUB 97: CLS - Borra la pantalla.
GOSUB 98: GRAFICO - Pone un carácter (G) con un color (C) en una posición absoluta (P) de la pantalla.
GOSUB 99: LOCATE - Pone un texto (T$) en una posición absoluta (P) de la pantalla.
La posición absoluta funciona igual que el PRINT@ del DRAGON y el LASER. Se calcula con la siguiente fórmula: vertical*40+horizontal. Siendo 0 la primera fila y columna.
La pantalla es de 40x25 caracteres, pero desde PRINT solo podemos usar 38x24. La primera fila, y la primera y última columna son inaccesibles si no es mediante POKEs. Con esta rutina nos saltamos esta limitación.
En esta versión me he ahorrado la matriz donde guardaba la posición de las distintas minas. He optado por colocarlas en pantalla con igual color de tinta y fondo. No se ve pero está allí. Al moverme, borro el personaje de la posición actual, y antes de ponerlo en la nueva miro si en esa posición de la memoria de pantalla hay una mina. En caso afirmativo pongo el carácter de la explosión y visualizo las minas cambiando solo su atributo de color, sino pongo el protagonista en la nueva posición.
El AQUARIUS no tiene auto-repetición en las teclas, con lo que no he tenido que evitarlo.
Para terminar, me han sobrado poco más de 100 bytes. Al final me aparecía el mensaje de error OM (Out of Memory) y he tenido que eliminar algún texto de la presentación y algún sonido. Como en los tiempos del ZX-81, vamos.
Os invito a probarlo.