Ensamblaje
Descripción del contenido de la página
Juego escrito en Sinclair BASIC para la ZX Spectrum.
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
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
- ensamblaje.tap (3.61 KiB)
- ensamblaje.mgt.zip (24.95 KiB) Imagen de disquete de Plus D, comprimida con zip.
- ensamblaje.mgt.gz (25.09 KiB) Imagen de disquete de Plus D, comprimida con gzip.
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.