Ensamblaje

Descripción del contenido de la página

Juego escrito en Sinclair BASIC para la ZX Spectrum.

Etiquetas:

Uno de los primeros juegos mínimamente elaborados que escribí es esta adaptación mejorada para ZX Spectrum de un juego muy sencillo para ZX-81. Creo recordar que el original apareció en uno de los primeros números de la revista ZX.

El código de Ensamblaje es un ejemplo excelente de cómo no se debe programar, y cómo sin embargo aprendimos a programar en el limitado BASIC de la ZX Spectrum. Este programa es quizá, de todos los que escribí cuando estaba empezando a aprender programación, entre 1983 y 1984, el peor escrito: tiene de saltos a variables calculadas según condiciones anteriores; saltos indiscriminados para romper el flujo; entradas a rutinas desde varios puntos y salidas de ellas con saltos; código redundante; cálculos inflados; operaciones innecesarias que solo consumen tiempo; código abandonado entre líneas que nunca se ejecuta... Una preciosidad.

Y a pesar de todo funciona sin fallos e incluso tiene su gracia.

Pantallazos

InstruccionesCombustibleNivelEstrellasNave cayendoNave ascendiendoEnsamblajeExplosiónReserva

Código fuente

El listado mostrado a continuación está en formato del editor-emulador BASin. Por ello los caracteres de control incluidos en algunos textos se muestran como una barra hacia la izquierda seguida de una abreviatura entre llaves.

   1 REM ENSAMBLAJE
   4 REM Copyright (C) 1984,1987,2011 Marcos Cruz (programandala.net)
   5 REM Licencia/Permesilo/License: programandala.net/licencia
  10 REM 1984-01 Primera version, basada en un juego de ZX-81.
  11 REM 1987 Adaptado a DISCiPLE.
  12 REM 2011-03-03 Version dual para cinta y Beta DOS.
  13 :
  22 GO TO 25
  23 CLS #: LOAD d*"ensambla.g"CODE USR "a": GO TO 25
  24 CLS : PRINT AT 11,0; PAPER 6; INK 0; FLASH 1;"            CARGANDO            ": LOAD ""CODE USR "a"
  25 GO SUB 600: LET s=100: PAPER 0: GO SUB 255: GO SUB 300
  26 BORDER 0: FOR n=1 TO 100: INK RND*8
  27 BRIGHT 1: PLOT INT (RND*255),INT (RND*175)
  28 NEXT n: INK 7
  29 BORDER 0: LET x=160: LET p=14: LET z=174: LET l=p: LET d=l: LET j=0
  30 LET k=INT (RND*11)
  35 LET f$="    "
  40 FOR f=0 TO 23
  50 PRINT AT 20,14;"NON";AT k,f;f$;"KLM";AT d,p;f$;TAB p;f$;AT l,p;"IAJ";TAB p;"BCD"
  55 PRINT AT 20,0;"FUEL= ";INT fuel;f$
  60 LET d=l
  70 LET l=l+1
  80 IF l>=20 THEN GO SUB 210: GO TO 26
  90 IF fuel<=q*1/3 THEN LET z=177: PRINT AT 20,18; FLASH 1;"FUEL AUXILIAR"
  92 IF fuel<=0 THEN LET x=140: BEEP .009,0
  95 IF f=10 AND l+1=k THEN GO SUB 240: GO TO 26
 100 IF INKEY$="7" THEN GO TO x
 135 PRINT AT d+2,14;f$
 140 PRINT AT k,27; INK 0;"": NEXT f
 145 PRINT AT k,f;f$
 150 GO TO 30
 160 LET l=l-3
 170 GO TO z
 174 PRINT AT d+2,p+1; INK 2; BRIGHT 1;"F";AT d+3,p+1;"H": LET sm=0: GO TO 180
 177 PRINT AT d+2,p; INK 2; BRIGHT 1;"E G";AT d+3,p;"H H": LET sm=-10: IF fuel>q*1/3 THEN LET z=174: PRINT AT 20,18;"             "
 180 IF l<0 THEN LET l=0
 190 LET fuel=fuel-nd: IF fuel<0 THEN LET fuel=0
 200 BEEP .01,sm: GO TO 135
 210 LET s=s-100
 211 GO SUB 500
 212 IF s<0 THEN LET s=0
 213 CLS : BORDER 4: PRINT AT 10,10; PAPER 4; INK 0;"PUNTOS: ";INT s
 215 IF s<=0 THEN FOR n=1 TO 69: BEEP .1,n: NEXT n: GO TO 25
 220 PAUSE 150: CLS : RETURN
 240 PRINT AT k,f+4;"KLM": FOR n=50 TO 1 STEP -1
 242 BORDER 2: BEEP .01,n-25: BORDER 1
 243 BEEP .01,n: BEEP .01,0: BORDER 6: BEEP .009,n-35
 244 NEXT n
 250 LET s=s+100+fuel: LET fuel=fuel+(q/3)
 255 CLS : BORDER 4: PRINT AT 10,10; INK 0; PAPER 4;"PUNTOS: ";INT s
 260 PAUSE 150: CLS : RETURN
 300 CLS : BORDER 6: PRINT AT 10,5; INK 0; PAPER 6;"COMBUSTIBLE INICIAL:"
 301 INPUT q: LET fuel=q: IF q<10 OR q>1000 THEN BEEP .1,10: GO TO 301
 302 CLS : BORDER 2: PRINT AT 10,3; INK 0; PAPER 2;"NIVEL DE DIFICULTAD(1-";q/10;")": INPUT nd
 303 IF nd<1 OR nd>q/10 THEN GO TO 302
 310 CLS : RETURN
 500 FOR n=1 TO 50
 510 BORDER 2: PRINT AT 19,14; PAPER 0; INK 6;"QRS";AT 20,14;"STQ": BEEP .009,-26: BORDER 6: PRINT AT 19,14; INK 2; PAPER 0;"QRS";AT 20,14;"STQ": BORDER 4
 511 NEXT n
 535 IF fuel=0 THEN CLS : PRINT AT 10,10;"TOTAL= ";INT s: FOR n=1 TO 69: BEEP .01,n: NEXT n: CLS : GO SUB 600: LET s=100: GO SUB 255: GO SUB 300
 540 RETURN
 600 PAPER 0: BORDER 5: INK 5: CLS : PRINT TAB 10;\{vivn}"\{vi}INSTRUCCIONES\{vn}": PRINT
 610 PRINT "\{vi}'7'\{vn} SUBE": PRINT : PRINT "\{vi}ENSAMBLAJE\{vn} *CONCEDE 100 PUNTOS": PRINT : PRINT "MAS EL FUEL SOBRANTE": PRINT : PRINT "(EN PUNTOS)"
 620 PRINT : PRINT "*AUMENTA EL FUEL EN 1/3 DEL": PRINT : PRINT "VALOR INICIAL"
 630 PRINT : PRINT "\{vi}CAIDA\{vn} RESTA 100 PUNTOS"
 640 PRINT : PRINT "\{vi}FUEL=0\{vn} FIN DEL JUEGO"
 650 PRINT : PRINT "AVISO FUEL AUXILIAR SI EL DEPO-": PRINT : PRINT "SITO ESTA A 1/3 DEL TOTAL"
 660 PAUSE 0: RETURN
 700 FOR N=0 TO 7: INPUT F: POKE USR "O"+N,F: NEXT N
 800 SAVE "ENSAMBLAJE" LINE 24: SAVE "ensamblaje"CODE USR "a",21*8: VERIFY "ENSAMBLAJE": VERIFY "ensamblaje"CODE : STOP
 805 SAVE OVER d*"ensamblaje" LINE 23: SAVE OVER d*"ensambla.g"CODE USR "a",21*8: VERIFY d*"ensamblaje": VERIFY d*"ensambla.g"CODE : STOP

Descargas

Las imágenes de disquete de Plus D arrancan con la última versión corregida de Beta DOS en lugar del sistema original G+DOS, pero eso no influye en el juego: El único comando de Beta DOS en el programa, SAVE OVER, no se usa durante el juego.