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».

Etiquetas:

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:

Esquema

Pantallazos

El menú de inicio no puede ser más profesional:

Menú inicial

Las siguientes pantallas muestran un ejemplo del funcionamiento del programa, una de las muchísimas y disparatadas historias posibles:

PortadaTítulo y autorCapítulo 1Capítulo 2Capítulo 3Capítulo 4Capítulo 5Fin

En la misma línea de ergonomía, claridad y limpieza del menú principal, he aquí el menú final:

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

Descargas

story-sf.tap (10.53 KiB)