APRENDE A PROGRAMAR
GRÁFICOS
( AA j a AS A ALAS A A y A SS SEE E AS | A ES AS a A o - s a NS j pes S E 5, " d O
Diseño: Cooper West
Edición: James McCarter Programas: Steve Rodgers Programas MSX: Angel García García Nustraciones: Gerard Brown
Andrew Farmer
Traducción: Angel García García
El traductor desea expresar su agradecimiento a Gustavo Flores Maza por su colaboración en este libro
Queda prohibida la reproducción total o parcial de la presente obra bajo cualquiera de sus formas, gráfica o audiovisual, sin la autorización previa y escrita del editor, excepto citas en revistas, diarios o libros, siempre que se mencione la procedencia de las mismas.
Título original: MOVING GRAPHICS
O 1985, Aladdin Books Ltd.
O 1986, de la edición española, E. G. Anaya. Villafranca, 22. 28028 Madrid.
LS.B.N.: 84-7525-362-8
Depósito legal: M. 20985-1986
Impreso por: Edime, S. A. Calle D, esquina a F. Polígono Industrial Arroyomolinos. Móstoles (Madrid) Impreso en España - Printed in Spain.
APRENDE A PROGRAMAR
Marcus Milton
ANAYA
LA
NN
AD Introducción
Si tienes un ordenador seguro que alguna vez has jugado a algún tipo de juego de Invasores. En este libro encontrarás un programa
yz que te permitirá crear tu propio juego de “marcianos”. El PS programa se da tanto para el sistema MSX como para el 2 $ Spectrum.
La efectividad de un juego de invasores se basa en los gráficos - móviles. El principio es similar al que se utiliza en los dibujos animados: los caracteres antiguos son borrados de la pantalla 7 antes de imprimirlos en su nueva posición, logrando así la impresión de movimiento. El programa ha sido desglosado en ES bloques lógicos, y un texto paralelo explica cómo funciona cada sección. Encontrarás, por ejemplo, cómo “sabe” el ordenador cuándo un invasor ha sido alcanzado por uno de tus misiles. El escribir un programa en bloques lógicos no sólo facilita su 7 comprensión tanto al programador como a otras personas; O también le hace rodar más rápido y reduce la posibilidad de E errores del mismo. Al finalizar alguno de los apartados puedes a probar la sección de programa que acabas de teclear (incluso el 7 error más pequeño puede hacer que el programa no funcione). Si as algo falla, examina el listado con cuidado. Buscar fallos en un 7 programa es como jugar a un juego de detectives; las pistas están ahí para que las localices.
O
Contenido
Caracteres definidos por el usuario... 8 “Principios de la animación 10 El organigrama 12 MER A A
SPECTRUM 18
GANAR Y -PERDER= o as
MSX 34 SPECTRUM 36 Listado de los programas 40
ÉS
I+1)2 ¿EN VBs=1 E, E E G0syB 1500. MATE NR " “SLEN(Rs .) ETURN , OR R$==.
Caracteres definidos por el usuario
Cada carácter del teclado que pulses se imprime en la pantalla a base de puntos oscuros sobre una matriz de 8 por 8. Los caracteres que forman el teclado están ya definidos en la memoria del ordenador. Sin embargo es posible definir nuestros propios caracteres. ¿Cómo hacerlo?
MSX
En el sistema MSX estos caracteres reciben el nombre de sprites. Una de las ventajas de este sistema frente a otros ordenadores es que podemos mover los sprites muy fácilmente por la pantalla, como luego veremos. La base de la definición de sprites es una matriz de 8 por 8 cuadrados sobre la cual sombreamos la figura deseada. El ejemplo que vamos a sequir es el invasor que se empleará en el juego.
Para convertir la matriz en una expresión comprensible por el ordenador toma cada fila, empezando por la A, y suma los números correspondientes a los cuadrados sombreados. Por ejemplo la fila A tiene asociado el número 32+4=36. Para introducir el carácter en el ordenador teclea el programa inferior.
SPRITE (I) es una variable de cadena especial empleada en la definición de sprites. El invasor ha sido asignado al plano de definición 1, según indica el argumento de dicha función. Los datos del programa corresponden a los valores de las filas A a H. En la siguiente sección veremos cómo situar el sprite en la pantalla.
10 SCREEN 2,0 E 20 FOR I=1 TO 8:READ N: A$=A$+CHR$ (N) : NEXT E 30 SPRITES(1)=A$ 40 GOTO 409
DATA 36,36,126,255,153,255,90,66
SPECTRUM
En primer lugar diseña sobre el papel el carácter que quieres conseguir mediante una cuadrícula de 8 por 8. Sombrea los cuadros correspondientes para construir una figura; ésta puede tener cualquier forma. El Spectrum te permite describir hasta 21 caracteres definidos por el usuario. El ejemplo que aquí mostramos es el invasor que se empleará en el juego. El ordenador asigna a cada cuadro el valor 0 ó 1. El valor 1 corresponde a un cuadrado sombreado en el gráfico, y 0 corresponde a un cuadrado blanco. Toda la información que el ordenador necesita para construir el carácter debe presentarse de este modo. Cada fila de la cuadrícula que compone el carácter se define mediante una secuencia de ceros y unos o dígitos binarios (bits). Cuando se ruede el programa el ordenador almacenará cada fila como un paquete de ocho bits llamado byte. Las sentencias POKE alteran la posición de memoria a la que hacen referencia introduciendo el valor indicado. En nuestro caso este valor lo definimos en forma binaria mediante BIN.
El ordenador interpreta los bytes como números binarios, que son almacenados en una parte especial de la memoria reservada para caracteres definidos por el usuario. Las direcciones correspondientes a estas posiciones de memoria comienzan en la 32600 en el Spectrum de 16 K y en la 65368 en el de 48 K. Para introducir el invasor en el de 16 K modificarás las posiciones 32600 a 32607 ambas inclusive; en el de 48 K e la 65368 a la 65375. Una vez hecho ésto para dibujarlo en el centro de la pantalla teclea:
RUN i EP) PRINT AT 19,103 "de
El er: se obtiene poniendo el ordenador en modo gráfico (CAPS SHIFT y 9) y pulsando A.
Principios de la animación
MSX
Hemos visto en el apartado anterior cómo definir un sprite, ahora veremos cómo situarlo y moverlo por la pantalla. Para localizar sprites emplearemos la siguiente sentencia:
PUT SPRITE n? de plano, (X,Y), color
Al asignar un número de plano conseguimos que los sprites de planos inferiores tengan una prioridad mayor que los superiores, de modo que en caso de superponerse las imágenes de los dos planos sólo se verá la del plano de más prioridad. El sprite se localizará en la pantalla donde indiquen las coordenadas (X,Y); estas se refieren a la esquina superior izquierda; sólo hay que destacar que si Y = 209 el sprite correspondiente desaparece de la pantalla. El color debe ser un número del 0 al 15 y selecciona el color del sprite.
Borra la línea 40 y añade al programa anterior las siguientes sentencias:
450 FOR I=9 TO 190 : 50 PUT SPRITE 1, (1,1), 60 NEXT
7% GOTO 40
Una de las principales ventajas de los sprites es que se pueden mover por la pantalla muy fácilmente. Para ello sólo hay que modificar las coordenadas X e Y; de esta forma el sprite será eliminado de su posición anterior y colocado en la nueva.
En nuestro ejemplo el bucle entre las líneas 40 y 60 se encarga de alterar estas coordenadas en una unidad, y la línea 50 imprime el sprite en su nueva posición. De esta forma conseguiremos que el sprite se mueva diagonalmente por la pantalla. La línea 70 evita que una vez finalizado el programa regresemos al modo directo.
SPECTRUM
El efecto de movimiento lo conseguiremos imprimiendo una figura en la pantalla, borrándola y volviéndola a imprimir en una posición contigua. Al repetir esta acción la figura parece moverse rápidamente por la pantalla. El programa inferior demuestra este efecto.
La letra X se mueve por la pantalla mediante el lazo FOR... NEXT de variable 1. Los valores de esta localizan la “X”. Cuando la letra se mueve una posición a la derecha los espacios se mueven con ella. El carácter blanco de la izquierda se escribirá sobre la antigua X, borrándola de la pantalla.
LS 20 FOR 1=9 TO 29 30 RREINT AD Sali Xx" 40 FOR D=1 TO SO90:NEXT D NEXT I
En la línea 40 se introduce un pequeño bucle de retardo; sin él el ordenador ejecutaría el movimiento tan rápido que sería imposible seguirlo.
En el juego de los invasores emplearemos los mismos principios de animación que acabas de ver para conseguir que los alienígenas se muevan por la pantalla.
El organigrama
A la hora de planificar el juego es una buena idea hacer un organigrama. Este es el modo oportuno de establecer la secuencia de pasos lógicos que definen tu programa. Consiste en cajas de diferentes formas que representan decisiones, acciones, etcétera y que se conectan entre sí mediante “líneas de flujo”. El organigrama se emplea para crear el programa de control. Este es el núcleo del programa, que llama a otras secciones del mismo cuando son necesarias.
Aa UCA MEE UE A A A E
NL | AE la AE PONES INES Av
LA ld LA
2/58 ATA ERA/ A EIRKA
$ NO] Y
Q DER
ON a
EL PROGRAMA DE CONTROL Y LA INICIALIZACION
El programa de control muestra la estructuración del programa, empleando una serie de bloques lógicos llamados subrutinas. Estas están agrupadas en el organigrama para mostrar su secuencia de ejecución. La primera sección del programa se encarga de presentar en pantalla las instrucciones del juego.
AO A ANA GIA En unos instantes estarás bajo el ACI RENA AO TOA
SAR RAT las naves vargonianas.
Emplea el cursor para mover tu nave.
AUREA AE disparar el láser.
ARANA A RN A A
13
SA
REM Invasores
GOSUB 809009:REM Inicializar
30 GOSUB 7000:REM Pantalla
GOSUB 10660:REM Alienigena
50 GOSUB 20006:REM Jugador
60 IF (GANAR OR PERDER)=1 THEN GOTO 706 ELSE GOTO 40 IF GANAR=1 THEN GOSUB 5000:GOTO 40
89 GOSUB £000: REM Perder
90 END
O 3
O SS
Si
SO O
Generalmente la línea inicial de un programa —10 en nuestro caso— se emplea para identificarle. En la programación de juegos los requisitos iniciales son mostrar en la pantalla las instrucciones e inicializar todas las variables que se emplearán en el juego. Todo ésto lo lleva a cabo la subrutina Inicializar, llamada en la línea 20. A continuación ejecutamos la subrutina Pantalla que se encarga de dibujar el escenario del fondo compuesto por estrellas y planetas; además, escribe el mensaje que nos indicará el número de alienígenas abatidos.
Las líneas 40 a 60 constituyen el lazo principal del programa y contienen las subrutinas más empleadas en el mismo. La subrutina Alienígena consigue que cada invasor, elegido aleatoriamente, descienda por la pantalla. La subrutina Jugador permite que éste mueva su nave y ataque a los invasores con lásers. La línea 60 estudia si se ha ganado o se ha perdido, comprobando si alguno de los indicadores GANAR o PERDER están activados, en cuyo caso sale del lazo y salta a la línea 70. Si estos indicadores aún no se han activado volvemos al comienzo del lazo (línea 40).
La línea 70 comprueba si el indicador GANAR está a 1, en cuyo caso llama a la subrutina Ganar, y tras ejecutarla el programa vuelve a la línea 40 preparado para renovar la pantalla de invasores. Si no se ha ganado el juego se llama a la subrutina Perder, que imprime en pantalla un mensaje e invita al jugador a intentarlo de nuevo. El programa finaliza en la línea 90 con la sentencia END.
Antes de comenzar conviene estudiar sobre el papel cómo va a quedar la pantalla. En los ordenadores MSX la estructura de la misma depende del modo en que estemos operando. La primera pantalla de presentación opera en modo 0 (modo texto). La pantalla en este modo se compone de 24 líneas de 40 caracteres por línea.
La primera subrutina que llama el programa es Inicializar definida a partir de la línea 8000, al final del listado. La razón de ponerla al final es que cada vez que se llama a una subrutina el ordenador estudia el programa desde el principio hasta encontrarla. Como
14
3739
34567829101 1213141516 17 4 19011 1UDASIVAD AB RIA I5 3
0/12 aaa alle alal OMENZ
AAA RARA d ANTES DE COMENZAR 7 AA aja] au AAA SOBRE EL PAPEL AHHH ++ HARAN AAA cómo va A QUEDAR. E as HA A NS Sta eBraras| 111] ados ire rapres| ESraRRS 1] Ela Ha ad aria pe rivas pres TA AAA era varon IATA AAA AA Erie etem a Horas Aa] AP VErE em
AS IMA O or arrest T1TFT7
AA AS HA 0 5 5 [| LI ova AAA ARA TARA MPvER O
ajajaja o rear | ASRAROAR Á
Á
esta subrutina se utiliza una sóla vez conviene ponerla al final, con lo que evitaremos retardos inútiles en la ejecución del programa. Las líneas 8010 a 8130 presentan la primera pantalla; ésta indica al jugador en qué consiste el juego y cómo mover la nave y disparar al enemigo.
La línea 8010 borra la pantalla estableciendo el color del fondo y borde en negro y el texto en blanco. Asimismo borra la línea que indica las teclas de función y desactiva el “click” de las teclas, que sería bastante molesto a la hora de actuar sobre los mandos de la nave.
8000 REM Inicializar SCREEN 0,0,0:COLOR 15,1,1:kEY OFF:CLS LOCATE 2,5,0: PRINT "ERES UN PILOTO SOLITARIO ENCARGADO" LOCATE 4,6,0: PRINT "DE PROTEGER EL PLANETA TIERRA." LOCATE 6,7,0:PRINT "EN UNOS INSTANTES ESTARAS"
LOCATE 9,9,0:PRINT "DEL PLANETA VARGON. " LOCATE 3,11,0:
PRINT "TU MISION ES EVITAR QUE ATERRICEN" LOCATE 7,12,0:PRINT "LAS NAVES VARGONIANAS. " LOCATE 1,14,0:
PRINT "EMPLEA EL CURSOR PARA MOVER TU NAVE"
LOCATE 8,17,0:PRINT "PARA DISPARAR EL LASER”
0600000060
LOCATE 4,20,0: PRINT "ENTABLAR COMBATE CON EL ENEMIGO"
15
LOCATE 5,8,0:PRINT "BAJO EL ATAQUE DE INVASORES"
LOCATE 6,16,0:PRINT "PULSA LA BARRA ESPACIADORA"
LOCATE 6,19,0:PRINT "PULSA CUALQUIER TECLA PARA"
30008080
ALIENS=INVAS: COL 1S=0: AUX=1 81509 DIM XC(INVAS):DIM Y(INVAS) 8160 FOR A=1 TO INVAS 8170 X(A)=24*A: Y (A) = NIVEL NEXT A
Mientras el jugador lee las instrucciones el ordenador puede seguir inicializando las variables empleadas en el juego. Esto se lleva a cabo en las líneas 8140 a 8180. En la primera se establecen además una serie de indicadores (flags); son variables que pueden ser activadas o desactivadas para indicar si una condición es verdadera o falsa. Así PERDER y GANAR se desactivan pues aún no se ha empezado a jugar. COLIS y AUX nos serán útiles cuando estudiemos si un misil ha colisionado con un alienígena. MAR será el marcador del juego e indicará el número de invasores destruidos. XP es la posición de la nave sobre el eje X de la pantalla y NIVEL la posición vertical desde la que comenzarán a descender los alienígenas. El número de ellos al comienzo del juego se establece mediante la variable INVAS, que permanece invariante a lo largo del juego. Se necesita una segunda variable ALIENS que contenga el número de alienígenas que quedan en cualquier momento del juego.
La línea 8150 establece dos matrices X e Y en las que guardaremos la posición horizontal y vertical de cada alienígena —de ahí que se dimensionen al valor de INVAS. El bucle FOR... NEXT establece las posiciones iniciales de cada invasor.
Las instrucciones siguientes definen la forma de los tres sprites empleados en el juego: el invasor, la nave y el misil. El procedimiento es el mismo seguido en la introducción (hemos reproducido también los datos necesarios para cada sprite). La sentencia 8230 es un recurso típico para detener la ejecución de un programa hasta que no se pulse una tecla.
ON SPRITE GOSUB 4000:SPRITE OFF Q$=INPUTS$ (1) RETURN
REM Datos sprites DATA 16,16,56,16,16,16,56,108:REM Misil
DATA 16,56,16,1864, 186, 186,238, 108: REM Nave DATA 36,36,126,255, 153,299, 70,66: REM Invasor
300090
16
PERDER=9: GANAR=09:2 MAR=0: XF=120: NIVEL=83: INVAS=1
FOR I=1i TO 8:READ N:M$=M$+CHR$(N):NEXT:REM Misil FOR I=1 TO 8:READ Nz N$=N$+CHR$ (N) ¿NEXT:REM Nave FOR I=1 TO 8:READ N: A$=A$+CHR$(N):NEXT:REM Invasor
La siguiente subrutina que llamaremos se encarga de establecer el fondo de la pantalla. En primer lugar pasa el ordenador al modo 2 (modo gráfico) en el que tendremos una resolución de 256 por 192 “pixels* —puntos en la pantalla—, y establece el color del fondo y borde a negro y el de texto a blanco. Tras borrar la pantalla la línea 7020 establece los sprites correspondientes a la nave y el misil en los planos 11 y 12. La línea 7030 asigna a los planos 1 a 10 sprites con la forma del invasor.
El bucle 7040 a 7060 dibuja 60 estrella colocadas en puntos aleatorios de la pantalla y con uno de los colores disponibles —elegido también de forma aleatoria. Las líneas 7070 a 7100 se encargan de dibujar el resto de la pantalla.
REM Pantalla
SCREEN 2,0,0: COLOR 15,1,1:CLS
SPRITES (12)=N$:SPRITES (11)=M$
FOR I=i TO 10:SPRITES(1)=A$: NEXT
FOR S=i TO 640
X=INT(RND (5) *250) : Y=INT(RND (5)*190) :
PSET (X,Y),RND(1)+*15
NEXT S
CIRCLE (52,28),16,9:CIRCLE (44,28),16,979,4.795673, 1.32645:PAINT (44,28),9
CIRCLE (192,42),25,7: CIRCLE (180,42),24,7,4.95673, 1.32£545: PAINT (180,42),7
CIRCLE (0,192),60,10,0,-3.1459/2:
LINE (0,192)-(60,192),10:PAINT (5,190),10,10 PRESET (2009,144),4: DRAW"G32F1£E32H16R8SF 1 6L8BR8G32 L8"“.PAINT (192,168),4,4
OPEN "GRP:" AS *+1:PRESET (32,0):
PRINT $1, "INVASORES DESTRUIDOS: "3MAR
RETURN
La última parte de esta subrutina se encarga de imprimir el número de invasores. Como siempre para imprimir texto en pantallas gráficas usaremos el comando OPEN y el descriptor de periférico “GRP:”; PRESET posiciona el texto en el punto deseado y PRINT lo imprime. Al lado del mensaje aparecerá el valor actual de MAR, que cambiará a lo largo del programa.
SL A El programa de control llama a todas las subrutinas empleadas en el juego siguiendo un orden lógico. Cada subrutina es llamada mediante la instrucción GO SUB, seguida del número de línea correspondiente. Las declaraciones REM se emplean para recordar qué es lo que hace cada subrutina.
REM Invasores GO SUB 8000: REM Inicializar
GO SUB 7000: REM Pantalla GO SUB 10900: REM Alienigena SUB 2000: REM Jugador
SS
(ganar OR perder)=1 THEN GO TO 70 TO 30 ganar=1 THEN GO SUB 5000: GO TO 20 SUB 60900: REM Perder
CLS : PAPER 7: BORDER 7: INK 0: STOP
O 0000
O
Los requisitos iniciales en la programación de juegos consisten en presentar las instrucciones en la pantalla e inicializar las variables con los valores oportunos. La línea 5 da título al programa y la sentencia GO SUB de la línea 10 bifurca el mismo para que ejecute la subrutina de inicialización que comienza en la línea 8000. La subrutina llamada en la línea 20 es la parte del programa que se encarga de dibujar las estrellas y escribir el número de alienígenas destruidos.
Las líneas 30 a 60 constituyen un lazo contínuo y se pueden considerar el corazón del programa. La subrutina llamada en la línea 30 se encarga de avanzar los invasores en la pantalla. La línea 40 llama a una subrutina que permite al jugador moverse y disparar un misil a los invasores. La siguiente línea es una sentencia IF... THEN que estudia si se ha ganado o perdido. Si se cumple una de estas dos condiciones el programa sale del lazo y salta a la línea 70. De lo contrario la línea 60 hace que se repita el proceso de movimiento y disparo regresando a la línea 30. ganar y perder son simplemente indicadores —flags— que pueden activarse o desactivarse —1 ó 0— cuando se verifiquen ciertas condiciones durante el juego.
La línea 70 estudia si el flag ganar está a 1. Si lo está llama a la subrutina Ganar. Cuando esta finaliza el ordenador devuelve el control al programa y salta a la línea 20 para renovar la pantalla de invasores. Si en cambio está a 0, el programa llama a la subrutina Perder en la línea 80. El programa de control finaliza en la línea 90 con la instrucción STOP.
Como puedes ver el programa principal es bastante corto y su efectividad se basa en el empleo de subrutinas encargadas de labores específicas. De esta forma la estructura del programa es mucho más clara y permite comprobar con sencillez cualquier tipo de fallo, así como introducir modificaciones en el mismo.
18
ANTES DE COMENZAR CONVIENE ESTUDIAR SOBRE £L PAPEL
CÓMO VA A QUEDAR LA PANTALLA
[RÍA] MElMTISIA pap spesjen fs
Antes de comenzar conviene plantear la pantalla sobre el papel. Esta se compone en el Spectrum de 22 líneas de 32 caracteres cada una; las columnas están numeradas de 0 a 31 hacia la derecha y las filas de 0 a 21 hacia abajo.
La primera subrutina que llama el programa es Inicializar
—línea 10—. Cada vez que se llama a una subrutina el ordenador comprueba el listado completo desde el principio hasta encontrar el número de línea requerido. Si una subrutina es llamada una sola vez, como es el caso, conviene definirla cerca del fin del programa, en esta ocasión en la línea 8000. Las líneas 8010 a 8125 dibujan la primera pantalla, encargada de mostrar las instrucciones. Las teclas Z y X permiten al jugador mover la nave, y pulsando M se dispara un misil. Las instrucciones necesarias para conseguirlo se definirán en una sección posterior.
REM Inicializar
PAPER 0: INK 7: BORDER 0: CLS
PRINT AT 1,4;3"Eres un piloto solitario"
PRINT AT 2,1;"protegiendo el planeta Tierra." PRINT AT 3,1;"En unos instantes estaras bajo" PRINT AT 4,3;"el ataque de invasores del" PRINT AT 5,9;"planeta VARGON. ”
PRINT AT 6,43"Tu mision es evitar que"
PRINT AT 7,0;3"aterricen las naves vargonianas." PRINT AT 10,23"”Z” MUEVE LA NAVE A LA IZDA" PRINT AT 12,23"*X” MUEVE LA NAVE A LA DCHA" PRINT AT 14,4;"PULSA *M” PARA DISPARAR”
PRINT AT 20,2;"Pulsa cualquier tecla para” PRINT AT 21,0;3"entablar combate con el enemigo”
95909909 SES
LET perder=0: LET ganar=0: LET puntos=0: LET colalien=0: LET colest=0: LET xp=16:
LET altura=1: LET invasores=10: LET alienigenas=invasores
DIM x(invasores): DIM y(linvasores) FOR a=1 TO invasores
LET x(a)=a*3:2 LET y(a)=altura NEXT a
Mientras el jugador lee las instrucciones, el ordenador puede continuar inicializando las variables empleadas en el juego. En la línea 8130 se establecen una serie de indicadores —flags—. Un flag puede ser “activado” —tomando el valor 1— o “desactivado” —tomando el valor 0—. Los flags perder y ganar se desactivan, pues el juego acaba de empezar. puntos representa el número de alienígenas abatidos. colalien y colest son dos flags que detectan si un misil ha colisionado con un alienígena o una estrella. xp es la posición de la nave del jugador sobre el eje X de la pantalla. altura es la posición vertical inicial de cada invasor respecto a la parte superior de la pantalla. El número de alienígenas se establece mediante la variable invasores. La variable alienígenas contendrá el número de invasores por derribar.
Cada invasor lleva asociado un par de valores incluidos en sendas matrices unidimensionales. Así la instrucción DIM x (invasores) reserva espacio en memoria para la posición horizontal de cada invasor, y DIM y (invasores) hace lo propio con la posición vertical. Un bucle FOR... NEXT establece la posición horizontal inicial de cada uno de los diez invasores a un valor que va de 3 a 30 incrementándose de 3 en 3 para abarcar toda la pantalla.
El siguiente grupo de instrucciones define la forma del invasor. El programa es el creado en la página 9, en la sección de caracteres definidos por el usuario, y constituye las líneas 8180 a 8250.
8180 POKE £5348,BIN 00100100 8190 POKE £65369,BIN 001001009 8200 POKE £5370,BIN 01111110 8210 POKE 65371,BIN 11111111 8220 POKE £5372,BIN 10011001 8230 POKE 65373,BIN 11111111 8240 POKE £5374,BIN 01011010
8250 POKE 45275,BIN 091000010 8260 LET R$=INKEY$: IF R$="" THEN GO TO 8260 8270 RETURN
SM
En la línea 8260 INKEY explora el teclado para detectar la tecla pulsada, almacenando el resultado en R$; si no contiene nada (R$=" ”) no se ha pulsado ninguna. El ordenador repite el proceso hasta que se da un valor a la variable, en cuyo caso retorna al
É programa de control. Este sistema permite al jugador comenzar el juego con sólo pulsar una tecla del teclado.
La siguiente subrutina que llamaremos dibuja el fondo de la pantalla. Esta es la segunda subrutina menos usada en el programa, de ahí que se defina la penúltima en el listado, comenzando en la línea 7000. Se encarga de dibujar un fondo de estrellas en puntos aleatorios cada vez que comienza el juego o cuando avanza la siguiente oleada de alienígenas una vez eliminada la anterior.
En primer lugar se borran de la pantalla los textos o gráficos que hayan podido dejar las subrutinas anteriores, y un bucle FOR... NEXT dibuja aleatoriamente una serie de cuarenta estrellas. En la
línea 7030 la función RND selecciona una posición de carácter de LA ESTRELLA SE
DIBUJA SIEMPRE EN LA
forma aleatoria y dibuja en ella una estrella —un único “pixel”— M/S MA POSICIÓN DENTRO en la misma posición para cada cuadrado. Más tarde, cuando se DEL CARÁCTER ELEGIDO dispare un misil y éste ocupe la misma posición de carácter que la ARBITRARIAMENTE. estrella, la borrará. Así pues es importante conocer la posición de tl pc a la misma de modo que pueda ser dibujada de nuevo cuando el AVERIGUAR SÍ VA A
misil haya pasado. La recuperación de las estrellas perdidas se BORRAR UNA lleva a cabo en otra sección del programa. Los alienígenas en su ESTRELLA avance también borran estrellas, lo que sin embargo no se tiene en cuenta, ya que su efecto no llama tanto la atención, y el proceso de “recuperación de estrellas” retarda bastante el programa.
| REM Pantalla CL5S
FOR s=1 TO 40 PLOT 8*INT (RND*32),8*INT (RND*21)+10
NEXT s INK 7: PRINT AT 0,53” INVASORES DESTRUIDOS="5puntos RETURN
La última parte de esta subrutina imprime la puntuación en la mitad de la línea superior de la pantalla. El valor de puntos cambia en el programa según se destruyen alienígenas. Como antes, la subrutina finaliza con una sentencia RETURN que indica al ordenador que debe volver al programa de control.
21
LLL Vusuuise
Prueba tu programa
Puedes probar ahora la parte del programa que llevas escrita. Sigue las instrucciones que se indican abajo y obsevarás la pantalla de presentación. Al pulsar cualquier tecla obtendrás la segunda pantalla. Si el programa no funciona, o si ocurre algo raro revisa lo que has hecho con cuidado. Incluso el más pequeño error puede provocar que el programa no funcione.
1. TECLEA LA LÍNEA PROVISIONAL 35 GOTO 35 Y PULSA (RETURN ] Poo 2. TECLEA RUN Y PULSA [RETURN]
DEBERÍAS VER AHORA LA PANTALLA DE PRESENTACIÓN QUE SE MUESTRA 4 LA /ZQUIERDA. A/l PULSAR CUALQUIER TECLA EL PROGRAMA CONTINUARÁ Y SE ESTABLECERA EL FONDO DE ESTRELLAS Y PLANETAS DE LA DERECHA, BORRA LA LÍNEA PROVISIONAL ANTES DE CONTINUAR CON LA SIGUIENTE SECCIÓN DEL TEXTO
AC UTE CORSA ALS UCSI AO! ATEO TAICRAAO Vargón.
ASIA TES
ETS ITA AA
Pulsa la barrá espaciadora para disparar el láser.
METAS combate con el enemigo.
1. INTRODUCE LA LÍNEA PROVISIONAL ESIOr y Pulsa [ENTER] SPECTRUM ys Y LUEGO DEBERÍAS VER AHORA LA A DE RES ACION QUE SE MUESTRA A LA /ZQUIERDA . AL PULSAR CUALQUIER TECLA El PROGRAMA CONTINUARA Y SE ESTABLECERÁ ELFONDO DE ESTRELLAS Y PLANETAS DE LA DERECHA. BORRA LA LINEA PROVISIONAL ANTES DE CONTINUAR CON LA SIGUIENTE SECCIÓN DEL TEXTO
E leo) SENT IE
En unos instantes estarás bajo el RN Vargón.
IAE REE e] MEE SEUS
CAOS IT 0 AUSTIN IT NO
A
SNTE ES RN
22
un |] [en] E] as U [une e] bs [] e] bad [a] |] un Lo] = Z
La siguiente subrutina Alienígena se encarga de avanzar los invasores hacia la parte baja de la pantalla. Recuerda que en la subrutina Inicializar habíamos establecido las coordenadas iniciales de cada invasor. Como estamos en el segundo modo de pantalla —gráfico— trabajaremos sobre una cuadrícula de 256 por 192 pixels, pudiendo colocar cada sprite en cualquier lugar de la pantalla. No obstante, los movimientos de todos los sprites los haremos avanzando de 8 en 8 pixels; para ello simplemente cambiaremos las coordenadas del mismo y lo colocaremos en las nuevas como habíamos hecho en el capítulo introductorio.
La línea 1010 selecciona un valor de R entre 1 y 10, que nos servirá para escoger el invasor. Si se ha escogido un alienígena cuya coordenada vertical tiene el valor 209 (valor escogido para representar un alienígena destruido que esté ya fuera del juego) la
subrutina finaliza.
6000
Una vez escogido un alienígena válido, las líneas 1020 y 1030 calculan sus nuevas coordenadas. Añadiremos un número aleatorio (-8, 0 u 8) al valor actual de la coordenada X(R) para variar su posición horizontal, e incrementaremos en 8 unidades el valor de Y(R). Con esto conseguiremos que el alienígena descienda y se desplace a su nueva posición 8 pixels a la izquierda, con la misma coordenada horizontal, u 8 pixels a la
1000 1010 1020 1030 1040 1050 1060 1070 1080
REM Alienigena
R=INT(RND(1)*(INVAS))+1:2 X(R)=X(R)+8* (INT(RND(1)%3)-1)
Y (R)=Y(R)+8
IF X(R)>248 THEN X(R)=248
IF X(R)<16 THEN X(R)=16
IF Y(R)=184 THEN PERDER=1 PUT SPRITE R, (X(R),Y(R)),5
RETURN
derecha respectivamente.
Las líneas 1040 y 1050 aseguran que el alienígena no se salga de los límites que tiene asignados; éstos son las coordenadas horizontales 248 (por la derecha) y 16 (por la izquierda). Si un invasor desciende hasta la altura de la nave, la línea 1060 activa el flag PERDER, que indica que el juego ha terminado. Por último la línea 1070 coloca el sprite alienígena en su nueva posición.
La subrutina Jugador permite mover la nave horizontalmente por la línea inferior de la pantalla. En la línea 2010 INKEY explora el teclado y asigna a R$ la tecla pulsada; caso de no pulsarse ninguna se le asigna una tecla cualquiera (X). Si la tecla pulsada es la barra espaciadora, la línea 2020 desvía el control a la subrutina 3000 que se encarga de disparar el láser.
IF Y(R)=209 THEN RETURN
PARA MOVER A LA IZQUIERDA : INT(RND(1)*3)-1=-1 PARA,NO MOVERSE :
INT (RND(1)*3)-1=0 PARA MOVER ALA DERECHA : INT(RND()R3)-1=+1 EL INVASOR DESCIENDE PUES AÑADIMOS 8 A LA COORDENADA Y (LÍNEA 1030)
| 2000 REM Jugador 2010 R$=INKEYS$: IF R$="" THEN R$="x" | 2020 IF R$=" ”" THEN GOSUB 3000: REM Laser E: 2030 IF ((ASC(R$)=29) AND XP>0) THEN XP=XP-8: E IF XP<16 THEN XP=16 E 2040 IF (ASC(R$)=28) AND XP<256 THEN XP=XP+8: IF XP>248 THEN XP=248 2050 PUT SPRITE 12, (XP,184),8 20606 RETURN
00
O
Las líneas 2030 y 2040 controlan el movimiento de la nave. Antes E de cambiar su coordenada horizontal comprobaremos que se Ñ encuentra dentro de los límites impuestos (que lógicamente coinciden con los de los invasores).
Cuando la tecla pulsada sea el cursor izquierdo, R$ tendrá el
E valor ASCII 29 y si XP es mayor que 16 decrementaremos su E valor 8 unidades — línea 2030—. Análogamente, si pulsamos el cursor derecho R$ tendrá el valor ASCII 28, y si está dentro de los límites aumentaremos la posición horizontal en 8 unidades (línea 2040). Por último, la línea 2050 coloca el sprite correspondiente a la nave en su nueva posición.
La subrutina Láser comienza en la línea 3000 y es la encargada de dibujar el misil ascendiendo por la pantalla. Esto lo consigue de
3 una forma muy simple. Una vez fijada la posición horizontal del
; misil —que coincide con la de la nave—, dibujaremos el sprite misil consecutivamente en la misma posición horizontal pero disminuyendo su posición vertical. La línea 3020 decrementa la posición vertical del misil en 8 unidades y la 3030 lo dibuja en la
E posición correspondiente. Por último, la línea 3040 comprueba si
E el misil ha llegado a la parte superior de la pantalla, borrándolo en
; ese caso. De esta forma el bucle 3020-3060 consigue el movimiento ascendente.
3000 REM Laser
3010 YM=184: XM=XP:GOSUB 3500
3020 YM=YM-8
3030 PUT SPRITE 11, (XM,YM)>,11
3040 IF YM=0 THEN PUT SPRITE 11, (0,209) : AUX=1 : RETURN
3050 IF AUX=1 THEN SPRITE ON
3060 GOTO 3020
3500 SOUND 0,128: SOUND 1,1:SOUND 2,0:SOUND 3,0: SOUND 4,0:SOUND 5,0:SOUND 6,1:SOUND 7,54: SOUND 8,16:SOUND 9,0:SOUND 10,0:SDUND 11,251: SOUND 12,10:SOUND 13,15
3510 RETURN
S
O
Ss 6000
O
Antes de continuar conviene explicar la línea 8220 de la subrutina Inicializar que hemos reservado a propósito para este apartado. ON SPRITE permite detectar cuándo se cruzan dos sprites en la pantalla, y si está activa la instrucción ON SPRITE se ejecuta inmediatamente la subrutina de tratamiento de esta interrupción. Pues bien, la línea 8220 indica que en caso de cruzarse dos sprites hay que ejcutar la subrutina que comienza en la línea 4000. SPRITE OFF desactiva por el momento este tipo de interrupciones.
En su ascenso por la pantalla, el misil puede chocar con un alienígena, debiendo saltar a la subrutina de coincidencia de sprites. Cuando se ha disparado el misil hay que distinguir la coincidencia de dos sprites invasores —que no debe dar lugar a ningún efecto especial— de la coincidencia de un sprite invasor con un misil. Para ello emplearemos el flag AUX, que se pondrá a 0 cuando los sprites que coinciden sean dos invasores.
La subrutina de coincidencia de sprites comienza desactivando la interrupción ON SPRITE hasta que se ejecute el siguiente SPRITE ON. El flag COLIS indicará si ha habido o no colisión
entre el misil y el invasor, de ahí que se inicialice a 0.
LA POSICIÓN. INICIAL
DEL MISIL COINCIDE
CON LA DE LA NAVE. S
EL MISIL ASCENDERÁ EL MISIL ASCENDERÁ
CONSERVANDO POR LA PANTALLA
SU POSICIÓN HASTA QUE CHOQUE
HORIZONTAL CON UN ALIENÍGENA O ALCANCE LA PARTE SUPERIOR DE LA MISMA. NO PODRAS MOVER LA NAVE N/ DISPARAR OTRO MISIL HASTA PUE ESTE HAYA DESAPARECIDO
REM Coincidencia de sprites
SPRITE OFF: COLIS=09
FOR I=i TO INVAS
IF (X(1)<>XM OR ABS(YM-Y(1))>8) THEN GOTO 4050 Y(1)=209:PUT SPRITE 1, (0,209): I=INVAS:GOSUB 4500: COL IS=1
NEXT 1
AUX=COL IS
IF COLIS=0 THEN RETURN
AL IENS=AL IENS-1 1: MAR=MAR+1
IF ALIENS=0 THEN GANAR=1
PRESET (200,0): COLOR 1:PRINTR*i, MAR-1:
PRESET (200,0): COLOR 15: PRINTH1,MAR
RETURN
SOUND 0,09: SOUND 1,0:SOUND 2,0: SOUND 3,0:SOUND 4,0: SOUND 5,0:SOUND 6,31:SOUND 7,7: SOUND 8,16: SOUND 9,16:SOUND 109,16:SOUND 11,0:SOUND 12,60: SOUND 13,0
RETURN
060
A continuación, el bucle 4020-4050 compara las posiciones de todos los invasores con las del misil y determina si ha habido colisión. En ese caso la línea 4040 borra el invasor, le asigna la coordenada 209 — invasor destruido— llama a la subrutina 4500 que consigue el sonido de la explosión y activa el flag COLIS. Para salir del bucle establece la variable 1 a su valor final INVAS. La línea 4060 asigna al flag AUX el valor de COLIS de modo que si no ha habido colisión —se habrá entrado en esta subrutina por coincidencia de dos invasores— AUX se encargará en la subrutina Láser de que se desactiven las interrupciones ON SPRITE que retardarían el ascenso del misil.
Si ha habido colisión, el número de alienígenas se decrementa en uno y el marcador aumenta —línea 4080—. Si ya no quedan invasores se activa el flag GANAR. 4100 actualiza el marcador.
CUANDO EL M/SIL CHOCA CON UN ALJENIGENA SE ENTRA EN LA SUBRUTINA DE ATENCION A
ON SPRITE
QUE BORRA El INVASOR Y PRODUCE LA EXPLOSION.
LA COORDENADA VERTICAL DE EsTE SE ALTERA PARA ELIMINARL E
DEL JUEGO
La subrutina Alienígena elige un invasor de forma aleatoria y lo pinta de negro; de esta forma permanece invisible en el fondo hasta que se calculan las nuevas coordenadas adyacentes y se vuelve a dibujar el alienígena en amarillo. La impresión de movimiento se consigue borrando el invasor y dibujándolo en una posición inferior a la anterior. La línea 1010 selecciona un número entero entre 1 y el valor de invasores. Este valor es almacenado en la variable r. El valor de r hace referencia a un alienígena en concreto. No obstante si se ha elegido un alienígena que resulta tener unas coordenadas verticales fuera de la pantalla —un alienígena “muerto”— la subrutina finaliza con una instrucción RETURN. Esto se explicará más detenidamente en la subrutina Impacto que describiremos más adelante.
Cuando se escoge un alienígena correcto la línea 1020 lo borra de sus antiguas coordenadas, x(r), y(r).
REM Alienigena
RETURN 1020 PAPER 0: PRINT AT y(r),x(r353" " 1030 LET x(r)=x(r)+INT (RND*3)-1 1040 LET y(r)=y(r)+1 10509 IF x(r)>30 THEN LET x(r)=30 1060 IF x(r)<1 THEN LET x(r>=1 1070 IF y(r)=21 THEN LET perder=1 1089 INK 6: PRINT AT y(tr),x(r)3 "qe" 10909 RETURN
Las nuevas coordenadas se calculan en la línea 1030 mediante la función RND. Añadiremos un número aleatorio —1,06 1, al valor actual de x(r), para variar la posición horizontal, e incrementaremos en una unidad el valor de u(r). De esta forma conseguiremos que el alienígena se desplace a su nueva posición un espacio hacia abajo y a la izquierda, sin variar su posición horizontal, o abajo y a la derecha respectivamente.
Las líneas 1050 y 1060 establecen los límites del valor de x(r) para asegurar que la posición horizontal del alienígena nunca pueda salirse de la pantalla (si no lo hiciéramos el programa finalizaría al intentar imprimir el invasor y el Spectrum daría un mensaje de error). La siguiente línea, 1070, estudia el valor de y(r). Si es igual a 21 el invasor ha alcanzado el fondo de la pantalla y se activa el flag perder. Se imprime ahora el alienígena en su nueva posición mediante la línea 1080. La figura del invasor es la definida en la página 9; sigue las instrucciones que se dieron allí para conseguir el carácter para tu listado.
El movimiento conseguido en esta subrutina es doblemente aleatorio en cuanto a la elección del invasor y en cuanto a su nueva posición. De esta manera se consigue el efecto de descenso al azar necesario para este tipo de juegos en el que cualquier periodicidad disminuye su atractivo.
1010 LET r=INT (RND*invasores)+1: IF yír)=22 THEN
30800
PARA MOVER ALA IZQUIERDA: INTCURNDO + 3)-1=-1 PARA NO MOVERSE : INT(RNDXK3)-1=0 PARA MOVER A LA DERECHA ; INT(RND*k3)-1=1 EL INVASOR DESCIENDE PUES AÑADIMOS 8 A LA COORDENADA Y CLINEA 1040)
28
La siguiente subrutina que llama el programa principal permite al jugador mover su nave por la línea inferior de la pantalla. En la línea 2010 NKEYS explora el teclado para ver si se ha pulsado una tecla, y almacena el resultado en 1$. La siguiente línea estudia esta variable, y si 1$ es “m” o “M” (con lo que aceptamos letras mayúsculas o minúsculas) se ejecuta la instrucción GOSUB 3000 que es la subrutina que se encarga de disparar el misil y que luego definiremos.
REM Jugador
LET 1$=INKEYS$
IF 1$="m" OR 1$="M" THEN (GO SUB 3000: REM Laser
IF (1$="z" OR 1$="Z") AND xp>09 THEN LET xp=xp-1
IF (1$="x" OR 1$="X") AND xp<29 THEN LET xp=xp+1 INK 2: PRINT AT 21,xp3" A "
RETURN
Las líneas 2030 y 2040 controlan el movimiento de la nave. Si 1$ es “z” o “Z” y la posición horizontal del jugador es mayor que 0, entonces se decrementa el valor de xp con lo que moveremos la nave hacia la izquierda. Si el valor de 1$ es “x”o “X” entonces la moveremos un espacio a la derecha. Los límites impuestos al valor de xp aseguran que esta coordenada nunca puede salirse de la pantalla. La expresión xp=xp-1 es muy usual en el lenguaje informático; en general significa que la variable es alterada en la cantidad especificada respecto a su valor en el instante de ejecución. En nuestro caso el valor de xp —la coordenada
horizontal de la nave en la pantalla— se decrementa una unidad.
La nave la representaremos mediante la letra A, que se imprime en la pentalla mediante los caracteres “A”, es decir, entre dos espacios en blanco. La misión de estos espacios es borrar la antigua A al mover la nave hacia la izquierda o la derecha, como vimos en la introducción.
LA TECLA Z MUEVE LA LA TECLA X MUEVE
NAVE (A) ALA IZQUIERDA LA NAVE (A) A LA
HASTA LA COLUMNA 4 DERECHA HASTA LA COLUMNA 29
3000 REM Laser 3010 LET ym=21: LET xm=xp+1 3020 LET ym=ym-1
3050 INK 7: PRINT AT ym,xm3"!" 3060 PAPER 0: PRINT AT ym,xm3" "
LET colest=09 3080 IF colalien=1 THEN GO SUB 4000 3090 IF ym=1 THEN RETURN 3106 GO TO 3020
3000
O
La subrutina Láser comienza en la línea 3000. En primer lugar la línea 3010 establece las coordenadas iniciales del misil en las del jugador (ym, xm). Conseguiremos que el misil cruce la pantalla mediante un bucle que altera la posición vertical (ym) en una unidad cada vez. Dentro del bucle hay que estudiar si el misil va a borrar una estrella, en cuyo caso ésta debe ser restaurada tras su paso, o si va a interceptar un alienígena, debiendo pasar el control a la subrutina Impacto. Esto lo conseguimos mediante la función POINT, que estudia un pixel en concreto para ver si corresponde al color del fondo (0) ó a otro (1). La línea 3030 estudia la posible coincidencia con una estrella, en cuyo caso se activa el flag colest. La línea 3040 comprueba un pixel que debería estar pintado si la posición correspondiente estuviera ocupada por un invasor, y actúa sobre el flag colalien en consecuencia. El misil se consigue mediante una exclamación (!) impresa en color blanco y borrada posteriormente con negro. Si el flag colest se ha activado, la estrella se dibuja de nuevo en su antigua posición. Si el flag colalien está a 1 el ordenador salta entonces a la subrutina Impacto que ahora describiremos. Por último, cuando ym=1, es decir, cuando el misil ha llegado a la parte superior de la pantalla, la subrutina finaliza con una sentencia RETURN.
CUANDO UN MISIL COINCIDE CON UN CARACTER QUE CONTIENE UNA ESTRELLA, ESTA DESAPARECE C(1)- UNA VEZ PUE EL MISIL ES BORRADO(2) ; SE/IMPRIME LA ESTRELLA A E EN LA MISMA POSICIÓN (3)
3030 IF POINT (xm*8, (21-ym)x8+2)=1 THEN LET colest=1 3040 IF POINT (xm*8, (21-ym)x8+3)=1 THEN LET colalien=1
3070 IF colest=1 THEN PLOT xm*8, (21-ym)x8+2:
39008 S
EL MISIL SUBIRÁ POR LA PANTALLA HASTA QUE INTERCEPTE UN ALIENÍGENA O ALCANCE LA PARTE SUPERIOR DELA MISMA. NO PODRAS MOVER LA NAVE O DISPARAR OTRO MISIL HASTA QUE EL PRIMERO HAYA DESAPARECIDO
En la subrutina Impacto se estudia cada invasor uno por uno mediante un bucle FOR... NEXT para ver si su posición coincide con la del misil. Si sus coordenadas x ó y no son las mismas, el ordenador salta a la línea 4040 para pasar al siguiente alienígena. Sin embargo, cuando sus posiciones coinciden la línea 4030 cambia la posición vertical del invasor de modo que éste pase a la fila 22 —fuera de la pantalla—. El alienígena se borra mediante el carácter en blanco asociado al misil. El bucle finaliza estableciendo el valor de a a su valor máximo (el número de invasores) ya que es una práctica poco recomendable saltar desde el interior de un bucle.
4000 REM Impacto
4010 FOR a=1 TO invasores
4020 IF x(a)<>xm OR y(la)<>ym THEN GO TO 4040
LET y(a)=22: LET a=invasores
4040 NEXT a
4050 LET alienigenas=alienigenas-1: LET puntos=puntos+1i 2: LET colalien=0: LET ym=1
4060 IF alienigenas=0 THEN LET ganar=1
4070 INK 7: PRINT AT 0,26;3puntos
4080 RETURN
0000 0909
La línea 4050 modifica la puntuación, número de alienígenas eliminados, y desactiva el flag colalien. Una vez que se ha ejecutado la subrutina Impacto debe finalizar el proceso de disparo, lo que se consigue cambiando el valor de ym a 1, con lo que concluirá la subrutina Láser. Las dos últimas líneas analizan si el juego ha acabado (cuando se hayan eliminado todos los invasores) e imprime el nuevo tanteo en la parte superior de la pantalla.
El MISIL AVANZA POR LA PANTALLA y sí DETECTA UN ALIENÍGENA EN LA SIGUIENTE POSICIÓN DE CARACTER REGISTRA UMA COLISI/ISN (1y 2).
El MISIL BORRA EL ALIENIGENA aL IMPRIMIRSE SOBRE EL (3) Y EL MISMO ES BORRADO MEDIANTE UN CARACTER EN BLANCO (4),
PARA ELIMINAR £L INVASOR DEL JUEGO S£ MODIFICA
SU COORDEMADA WERT/CAL
AAAAA AAANANAAARA LU0VLOGDEGOUDIOLDIDIR
Prueba tu programa
secciones del programa
disparo an
Puedes comprobar ahora las correspondientes a movimiento y capítulo final del libro. Sigue las amarillo. Deberías ser capaz de mover tu invasores en su descenso. Como antes, si recibes un compáral
Mes de pasar al instrucciones del recu
nave y atacar a
error estudia todo lo que hayas tecleado y listados del libro.
PAE
| AAA UI En
dd
IND O
A
MSX
1. TECLEA LA LÍNEA PROVISIONAL | 55 GOTO Yo Y PULSA RETURN |
2. TECLEA RUN Y PULSA RETURN
S/ TODO ES CORRECTO DEBER/AS SER CAPAZ
pE DISPARAR A LOS ALIENIGENAS EN SU DESCENSO POR LA PAVTALLA. BORRA LA LÍNEA
PROVISIONAL ANTES
DE CONT/MUAR
SPECTRUM
1. INTRODUCE LA LÍNEA PROVISIONAL |
45 Goro 30 y
PULSA ENTER
2. PULSA RUN Y LUEGO ENrER
5/ TODO ES CORRECTO DEBERÍAS SER CAPAZ DE DISPARAR 4 LOS AL! ¡ENÍGENAS | EN SU DESCENSO
POR LA PANTALLA.
El PROGRAMA FINALIZARÁ SI ALGUNO DE ELLOS ALCANZA LA PARTE INFERIOR | DE LA MISMA. BORRA LA LÍNEA PROVISIONAL
ANTES DE CONTINUAR
DLE
P o
| | | 4
GANAR Y PERDER
Esta es la sección que falta para completar el juego. Si el jugador consigue eliminar los diez alienígenas aparece una nueva oleada que comienza su descenso desde una altura menor y dan menos tiempo al jugador para atacarlos. Al finalizar la sección hay algunos trucos que hacen el programa más atractivo. Por último se da un listado completo.
AUS US
A IA AU (UA ROI
AA a
33
Cuando el último alienígena ha sido destruido, la subrutina de atención a coincidencia de sprites activa el flag GANAR. La línea 60 del programa de control lo detecta y se sale del bucle encargado del movimiento y disparo. La línea 70 del programa principal llama entonces a la subrutina Ganar.
REM Ganar
PRESET (48,72):COLOR 13:
PRINT $1, "BIEN HECHO TERRICOLA"
PRESET (40,88):PRINT $1, "ESTA VEZ HAS GANADO TU" FOR D=1 TO 300: NEXT
PRESET (72,112):PRINT $*1, "PREPARATE PARA"
PRESET (40,128):PRINT $1, "NUESTRO PROXIMO ATAQUE" FOR D=1 TO 500: NEXT
AL IEN=INVAS: NIVEL=NIVEL+16: GANAR=0
FOR A=1 TO INVAS
X (4) =24*A: Y (4) =NIVEL
NEXT A
PRESET (48,72):COLOR 1:PRINT*1, "BIEN HECHO TERRIC OLA":PRESET (40,88):PRINTH1, "ESTA VEZ HAS GANADO TU": PRESET (72,112):PRINT*1, "PREPARATE PARA": PRESET (40,128): PRINTH1, "NUESTRO PROXIMO ATAQUE" RETURN
909
Aparece en la pantalla un mensaje de enhorabuena; como aún estamos en modo 2 es necesario localizarlo mediante PRESET e imprimirlo con PRINT . Antes de imprimir el siguiente mensaje se introduce un retardo mediante un bucle FOR... NEXT. Este obliga a contar de 1 a 300 antes de imprimir la segunda parte del texto. Tras el segundo mensaje hay otro bucle de retardo para dar tiempo al jugador a leer el texto antes de que finalice la subrutina y se borre la pantalla. La línea 5070 vuelve a establecer el valor de ALIENS a INVAS, desactiva el flag GANAR e incrementa NIVEL en 16 unidades de forma que la siguiente oleada de alienígenas comience en una posición más baja en la pantalla.
Un bucle FOR... NEXT repone las coordenadas x e y de cada alienígena de la misma forma que hicimos en la subrutina de inicialización. La línea 5105 borra el mensaje imprimiéndolo de nuevo con el color de fondo y RETURN devuelve el control al programa principal que entra de nuevo en el bucle activo del juego.
La subrutina Perder comienza cerrando el fichero 1 mediante CLOSE y estableciendo el modo de pantalla 0 (modo texto). Además cambia el color del texto y borra la pantalla, imprimiendo a continuación un mensaje. Tras un nuevo retardo aparece otro mensaje que indica el número de invasores destruidos.
34
A A
£000 REM Perder £010 CLOSE +1:SCREEN 09,9,0: COLOR 13,1,1:CLS 6020 LOCATE 16,3,0:PRINT "L O S” £6030 LOCATE 10,5,0:PRINT "INVASORE S” 60640 LOCATE 16,7,0:PRINT "H A N” 6050 LOCATE 9,9,0:PRINT "ATERRIZAD O" 6060 FOR I=1 TO 800: NEXT 6070 LOCATE 13,13,0:PRINT "SIN EMBARGO" 6080 LOCATE 12,15,0:PRINT "HAS DESTRUIDO" 6090 LOCATE 17,17,0:PRINT MAR:COLOR 10 6100 LOCATE 10,19,0:PRINT "NAVES ALIENIGENAS" 6110 LOCATE 4,22,0: INPUT "QUIERES ENFRENTARTE DE NUEVO"5A$ 61209 IF LEFT$(A$,1)="S" OR LEFT$(A$,1)="s" THEN RUN CLS:SCREEN 0,,1:COLOR 1,15, 15: RETURN
S O
So SS)
O O
6 O
O O
A continuación se ofrece la opción de jugar de nuevo en la línea 6110. La línea 6120 estudia la primera letra de la palabra y si esta comienza por “s” o “S”, el programa se ejecuta de nuevo. De esta forma el jugador puede responder con cualquier palabra que comience por “s” para jugar otra vez. Con cualquier otra respuesta el ordenador, tras borrar la pantalla, volverá al
programa principal, donde finalizará en la línea 90.
MSX POR FIN PUEDES RODAR £L PROGRAMA COMPLETO. CUANDO HAYAS ELIMINADO TODOS LOS ¡NVASORES VERÁS EN PANTALLA El MENSAJE DELA IZQUIERDA, Y El JUEGO CONTINUARA CON LOS ALIENIGENAS AVANZANDO DESDE UNA POSICIÓN MÁS BAJA. S] UN INVASOR ALCANZA EL FONDO |. DELA PANTALLA HABRAS PERDIDO, Y APARECERA EN ELLA
|. EL MENSAJE DE LA DERECHA
DAS ASIA AS SS HAN
Ss ar
A AA
UA SAN aid
a AUS A) RS E
PROXIMO ATAQUE UA AE
AE
Cuando el jugador es lo suficientemente hábil para eliminar el último alienígena de la pantalla, el flag ganar se activa en la subrutina Impacto, y la línea 70 del programa de control llama a la subrutina Ganar que comienza en la línea 5000.
REM Ganar
INK 5: PRINT AT 6,55"BIEN HECHO TERRICOLA" PRINT AT 8,4;"ESTA VEZ HAS GANADO TU"
FOR D=1 TO 2060:NEXT D
PRINT AT 12,83 "FREPARATE PARA"
PRINT AT 14,45 "NUESTRA PROXIMO ATAQUE"
FOR d=1 TO 400: NEXT d
LET alienigenas=invasores: LET altura=altura+2: LET ganar=09
FOR a=1 TO invasores
LET x(a)l=a*3: LET y(a)=altura
NEXT a
RETURN
Las líneas 5010 y 5020 imprimen un mensje de “enhorabuena” en la mitad superior de la pantalla. En la línea 5030 se introduce un retardo a base de un bucle FOR... NEXT que obliga a contar de 1 a 200 antes de imprimir la segunda parte del mensaje. Una vez hecho ésto se origina otro retardo del mismo modo para que el jugador tenga tiempo suficiente para leer el mensaje antes de que la subrutina concluya, borrándose la pantalla para dejarla lista para el siguiente ataque alienígena.
El número de alienígenas es inicializado al valor original de invasores en la linea 5070, y el flag ganar es desactivado poniéndolo a 0. El valor inicial de altura se ve incrementado en 2 unidades, lo que provoca que la altura inicial de los alienígenas disminuya de modo que cada oleada va siendo más difícil de destruir. Puedes modificar esta subrutina de forma que los invasores vuelvan a descender desde la altura inicial una vez logrado el grado de dificultad que consideres oportuno.
Un bucle FOR... NEXT restaura las coordenadas x e y de cada alienígena de un modo similar al empleado anteriormente en la subrutina Inicializar.
Queda por último definir la subrutina Perder (línea 6000). En ella se borra la pantalla y se imprime un mensaje intermitente. Tras un pequeño retardo aparece un segundo mensaje que indica al jugador su puntuación. La instrucción FLASH 1 intercambia alternativamente los colores de la tinta y el papel para lograr el efecto de intermitencia. Este efecto se desactiva mediante la instrucción FLASH 0.
La mayoría de los juegos ofrecen al jugador la posibilidad de intentarlo de nuevo; esto lo conseguimos en las líneas 6110 a 6130. Mediante una sentencia INPUT introducimos la respuesta desde el teclado, que se almacena en a$ cuando se pulsa
36
390000
REM Perder
CLS
INK S: FLASH 1: PRINT AT 1,1353"L O S”
PRINT AT 3,73"INVASORE SS”
PRINT AT 5,133"H A N”
PRINT AT 7,653 "A TERRIZADO": FLASH 0 FOR D=1 TO 206:NEXT D
INK 6: PRINT AT 10,10;"SIN EMBARGO"
PRINT AT 12,9;3"HAS DESTRUIDO”
INK 2: FLASH 12 PRINT AT 14,155puntos: FLASH O INK 6: PRINT AT 16,73 "NAVES ALIENIGENAS” PRINT AT 20,1: "QUIERES ENFRENTARTE DE NUEVO?" INPUT as$
IF a$(1)="s" OR a$(1)="S" THEN RUN
RETURN
O
SES
ENTER. La línea 6130 estudia la primera letra de a$ y si se trata de una “s” (tanto mayúscula como minúscula) el programa comienza de nuevo. Con cualquier otra respuesta el ordenador vuelve al programa de control y finaliza en la línea 90 con la sentencia STOP. Puedes probar las subrutinas de ganar y perder siguiendo las instrucciones del siguiente cuadro
SPECTRUM POR FÍN PUEDES RODAR El PROGRAMA COMPLETO. CUANDO HAYAS ELIMINADO TODOS LOS INVASORES VERÁS EN PANTALLA EL MENSAJE DE LA JZQUIERDA , Y EL JUEGO CONTINUARA CON LOS ALIENÍGENAS AVANZANDO DESDE UNA POSICIÓN MÁS BAJA. SI UN INVASOR ALCANZA EL FONDO DE LA PANTALLA HABRÁS PERDIDO, Y APARECERA EN ELLA EL MENSAJE DE LA DERECHA
¡Loj : INVASORES INESIS HAN
: ATERRIZADO Ae ¡AA TASA EA E SIN EMBARGO HAS DESTRUIDO RIAD UN
E ENT NUS SS
INN
300000
Mejora tu programa Tal y como está ahora tu juego de invasores resulta divertido y atrayente. Es difícil eliminar todos los alienígenas, que parecen moverse como si tuvieran vida. Sin embargo puedes hacer que el juego se parezca más a uno de tipo arcadia si añades algunos efectos de sonido bastante sencillos. A continuación se dan algunos trucos que puedes añadir al programa para que se parezca más a uno profesional y con el que podrás disfrutar tú y tus amigos.
Añade sonido MSX
Hemos incorporado en el programa los efectos de disparo y explosión, ambos basados en el comando SOUND de acceso directo al generador de sonido programable. A continuación te proponemos tres nuevas sentencias basadas en el comando PLAY con las que mejorarás la presentación de tu programa. La primera, 8015, ejecuta la melodía de comienzo; las líneas 5030 y 6060 en realidad sustituyen a sendos bucles de retardo e interpretan otras dos melodías.
50360 FOR D=1 TO 300: NEXT:BEEF:FLAY "T1060S1M60006D5L16CE GO6L8cosLi16606L8c” 6060 BEEP:PLAY "T90S1MS00001A4A8. A324402C8.01B165B8.A16A
8.415A82":FOR I=i1 TO 2800: NEXT 38015 BEEP: PLAY A FED GAL y DSLADE 109FEDL606C7. . . OSL4GLIOFEFDA"
SPECTRUM Podemos obtener sonido del Spectrum empleando la instrucción BEEP seguida de dos números, uno gobierna la duración del sonido y el otro su tono. No obstante debes tener mucho cuidado con los sonidos que incorpores al programa, pues pueden retrasar la velocidad del juego hasta un nivel inaceptable. La línea 4005 origina un pequeño “beep” cuando se intercepta un alienígena en la subrutina Impacto. Las líneas 5030 y 6060 son ligeramente diferentes pues no son una incorporación, sino una sustitución. En este caso las instrucciones BEEP ocupan el lugar de los bucles de retardo de las subrutinas Ganar y Perder. La línea 7055 advierte del comienzo del juego.
4005 BEEP .05,-10 5030 BEEP .5,2: BEEP .5,10: BEEP 1,20
5060 BEEP 2,-10 7055 FOR b=1 TO 20: BEEP .1,20: NEXT b
Gráficos extra MSX
Podemos mejorar aún más los gráficos añadiendo una explosión cuando derribemos un alienígena. Para ello definiremos el sprite explosión con el método usual —líneas 8215 y 7025. El carácter se imprime en la línea 4045 y tras un pequeño retardo se borra en la línea 4046. Por último, la línea 9040 contiene los datos necesarios para su definición.
PUT SPRITE 0, (XM,YM+1),6: FOR I=1 TO 150: NEXT 4046 PUT SPRITE 09, (0,209),9
7025 SPRITES$(0)=B$
8215 FOR I=1 TO 8:READ N: B$=B$+CHR$ (N) : NEXT: REM Explos DATA 84,1,136,56,157,16,66,16:REM explosion
AL DERRIBAR UN INVASOR VEREMOS LA EXPLOSION DE LA FIGURA DURANTE UN BREVE
/NTERVALO DE TIEMPO
39
Almacena tus programas
Una vez hayas tecleado el programa por completo, conviene almacenarlo en cinta. Las instrucciones para guardar programas varían muy poco de una máquina a otra, y debes consultar el manual de usuario para las instrucciones concretas. A continuación se da el listado completo del programa “Invasores del Espacio” para ambos tipos de ordenadores. En él se han incorporado las sugerencias de la página anterior.
Listados de los programas
REM Invasores GOSUB 8006:REM Inicializar GOSUB 7000: REM Pantalla GOSUB 1000:REM ÁAlienigena GOSUB 2000: REM Jugador IF (GANAR OR PERDER)=i THEN GOTO 70 ELSE GOTO 460 IF GANAR=1 THEN GOSUB 5000:GOTO 46 GOSUB 6000: REM Perder END REM Alienigena R=INT(RND(1)+*(INVAS))+1: 1F Y(R)=209 THEN RETURN X (R)=X(R) +8%(INT(RND(1)+3)-1) Y (R)=Y(R)+8 IF X(R)>248 THEN X(R)=248 IF X(R)<16 THEN X(R)=16 IF Y(R)=184 THEN PERDER=1 PUT SPRITE R, (X(R),Y(R)),5 RETURN REM Jugador R$=INKEY$: IF R$="" THEN R$="X" IF R$=" " THEN GOSUB 3000: REM Laser IF ((ASC(R$)=29) AND XP>0) THEN XP=XP-3:2 IF XP<16 THEN XP=16 (ASC(R$)=28) AND XP<256 THEN XP=XP+8: XP>248 THEN XP=248 PUT SPRITE 12, (XP,184),8 RETURN REM Laser YM=184: XM=XP:GOSUB 3500 YM=YM-8 PUT SPRITE 11,(XM,YM)>,11 IF YM=0 THEN PUT SPRITE 11, (0,209) : AUX=1: RETURN. IF AUX=1 THEN SPRITE ON GOTO 3020 SOUND 0,128:SOUND 1,1:SOUND 2,0:SOUND 3,0: SOUND 4,09:SOUND 5,0: SOUND 6,1:SOUND 7,54: SOUND 8,16:SOUND 9,0:SOUND 10,0:SOUND 11,251: SOUND 12,10:SOUND 13,15 RETURN REM Coincidencia de sprites SPRITE OFF: COLIS=06 FOR I=1 TO INVAS IF (X(1)<>XM OR ABS(YM-Y(1))>8) THEN GOTO 4050
Continuación MSX
490460 Le o pi SPRITE 1, (0,209) : I=INVAS: GOSUB 45600: LIS=1
4045 PUT SPRITE 0, (XM,YM+1),6: FOR I=1 TO 150:NEXT
40465 PUT SPRITE 0, (0,209),9
40506 NEXT 1
4060 AUX=COLIS
4070 IF COLIS=9 THEN RETURN
4080 ALIENS=AL IENS-1: MAR=MAR+1
4090 IF ALIENS=9 THEN GANAR=1
4100 PRESET (200,0):COLOR 1:PRINTH*1, MAR-1: PRESET (200,0):COLOR 15:PRINT+*1,MAR
4110 RETURN
4500 SOUND 0,0: SOUND 1,0:SOUND 2,0: SOUND 3,09: SOUND 4,0: SOUND 5,06:SOUND 6,31:SOUND 7,7: SOUND 8,16: SOUND 9,16:SOUND 10,16:SOUND 11,0:SOUND 12,60: SOUND 13,0
4510 RETURN
5000 REM Ganar
5010 PRESET (48,72): COLOR 13: PRINT +$i, "BIEN HECHO TERRICOLA”
5020 PRESET (40,88):PRINT $1, "ESTA VEZ HAS GANADO TU"
5030 FOR D=1 TO 300:NEXT:BEEP:PLAY "T1i00S1M60009005L1GCE GO£L8COSL 166G04L8c"
5040 PRESET (72,112):PRINT $1, "PREPARATE PARA”
5050 PRESET (40,128):PRINT $1, "NUESTRO PROXIMO ATAQUE"
5060 FOR D=1 TO 500: NEXT
5070 ALIEN=INVAS: NIVEL=NIVEL+16: GANAR=9
50809 FOR A=1 TOD INVAS
5090 X(A)=24x*A: Y (A) = NIVEL
5100 NEXT A
5105 PRESET (48,72):COLOR 1:PRINTH+1, "BIEN HECHO TERRIC OLA":PRESET (40,88):PRINTH1,"ESTA VEZ HAS GANADO TU"*PRESET (72,112):PRINTH1, "PREPARATE PARA": PRESET (40,128):PRINTH*1, "NUESTRO PROXIMO ATAQUE"
5110 RETURN
6000 REM Perder
6010 CLOSE +$+1:SCREEN 0,0,0:COLOR 13,1,1:CLS
60620 LOCATE 16,3,0:PRINT "L O S”
5030 LOCATE 10,5,0:PRINT "INVASORE S”
6040 LOCATE 16,7,0:PRINT "H A N"
6050 LOCATE 9,9,0:PRINT "ATERRIZADO”
6060 BEEP:PLAY "T905S1MS00001A4A8. A324402C8.01B16B8.A16A 8.4162": FOR I=1 TO 2800: NEXT
6070 LOCATE 13,13,0:PRINT "SIN EMBARGO"
6080 LOCATE 12,15,0:PRINT "HAS DESTRUIDO"
607909 LOCATE 17,17,0:PRINT MAR:COLOR 10
6100 LOCATE 10,19,0:PRINT "NAVES ALIENIGENAS”
6110 LOCATE 4,22,0: INPUT "QUIERES ENFRENTARTE DE NUEVO"; As$
6120 IF LEFT$(A$,1)="S" OR LEFT$(A$,1)="s" THEN RUN
6130 CLS: SCREEN 0,,1: COLOR 1,15, 15: RETURN
7000 REM Pantalla
70160 SCREEN 2,0,0: COLOR 15,1,1:CLS
7020 SPRITES(12)=N$:SPRITES(11)=M$
7025 SPRITES (0)=B$
79030 FOR I=1 TO 106:SPRITES(1)=A%$: NEXT
7040 FOR S=1 TO 40
7050 X=INT(RND (5) 250) : Y=INT(RND(5)x190): PSET (X,Y),RND(1)*15
7060 NEXT S
7070 CIRCLE (52,28),16,9: CIRCLE (44,28),16,9,4.95673, 1.32645:PAINT (44,28),9
Continuación MSX
7080
7090
7100
7110
7120 8000 solo se15
8020
8030
8040 8050 8060 8070
8080 8090
8100 ailio 8120 8130
8140
8150 81650 8170 3180 8190 8200 8210 8215 8220 8230 8240 9000 qoelo 39020 9030 9040
CIRCLE (192,42),25,7: CIRCLE (180,42),24,7,4.95673, 1.32645:PAINT (180,42),7
CIRCLE (0,192),60,10,0,-3.1459/2:
LINE (0,192)-(640,192),10:PAINT (5,190),10,10 PRESET (200,144),4: DRAW"G32F146E32H146R8F 1 6L8BR8G32 L8":PAINT (192,168),4,4
OPEN "GRP:" AS *+1:PRESET (32,0):
PRINT +1, "INVASORES DESTRUIDOS: "5MAR
RETURN
REM Inicializar
SCREEN 0,0,0:COLOR 15,1,1:kKEY OFF:.CLS
BEEP:PLAY "T16058M6000005L4C6GL 10FEDL6D6C7.. . OSL4GL 10FEDL606C7. . . OOL4GLIOFEFD4"
LOCATE 2,5,0:
PRINT "ERES UN PILOTO SOLITARIO ENCARGADO"
LOCATE 4,65,0:
PRINT "DE PROTEGER EL PLANETA TIERRA.”
LOCATE 6,7,0:PRINT "EN UNOS INSTANTES ESTARAS" LOCATE 5,8,0:PRINT "BAJO EL ATAQUE DE INVASORES" LOCATE 9,9,0:PRINT "DEL PLANETA VARGON. "
LOCATE 3,11,0:
PRINT "TU MISION ES EVITAR QUE ATERRICEN"
LOCATE 7,12,0:PRINT "LAS NAVES VARGONIANAS. " LOCATE 1,14,0:
PRINT "EMPLEA EL CURSOR PARA MOVER TU NAVE" LOCATE 6,16,0:PRINT "PULSA LA BARRA ESPACIADORA" LOCATE 8,17,0:PRINT "PARA DISPARAR EL LASER" LOCATE 6,19,0:PRINT "PULSA CUALQUIER TECLA PARA" LOCATE 4,20,0:
PRINT "ENTABLAR COMBATE CON EL ENEMIGO”
PERDER=09: GANAR=09: MAR=0: XP=120: NIVEL=8: INVAS=10: ALIENS=INVAS: COLIS=0: AUX=1
DIM X(INVAS):DIM Y(INVAS)
FOR A=1 TO INVAS
X (A) =24+*A: Y (A) =NIVEL
NEXT A
FOR I=1 TO 8:READ N:M$=M$+CHR$ (N) ¿NEXT:REM Misil FOR I=1 TO 8:READ N: N$=N$+CHR$ (N) :NEXT:REM Nave FOR I=1 TO 8:READ N: A$=4$+CHR$(N) :NEXT:REM Invasor FOR I=1 TO 8:READ N: B$=B$+CHR$ (N) :NEXT:REM Explos ON SPRITE GOSUB 4000:SPRITE OFF
Q$=INPUTS$ (1)
RETURN
REM Datos sprites
DATA 16,165,56,16,16,165,56,108:REM Misil
DATA 16,56,16,186, 1896, 186,238,108: REM Nave
DATA 36,36,126,255,153,255,90,66: REM Invasor
DATA 84,1,136,56,157,16,665,16:REM explosion
SPECTRUM
=
S REM Invasores
10 GO SUB 8000: REM Inicializar
20 GO SUB 7000: REM Pantalla
30 GO SUB 1000: REM Alienigena
40 GO SUB 20060: REM Jugador
50 IF (ganar OR perder)=1 THEN G0 TO 70 £08 GO TO 30 s
42
Continuación Spectrum
70 80 90 1000 1010
1020 1030 1040 1050 1060 1070 1080 1099 2000 2010 2020 2030 2040 2050 2060 3000 3010 3020 3030 3040 3050 3060 3070
3080 3090 3100 4000 4005 4010 4020 4030 4040 4050
4060 4070 4080 5000 solo 5020 5030 5040 5050 060 5070
5080 090 5100 5110 6000 6010 6020 6030 6040
IF ganar=1 THEN GO SUB 50909: 60 TO 20
GO SUB 640006: REM Perder
CLS : PAPER 7: BORDER 7: INK 0: STOP
REM Alienigena
LET r=INT (RND*invasores)+1:2 IF y(r)=22 THEN RETURN
PAPER O: PRINT AT y(r)jxtr35" "
LET x(r)=x (r)+INT (RND*3)-i
LET y (r)=y(r)+1
IF x(r)>30 THEN LET x(r)=30
IF x(r3<i THEN LET x(r)=1
IF y(r)=21 THEN LET perder=1
INK 6: PRINT AT y(r),x(tr)33 "qe"
RETURN
REM Jugador
LET 1$=INKEYS
IF 1$="m" OR 1$="M" THEN GO SUB 3000: REM Laser IF (1$="2" OR 1$="Z") AND xp>09 THEN LET xp=xp-1 IF (1$="x" OR 1$="X") AND xp<29 THEN LET xp=xp+1 INK 2: PRINT AT 21,xp3" A "
RETURN
REM Laser
LET ym=21: LET xm=xp+1
LET ym=ym-1
IF POINT (xm*8, (21-ym)x*8+2)=1 THEN LET colest=1 IF POINT (xm*8, (21-ym)*8+3)=1 THEN LET colalien=1 INK 7: PRINT AT ym,xm3"!"
PAPER 0: PRINT AT ym,xm3" ”
IF colest=1 THEN PLOT xm*8, (21-ym)*8+2:
LET colest=09
IF colalien=i THEN GO SUB 4000
IF ym=1 THEN RETURN
GO TO 3020
REM Impacto
BEEP .05,-10
FOR a=i TO invasores
IF x(a)<>xm OR yla)<>ym THEN GO TO 4040
LET y(a)=22: LET a=invasores
NEXT a
LET alienigenas=alienigenas-1: LET puntos=puntos+i : LET colalien=0: LET ym=1
IF alienigenas=0 THEN LET ganar=1
INK 7: PRINT AT 0,2653puntos
RETURN
REM Ganar
INK 5: PRINT AT 6,53"BIEN HECHO TERRICOLA"”
PRINT AT 8,43"ESTA VEZ HAS GANADO TU"
BEEP .5,2: BEEP .5,10: BEEP 1,20
PRINT AT 12,83 "FREPARATE PARA"
PRINT AT 14,43 "NUESTRA PROXIMO ATAQUE”
FOR d=1 TO 4090: NEXT d
LET alienigenas=invasores: LET altura=altura+2: LET ganar=09
FOR a=1 TO invasores
LET x(a)=a*32 LET y(a)=altura
NEXT a
RETURN
REM Perder
CLS» a
INK S: FLASH 1: PRINT AT 1,133"L O S”
PRINT AT 3,73"INVASORES”
PRINT AT 5,133"H A N”
43
Continuación Spectrum
6050 6050 6070 £080 £0690 £100 £110 6120 £6130 £140 7000 7010 7020 7030 7040 7050 70559 7060 8000 solo 8020 8030 8040 8050 8060 8070 gogo 8090 ai100 ello 8120 8125 8130
8140 8150 38160 8170 8180 8190 8200 8210 8220 8230 8240 82509 38250 8270
PRINT AT 7,65 "A TERR IZADO”: FLASH O BEEP 2,-10 INK 6: PRINT AT 10,10;"SIN EMBARGO"
PRINT AT 12,9;"HAS DESTRUIDO”
INK 2: FLASH 12 PRINT AT 14,155puntos: FLASH 0 INK 6: PRINT AT 16,753"NAVES ALIENIGENAS"
PRINT AT 20,15"QUIERES ENFRENTARTE DE NUEVO?" INPUT a$
IF a$(1)="s" OR a$(1)="S" THEN RUN
RETURN
REM Pantalla
CLSs
FOR s=i TO 40
PLOT 8*INT (RND*32),8*INT (RND*21)+10
NEXT s
INK 7: PRINT AT 0,55" INVASORES DESTRUIDOS="3puntos FOR b=1 TO 20: BEEP .1,20: NEXT b
RETURN
REM Inicializar
PAPER 0: INK 7: BORDER 0: CLS
PRINT AT 1,4;"Eres un piloto solitario"
PRINT AT 2,1;"protegiendo el planeta Tierra." PRINT AT 3,1;"En unos instantes estaras bajo" PRINT AT 4,3;"el ataque de invasores del" PRINT AT 5,953"planeta VARGON. "
PRINT AT 6,4;3"Tu mision es evitar que"
PRINT AT 7,05"aterricen las naves vargonianas." PRINT AT 10,23"*Z” MUEVE LA NAVE A LA IZDA" PRINT AT 12,23"*X” MUEVE LA NAVE A LA DCHA" PRINT AT 14,4;"PULSA ”M” PARA DISPARAR"
PRINT AT 20,25"Pulsa cualquier tecla para" PRINT AT 21,0;3"entablar combate con el enemigo” LET perder=0: LET ganar=0: LET puntos=0:
LET colalien=0: LET colest=0: LET xp=16:
LET altura=1: LET invasores=10:
LET alienigenas=invasores
DIM x(invasores): DIM y(invasores)
FOR a=1 TO invasores
LET x(a)=ax*3: LET y(a)=altura
NEXT a
POKE £45358,BIN 00100100
POKE 65369,BIN 0010901009
POKE £5370,BIN 01111110
POKE 45371,BIN 11111111
POKE £5372,BIN 10011001
POKE 65373,BIN 11111111
POKE 65374,BIN 01011010
POKE £5275,BIN 01000010
LET R$=INKEY$: IF R$="" THEN GO TO 8240 RETURN
44
- ENSEÑA
PORQUE. E
NE ADE
ESTA NUEVA SERIE IAE UNA ona pa AL ARTE DE PROGRAMAR ORDENADORES. CADA LIBRO IN PROGRAMA EN A
la CÓMO ESTRUCTURAR 1 RLITINAS. Y AL MISMO TIEMPO EXPLICA Y ANALIZA 10 QUE SE LE PIDE AL ORDENADOR QUE HAGA Y
MÁS E ES | DIVERTIDO! CADA LIBRO CONTIENE COMO MÍNIMO UN JUEGO DE ORDENADOR, APASIONANTE Y ORIGINAL, ESTRUCTURADO DE TAL MODO. QUE PUEDE AMPLIARSE o REDUCIRSE, DE ACUERDO CON EL NIVEL O LOS DESEOS DEL
USARIO,
TÍTULOS DE LA SERIE
Animació j ción - Sonido - Gráficos móviles