EL JUEGO
Este videojuego para sistemas arcade fue desarrollado en 1977 por la empresa Gremlin.
El objetivo del juego consiste en destruir todas las minas del campo minado antes de que acabe el tiempo. Para ello disponemos de una nave que podemos mover por las zonas vacías de la pantalla, y que pueden destruir todo lo que hay en ella. Hay que ir con cuidado porque al explotar las minas destruyen lo que hay a su alrededor.
Si conseguimos nuestro objetivo conseguiremos una partida gratis.
Controles:
Controla la nave con Q – A – O - P.
Pulsa el “espacio” para disparar.
Descargar juego en formato "TAP":
BLOQUES
Se ha dividido el listado en 10 bloques:
- Declaración de las matrices. Llamada a rutinas principales.
- Control de la nave.
- Control del disparo.
- Final de la partida.
- El disparo ha impactado con algo.
- Destruir una mina.
- Perder una vida.
- Presentación e inicio de la partida.
- Rutinas varias.
- DATA con los UDG del juego y el diseño de la zona de juego.
COMO FUNCIONA
Todo el programa ocupa 73 líneas.
A continuación indico el principio de las distintas partes del programa:
10 - Definimos las matrices del juego.
50 – Salto a la subrutina que lee los gráficos, redefine los caracteres y define variables globales y modo de vídeo.
100 – Inicio del bucle principal.
102 – Se consulta el teclado y si no se pulsa ninguna tecla se salta a 140.
110 – Se mueve la nave en función de la tecla pulsada.
140 – Si hay alguna mina pendiente de explotar se va a la rutina correspondiente 350.
150 – Control del disparo. Si está activo salta a 160 y sino mira si se ha pulsado la tecla de disparo.
160 – Mover el disparo en función de su dirección.
190 – Se reduce el tiempo disponible para finalizar la partida.
200 – Si queda tiempo salta a 100.
205 – Final de partida donde se controla si se ha superado el récord y si se han destruido todas las minas.
300 – Control de que ha tocado el disparo.
350 – Rutina que controla la destrucción de minas en cadena.
400 – Una mina ha explotado cerca y nuestra nave queda se destruye.
2000 – Pantalla inicial del juego.
2500 – Inicializar variables para la partida y rutina que coloca las minas.
2600 – Posición inicial de nuestra nave.
2700 – Rutina que muestra el laberinto de puntos en pantalla, sin las minas.
3000 – Selección de colores, borrar de pantalla, ocultar cursor y ocultar el “CAPS” superior.
3010 – Lectura de los DATA de los UDG.
3015 – Lectura de los DATA de los segmentos de la zona de juego.
5100 – Rutina que muestra el marcador de puntos.
5400 – Rutina que muestra el mensaje de fin de partida o partida gratis.
9000 – DATA con los gráficos de los UDG.
9100 – DATA con las distintas filas que forman la zona de juego.
EL LISTADO
Código: Seleccionar todo
10 DIMA$(8),L(78)
50 GOSUB3000:GOSUB2700:GOSUB5400:GOSUB2000
' Inicio del Bucle Principal
100 REPEAT
' Lectura del Teclado
102 J=PEEK(520):IFJ=56THEN140
105 IFJ=157THEN115
106 IFJ=174THEN120
107 IFJ=149THEN125
108 IFJ<>177THEN140
' Mover la Nave
110 IFG<>110THENG=110:GOTO130
111 IFY>0THENIFPEEK(A-40)=32THENY=Y-1:POKEA,32:A=A-40
112 GOTO130
115 IFG<>111THENG=111:GOTO130
116 IFX<31THENIFPEEK(A+1)=32THENX=X+1:POKEA,32:A=A+1
117 GOTO130
120 IFG<>112THENG=112:GOTO130
121 IFY<25THENIFPEEK(A+40)=32THENY=Y+1:POKEA,32:A=A+40
122 GOTO130
125 IFG<>113THENG=113:GOTO130
126 IFX>0THENIFPEEK(A-1)=32THENX=X-1:POKEA,32:A=A-1
' Mostrar la Nave en la nueva posici¢n
130 POKEA,G
' Controlar si hay Minas pendientes de Explotar
140 IFM<NTHEN350
' Control del Disparo
150 IFDTHEN160
152 IFJ<>132THEN190
155 D=1:B=G-109:C=-1
' Mover el Disparo
160 ONBGOTO165,170,175,180
165 IFC<>-1THEN167
166 C=Y:K=A-40:IFC<=0THEND=0:GOTO190ELSE185
167 POKEK,32:C=C-1:IFC>0THENK=K-40:GOTO185ELSED=0:GOTO190
170 IFC<>-1THEN172
171 C=31-X:K=A+1:IFC<=0THEND=0:GOTO190ELSE185
172 POKEK,32:C=C-1:IFC>0THENK=K+1:GOTO185ELSED=0:GOTO190
175 IFC<>-1THEN177
176 C=25-Y:K=A+40:IFC<=0THEND=0:GOTO190ELSE185
177 POKEK,32:C=C-1:IFC>0THENK=K+40:GOTO185ELSED=0:GOTO190
180 IFC<>-1THEN182
181 C=X:K=A-1:IFC<=0THEND=0:GOTO190ELSE185
182 POKEK,32:C=C-1:IFC>0THENK=K-1:GOTO185ELSED=0:GOTO190
' El disparo toca algo?
185 IFPEEK(K)<>32THEN300ELSEPOKEK,108
' Control del Tiempo y Fin del Bucle Principal
190 T=T+1:IFT=10THENT=0:TI=TI-1:PLOT18,1,STR$(TI)+" "
200 UNTILTI=0
' Final de la Partida
205 IFP>RTHENR=P
210 IFE=0THENGOSUB5410ELSEGOSUB5400
215 WAIT500:GETC$:IFETHENGOSUB2000:GOTO100ELSEGOSUB2500:GOTO100
' Que toca el disparo?
300 D=0:F=PEEK(K)
305 IFF=106THENPOKEK,109:P=P+10:GOSUB5100:POKEK,32:GOTO190
310 IFF=107THENP=P+50:N=N+1:L(N)=K-41:POKEK,32
315 GOTO190
' Explosi¢n de una Mina
350 M=M+1:W=97:SHOOT:FORF=L(M)TOL(M)+80STEP40:FORI=FTOF+2
355 K=PEEK(I):IFK=106THENP=P+10
356 IFK=107THENP=P+50:N=N+1:L(N)=I-41
360 POKEI,W:W=W+1:NEXT:NEXT
370 F=L(M):POKEF,32:POKEF+1,32:POKEF+2,32:POKEF+40,32:POKEF+41,32:POKEF+42,32
375 POKEF+80,32:POKEF+81,32:POKEF+82,32:E=E-1:IFM=NTHENGOSUB5100
380 IFPEEK(A)<>32THEN190
' Destrucci¢n de la Nave
400 FORG=113TO109STEP-1:POKEA,G:WAIT15:NEXT:EXPLODE:POKEA,32:GOSUB2600:GOTO190
' Presentaci¢n
2000 GETC$:CLS:PLOT14,12,"PRESS START":WAIT90:GETC$
2010 CLS:PLOT11,9,"HIT ALL MINES FOR":PLOT15,13,"FREE GAME":WAIT90:GETC$
' Poner Minas en la Pantalla e Iniciar Variables
2500 T=0:TI=90:E=78:N=0:M=0:INK0:GOSUB2700:FORF=1TOE
2505 I=48041+40*INT(RND(1)*24+1)+INT(RND(1)*30+4):IFPEEK(I)<>106THEN2505
2510 POKEI,107:NEXT:INK7
' Posici¢n Inicial de la Nave
2600 X=29:Y=16:A=48713:G=113:POKEA,G:D=0:RETURN
' Mostrar la Zona de Juego
2700 CLS:FORF=1TOLEN(B$):PRINT" ";A$(VAL(MID$(B$,F,1))):NEXT:POKE48713,113
2705 PLOT18,0,"TIME":PLOT19,1,"90":P=0:GOSUB5100:RETURN
' Inicio del programa y lectura de gr ficos UDG y Laberinto
3000 INK7:PAPER0:CLS:R=0:POKE#BBA3,0:POKE#26A,10
3010 FORF=46856TO46991:READA:POKEF,A:NEXT
3015 FORF=1TO8:READA$(F):NEXT:READB$:RETURN
' Rutina: Mostrar el Marcador de Puntos
5100 PLOT30,1,RIGHT$("00000"+MID$(STR$(P),2),5):RETURN
' Rutina: Mensaje de Game Over
5400 PLOT18,11,"GAME":PLOT18,14,"OVER"
5405 PLOT5,25,"SINGLE PLAYER HIGH SCORE "+RIGHT$("0000"+MID$(STR$(R),2),5)
5406 RETURN
5410 PLOT16,11,"FREE GAME":PLOT15,14,"PRESS START":GOTO5405
' Gr ficos del Juego (UDG)
9000 DATA0,0,0,0,0,0,0,0,2,2,34,50,54,55,47,46,6,12,12,24,50,54,30,12
9005 DATA0,55,45,14,8,30,54,5,4,49,10,30,61,5,33,46,56,30,7,14,16,8,31,22
9010 DATA15,14,12,12,25,19,22,48,47,39,54,50,49,37,38,32,17,49,56,28,14,6,18,0
9015 DATA0,0,28,20,28,0,0,0,0,28,54,42,54,28,0,0,8,42,42,42,42,42,8,0
9020 DATA36,49,10,30,60,21,35,45,0,8,8,42,62,8,0,0,0,24,16,62,16,24,0,0
9025 DATA0,8,62,42,8,8,0,0,0,12,4,62,4,12,0,0
' Partes y Formato del Laberinto
9100 DATA"jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj"
9105 DATA"j jj jj j"
9110 DATA"jjjjjj jjjjjj jjjj jjjjjj jjjjjj"
9115 DATA"jjjjjj jj jj jjjjjj"
9120 DATA"j jj jj jjjjj jjjjj jj jj j"
9125 DATA"j jjjjj jjjjj j"
9130 DATA"j jjjjj jjj jjj jjjjj j"
9135 DATA"jjjjjjjjj jjjjjjjjj"
9140 DATA"12233345567788776554333221"
APUNTES FINALES
Esta es la versión ORIC del juego programado previamente para el sistema MSX.
A falta de más tiempo libre, ha aprovechado los viajes en tren al trabajo para programar el juego con la versión MS-DOS del emulador EUPHORIC. Afortunadamente este emulador permite, pulsando “F3”, mapear el teclado del ORIC con las teclas del PC lo que facilita mucho la introducción del programa. Desde el emulador he generado el TAP y desde el “Oricutron” de Windows he generado el listado en un fichero de texto, y lo he comentado posteriormente.
El listado de esta versión es muy parecido, y algunas partes idénticas, a la de la versión MSX, teniendo en cuenta las particularidades de cada sistema. Así, se ha cambiado la dirección de la memoria de vídeo y el método de lectura de los controles de la nave. Algunas líneas se han desdoblado para evitar problemas con el “bug” de la instrucción ELSE.
Este ha sido un excelente ejemplo para comparar el rendimiento de estos dos sistemas, y aunque ambas versiones rinden perfectamente, el MSX se ha tenido que “frenar” para evitar que fuera demasiado rápido y aquí no ha sido necesario.
En este aspecto he de reconocer que aunque la velocidad es perfecta durante el desarrollo del juego, me esperaba un mejor rendimiento en el ORIC. Hay que tener en cuenta que en las dos versiones se POKEa directamente en la memoria de vídeo para ganar velocidad y que no hay muchas líneas de código que ejecutar, excepto en el caso de la explosión de una mina o una explosión de minas en cadena, y en el ORIC tira justo lo suficiente.
Principales descartes respecto al arcade original:
- El juego original permite 2 jugadores simultáneos y aquí solo uno.
- La pantalla tiene 28 filas y aquí hay 26 (22 en MSX).
- En el juego original hay 84 minas y aquí 78 (64 en MSX), ya que la zona de juego es algo más pequeña.
- Los gráficos son ligeramente distintos a la versión original.
- Esta versión no permite el uso de joystick.
Por el resto, la mecánica del juego se ha respetado en su totalidad.
Las cosillas de la versión ORIC
Como siempre que se programa en el ORIC, los gráficos se han tenido que rediseñar ya que en lugar de la habitual matriz de 8x8 pixels pasamos a una de 8x6. Así, a la explosión (que ocupa 9 bloques) se le han tenido que recortar 6 pixels horizontalmente, la nave se ha tenido que rediseñar para dejarla en un tamaño real de 5x5 pixels y las minas tienen un aspecto diferente.
Como el ORIC tiene un modo texto de 26 filas y 40 columnas, el aspecto de la zona de juego es casi idéntica a la versión arcade.
Para el control de la nave se lee el teclado mediante un “PEEK 520” y así se evitan problemas con las mayúsculas/minúsculas.
Y para el sonido, una vez más he tirado de los predefinidos por el ORIC.
Reacción en cadena
El juego es técnicamente muy sencillo y la única dificultad ha consistido en saber como resolver el problema de las explosiones de minas en cadena, ya que fácilmente pueden haber 2 o más minas juntas. Para ello he creado una matriz de 78 elementos (uno por mina) con dos punteros: “M“ y “N”.
Cuando nuestro disparo detecta que hemos tocado una mina incrementa el puntero “N”, guarda su posición en la matriz y la borra de la pantalla. A continuación se revisan las posiciones que hay alrededor. Cada vez que se encuentra otra mina se realiza la misma acción.
En la línea 140 miramos si el puntero “M” es inferior a “N” y si es cierto, vamos a la rutina que las hace explotar, incrementando el puntero “M”.
Pues nada más, solo me queda esperar que os guste.
Os invito a probarlo.