story-s.f. (La historia interminable)
Descripción del contenido de la página
Programa de entretenimiento escrito en Sinclair BASIC, un libro de ficción «no interactiva».
Escribí este programa cuando estaba empezando a aprender a programar, y sólo eso lo hace especial para mí, como muchos otros de esa época (1983-1984) que iré publicando poco a poco. Curiosamente, lo escribí el día de Navidad de 1983.
No es un juego, porque no hay que hacer nada con él salvo mirar la pantalla; tampoco es una utilidad ni una aplicación, porque no sirve para nada. Por eso lo llamo un «entretenimiento», con el que efectivamente, programándolo, me entretuve (y aprendí) mucho.
Podríamos llamarlo un libro de ficción «no interactiva». El programa cuenta cada vez una disparatada historia de ciencia ficción, formada por párrafos elegidos al azar siguiendo un árbol de opciones. «Jugar» varias veces tiene su gracia, hasta que las páginas de las historias comienzan a repetirse; por eso no se recomienda usarlo más de una vez cada década, más o menos, para así olvidarlo y que vuelva a tener su gracia original.
Por algún motivo que no recuerdo, el programa tiene dos nombres: uno muy extraño, story-s.f. (en que s.f.
significa tanto sin final
como science fiction
); y otro más normal, La historia interminable.
Origen de la idea
Hay un motivo por el que aprecio especialmente este programa: está basado en un esquema que encontré en la página 50 del libro La máquina superinteligente. Una odisea electrónica, de Adrian Berry (editado por Alianza Editorial en 1983 en su colección El libro de Bolsillo con el número 970, ISBN 84-206-9930-5).
Había comprado el libro un mes antes y lo había leído varias veces; es un libro muy original e interesante, escrito con mucho humor; posiblemente es uno de los libros sobre informática que más he disfrutado. Cuando vi el simpático esquema sobre cómo escribir una novela de ciencia ficción, mostrado como ejemplo de cómo se construye un programa, enseguida vi que era una estupenda idea para realizar con la ZX Spectrum.
He escaneado esa página del libro, que aún conserva, anotados con lápiz, los números de línea en que se imprimían cada una de las fases de la historia, y que fui escribiendo durante el diseño del programa.
El esquema muestra pues todas las posibles historias que el programa puede crear al azar:
Pantallazos
El menú de inicio no puede ser más profesional:
Las siguientes pantallas muestran un ejemplo del funcionamiento del programa, una de las muchísimas y disparatadas historias posibles:
En la misma línea de ergonomía, claridad y limpieza del menú principal, he aquí el menú final:
Código fuente
1 REM story-s.f. La historia interminable
2 REM Copyright (C) 1983 Marcos Cruz (http://programandala.net)
3 REM Licencia/Permesilo/License: http://programandala.net/lp
4 REM 1983-12-25
5 PRINT AT 11,0; FLASH 1;" Pare el cassette ": PAUSE 150: CLS : PRINT ; PAPER INT (RND*6); INK 9;AT 1,4;"LA HISTORIA INTERMINABLE";AT 3,4;"(Programa:""STORY-S.F."")"
6 PRINT AT 6,3;"Elija PAUSA para pasar de pagina:";AT 9,3;"0 = PAUSA manual (con cual- quier tecla).";AT 12,3;"50 = 1 segundo";AT 15,3;"100 = 2 segundos...": INPUT p: GO TO 8
7 SAVE "STORY-S.F." LINE 5: VERIFY "STORY-S.F.": RUN
8 IF p<0 THEN BEEP 2,10: GO TO 6
9 PRINT AT 18,6; PAPER INT (RND*7); INK 9;" O.K. : PAUSA = ";p;" ": PAPER 7: BORDER 7: PAUSE p: CLS
10 FOR l=0 TO 21
20 PRINT AT l,9; INK 2;"████████████████"
30 NEXT l
40 PLOT 79,175: DRAW 0,-175
50 PRINT ; PAPER INT (RND*8); INK 9;AT 8,11;"LA HISTORIA ";AT 12,11;"INTERMINABLE"
60 PAUSE p: BEEP 0.2,RND*5: CLS
70 LET b$="███████████████"
80 PRINT ; INK 2;b$;b$;"█";AT 21,0;b$;b$;"█"
90 FOR z=0 TO 21
100 PRINT ; INK 2;AT z,0;"█";AT z,31;"█": NEXT z
110 GO SUB 9090
120 PRINT AT 0,16; INK 0;"█";AT 21,16;"█": PAUSE p: BEEP 0.2,RND*5
125 PRINT ; PAPER INT (RND*8); INK 9;AT 6,17;"LA HISTORIA";AT 8,17;"INTERMINABLE": PRINT AT 10,17;"Marcos Cruz"
127 GO SUB 9000
130 PRINT AT 10,2;" LA TIERRA."
132 LET a=140: LET b=150: LET c=160: LET d=170
134 GO TO 9400
140 PRINT AT 7,17;"SE ABRASA Y";AT 9,17;"SE CONGELA";AT 11,17;"POR";AT 13,17;"ESTACIONES Y"
142 LET a=180: LET b=190
146 GO SUB 9000: GO TO 9200
150 PRINT AT 7,17;"SUFRE EL";AT 9,17;"IMPACTO";AT 11,17;"DE UN COMETA";AT 13,17;"GIGANTE"
152 LET a=200: LET b=210: LET c=220
154 GO SUB 9000: GO TO 9300
160 PRINT AT 9,17;"LOS";AT 11,17;"CIENTIFICOS"
162 LET a=230: LET b=240
164 GO SUB 9000: GO TO 9200
170 PRINT AT 10,17;"ES ATACADA"
172 LET a=250: LET b=260: LET c=270: LET d=280
174 GO SUB 9000: GO TO 9400
180 PRINT AT 9,3;"MUEREN";AT 11,3;"TODOS."
182 LET L=10: LET C=20
184 GO TO 9700
190 PRINT AT 9,3;"MUEREN CASI";AT 11,3;"TODOS."
192 LET L=10: LET C=20
194 GO TO 9700
200 PRINT AT 8,3;"ES";AT 10,3;"DESTRUIDA."
202 LET L=10: LET C=20
204 GO TO 9700
210 PRINT AT 10,3;"SE SALVA."
212 LET L=10: LET C=20
214 GO TO 9700
220 PRINT AT 8,3;"NO ES";AT 10,3;"DESTRUIDA";AT 12,3;"PERO"
222 LET a=290: LET b=300
224 GO TO 9200
230 PRINT AT 10,3;"INVENTAN"
232 GO TO 285
240 PRINT AT 10,3;"DESCUBREN"
242 GO TO 285
250 PRINT AT 9,3;"DESDE MARTE";AT 11,3;"POR"
252 GO TO 285
260 PRINT AT 9,3;"DESDE LA";AT 11,3;"LUNA POR"
262 GO TO 285
270 PRINT AT 7,3;"DESDE";AT 9,3;"LA ESTRELLA";AT 11,3;"PROXIMA";AT 13,3;"CENTAURI POR"
272 GO TO 285
280 PRINT AT 8,3;"DESDE";AT 10,3;"EL ESPACIO";AT 12,3;"EXTERIOR POR"
285 LET a=310: LET b=320: GO TO 9200
290 PRINT AT 8,17;"MUEREN";AT 10,17;"TODOS."
292 LET L=12: LET C=20
294 GO TO 9700
300 PRINT AT 7,17;"MUEREN";AT 9,17;"CASI";AT 11,17;"TODOS."
302 LET L=13: LET C=20
304 GO TO 9700
310 PRINT AT 10,17;"DIMINUTOS"
312 GO TO 325
320 PRINT AT 10,17;"GIGANTESCOS"
325 LET a=330: LET b=340: LET c=350: LET d=360: LET e=370: GO SUB 9000: GO TO 9500
330 PRINT AT 10,3;"INSECTOS"
332 GO TO 380
340 PRINT AT 10,3;"REPTILES"
342 GO TO 380
350 PRINT AT 9,3;"APARATOS";AT 11,3;"MECANICOS"
352 GO TO 380
360 PRINT AT 10,3;"HUMANOIDES"
362 GO TO 380
370 PRINT AT 9,3;"SERES";AT 11,3;"REPUGNANTES"
380 PRINT AT 10,17;"QUE"
382 LET a=390: LET b=410: LET c=420: LET d=430: LET e=440: LET f=450
384 GO SUB 9000: GO TO 9600
390 PRINT AT 8,3;"BUSCAN A";AT 10,3;"NUESTRAS";AT 12,3;"MUJERES;"
392 LET a=400: LET b=470
394 GO TO 9200
400 PRINT AT 7,17;"SE LLEVAN A";AT 9,17;"ALGUNAS Y";AT 11,17;"SE MARCHAN."
402 LET L=13: LET C=20
404 GO TO 9700
410 PRINT AT 8,3;"SON";AT 10,3;"AMISTOSOS."
412 LET L=12: LET C=3
414 GO TO 9700
420 PRINT AT 5,3;"SON";AT 7,3;"AMISTOSOS";AT 9,3;"PERO NO";AT 11,3;"ENCUENTRAN";AT 13,3;"BUENA";AT 15,3;"ACOGIDA"
422 GO TO 470
430 PRINT AT 9,3;"NO NOS";AT 11,3;"COMPRENDEN"
432 GO TO 470
440 PRINT AT 7,3;"NOS";AT 9,3;"COMPRENDEN";AT 11,3;"DEMASIADO ";AT 13,3;"BIEN"
442 GO TO 470
450 PRINT AT 7,3;"NOS VEN";AT 9,3;"SOLO COMO";AT 11,3;"FUENTE DE";AT 13,3;"ALIMENTO"
452 LET a=460: LET b=470
454 GO TO 9200
460 PRINT AT 8,17;"Y NOS";AT 10,17;"COMEN."
462 LET L=12: LET C=20
464 GO TO 9700
470 PRINT AT 10,17;"Y SON"
472 LET a=480: LET b=490
474 GO SUB 9000: GO TO 9200
480 PRINT AT 10,3;"RADIACTIVOS"
482 GO TO 500
490 PRINT AT 9,3;"NO";AT 11,3;"RADIACTIVOS"
492 GO TO 500
500 PRINT AT 10,17;"Y"
502 LET a=510: LET b=520
504 GO SUB 9000: GO TO 9200
510 PRINT AT 8,3;"PUEDEN SER";AT 10,3;"DESTRUIDOS";AT 12,3;"POR"
512 LET a=530: LET b=540: LET c=550: LET D=9700: LET Y$="Y": LET d$="."
514 GO TO 9300
520 PRINT AT 7,3;"NO";AT 9,3;"PUEDEN SER";AT 11,3;"DESTRUIDOS";AT 13,\{vnvn}3;"POR"
522 LET a=530: LET b=540: LET c=550: LET D=560: LET Y$="NI": LET d$=","
524 GO TO 9300
530 PRINT AT 5,17;"UNA HORDA";AT 7,17;"DE";AT 9,17;"CAMPESINOS";AT 11,17;"CON HACHAS."
532 LET L=13: LET C=20
534 GO TO D
540 PRINT AT 5,17;"EL EJERCITO,";AT 7,17;"LA ARMADA";AT 9,17;Y$;" LAS";AT 11,17;"FUERZAS";AT 13,17;"AEREAS";d$
542 LET L=15: LET C=20
544 GO TO D
550 PRINT AT 8,17;"LA BOMBA";AT 10,17;"ATOMICA";d$
552 LET L=12: LET C=20
554 GO TO D
560 LET a=590: LET b=600: LET c=610
562 GO SUB 9000: GO TO 9300
570 LET a=680: LET b=690: LET c=700
572 GO SUB 9000: GO TO 9300
590 PRINT AT 7,3;"PERO";AT 9,3;"COGEN LA";AT 11,3;"VARICELA Y";AT 13,3;"MUEREN."
592 LET L=10: LET C=20
594 GO TO 9700
600 PRINT AT 7,3;"ASI QUE LOS";AT 9,3;"CIENTIFICOS";AT 11,3;"INVENTAN";AT 13,3;"UN ARMA"
602 LET a=620: LET b=630
604 GO TO 9200
610 PRINT AT 10,3;"PERO"
612 LET a=640: LET b=650: LET c=660
613 GO TO 9300
620 PRINT AT 10,17;"QUE FRACASA"
622 LET a=590: LET b=720: LET c=730: LET d=740
624 GO SUB 9000: GO TO 9400
630 PRINT AT 8,17;"QUE LOS";AT 10,17;"ELIMINA."
632 LET L=12: LET C=20
634 GO TO 9700
640 PRINT AT 6,17;"UN CHICO";AT 8,17;"MUY LISTO";AT 10,17;"LOS CONVENCE";AT 12,17;"DE QUE SON";AT 14,17;"BUENA GENTE"
642 GO TO 570
650 PRINT AT 8,17;"UN SACERDOTE";AT 10,17;"LES HABLA";AT 12,17;"DE DIOS"
652 GO TO 570
660 PRINT AT 8,17;"SE ENAMORAN";AT 10,17;"DE UNA";AT 12,17;"CHICA GUAPA"
662 LET a=680: LET b=690: LET c=700: LET d=710
664 GO SUB 9000: GO TO 9400
670 PRINT AT 5,17;"QUE LOS";AT 7,17;"CONVIERTE";AT 9,17;"EN UN";AT 11,17;"AMASIJO";AT 13,17;"REPULSIVO."
672 LET L=15: LET C=20
674 GO TO 9700
680 PRINT AT 9,3;"Y MUEREN."
682 LET L=11: LET C=6
684 GO TO 9700
690 PRINT AT 9,3;"Y SE";AT 11,3;"MARCHAN."
692 LET L=10: LET C=20
694 GO TO 9700
700 PRINT AT 5,3;"Y SE";AT 7,3;"CONVIERTEN";AT 9,3;"EN UN";AT 11,3;"AMASIJO";AT 13,3;"REPULSIVO."
702 LET L=15: LET C=6
704 GO TO 9700
710 PRINT AT 7,3;"Y SE CASAN";AT 9,3;"Y VIVEN";AT 11,3;"FELICES."
712 LET L=13: LET C=6
714 GO TO 9700
720 PRINT AT 8,3;"ASI QUE";AT 10,3;"NOS MATAN."
722 LET L=10: LET C=20
724 GO TO 9700
730 PRINT AT 5,17;"Y NOS SOMETEN";AT 7,17;"A UNA";AT 9,17;"DICTADURA";AT 11,17;"TOLERANTE."
732 LET L=13: LET C=20
734 GO TO 9700
740 PRINT AT 8,17;"ASI QUE";AT 10,17;"NOS MATAN."
742 LET L=12: LET C=20
744 GO TO 9700
9000 REM cambio de pagina y BEEP
9010 PAUSE p: BEEP 0.2,RND*5
9020 FOR K=17 TO 2 STEP -15
9030 FOR I=1 TO 20
9040 PRINT AT I,K;" "
9050 NEXT I
9060 NEXT K
9090 PLOT 127,0: DRAW 0,175
9100 PLOT 8,8: DRAW 239,0: PLOT 8,167: DRAW 239,0
9110 PLOT 8,8: DRAW 0,159: PLOT 10,8: DRAW 0,159: PLOT 14,8: DRAW 0,159
9120 PLOT 247,8: DRAW 0,159: PLOT 245,8: DRAW 0,159: PLOT 241,8: DRAW 0,159
9130 RETURN
9200 REM 2 posibilidades
9210 LET r=INT (RND*21)
9220 IF r<=10 THEN GO TO a
9230 IF r<=20 THEN GO TO b
9300 REM 3 posibilidades
9310 LET r=INT (RND*31)
9320 IF r<=10 THEN GO TO a
9330 IF r<=20 THEN GO TO b
9340 IF r<=30 THEN GO TO c
9400 REM 4 posibilidades
9410 LET r=INT (RND*41)
9420 IF r<=10 THEN GO TO a
9430 IF r<=20 THEN GO TO b
9440 IF r<=30 THEN GO TO c
9450 IF r<=40 THEN GO TO d
9500 REM 5 posibilidades
9510 LET r=INT (RND*51)
9520 IF r<=10 THEN GO TO a
9530 IF r<=20 THEN GO TO b
9540 IF r<=30 THEN GO TO c
9550 IF r<=40 THEN GO TO d
9560 IF r<=50 THEN GO TO e
9600 REM 6 posibilidades
9610 LET r=INT (RND*61)
9620 IF r<=10 THEN GO TO a
9630 IF r<=30 THEN GO TO c
9640 IF r<=40 THEN GO TO d
9650 IF r<=50 THEN GO TO e
9660 IF r<=60 THEN GO TO f
9700 REM FIN
9710 PRINT ; PAPER INT (RND*7); INK 9;AT L,C;"FIN"
9715 BEEP .5,0: BEEP .5,2: BEEP .5,4: BEEP .5,5: BEEP .5,7: BEEP .7,9: BEEP .5,11: BEEP .5,12
9720 PAUSE p: CLS
9730 PRINT AT 6,3;"1)Grabar de nuevo el programa (si se ha transformado)."
9732 PRINT AT 12,3;"2)RUN"
9734 PRINT AT 18,3;"3)Cambiar la PAUSA."
9740 PRINT AT 3,0; PAPER INT (RND*7); INK 9;"SELECCIONE FUNCION:"
9750 IF INKEY$="1" THEN GO SUB 9800: PRINT AT 6,0; PAPER 5; FLASH 1;" CONECTE MIC CON EL CASSETTE ": PRINT AT 12,5;"Pulse una tecla para:";AT 18,4;"SAVE ""STORY-S.F."" LINE1": PAUSE 0: SAVE "STORY-S.F." LINE 1: STOP
9760 IF INKEY$="2" THEN GO SUB 9810: GO TO 10
9770 IF INKEY$="3" THEN GO SUB 9820: GO TO 3
9780 GO TO 9750
9800 PRINT AT 6,3; PAPER 4; FLASH 1;"1)": GO SUB 9830: RETURN
9810 PRINT AT 12,3; PAPER 4; FLASH 1;"2)": GO SUB 9830: RETURN
9820 PRINT AT 18,3; PAPER 4; FLASH 1;"3)": GO SUB 9830: RETURN
9830 PAUSE 1: PRINT AT 0,6; PAPER 4;"Un momento,por favor.": PAUSE 150: CLS : RETURN