“Cómo generar laberintos”, con fallos

Gracias a lobogris se ha detectado que el programa “Cómo generar laberintos” del nº 26 de la revista Microhobby contiene un error grave. Al margen de que le faltaba la linea 120 en el archivo LAB1.TAP que ha sido subsanado, aun así el programa siempre devuelve el error B Integrer Out Of Range 410:1 y en algún caso otro error 3 Subscript Wrong en la misma línea cuando el dibujo del laberinto llega al extremo derecho de la pantalla, y también 5 Out of screen 150:4 si roza el margen inferior. Examinando el listado veo que el autor del programa, Paco Martín, no ha tenido en cuenta los límites de la pantalla y no veo en el programa alguna rutina que detecte el límite del laberinto con los márgenes exteriores de la misma. Hay dos variables V y H que se van posicionando aleatoriamente a partir de unas posiciones marcadas (V=13 y H=3) dentro de la matriz A$ compuesta por 25×35 caracteres y cuando alcanzan una de estas variables un valor igual a 1 genera dicho error. Por supuesto, se ha comprobado el listado con el aparecido en las páginas de la revista en su totalidad y no he apreciado en él más fallos salvo la ausencia de la linea 120 en el archivo en cuestión.

Aun así, también creo que hay alguna incoherencia con el listado original aparecido en la revista y puedo creer en la posibilidad de que se hubiera cometido algún error en su maquetación.

A pesar de que he querido corregir el programa por mi cuenta, pero no veo de qué forma podría añadir esta rutina de detección de los bordes de la pantalla sin alterar demasiado el listado. He subido el programa corregido hasta donde he podido junto con un archivo .BAS para que podáis trastear con él con el BASin de Paul Dunn. Si alguno consigue encontrarle una solución para que el programa funcione, muchísimo mejor.

DESCARGA

Éste es el listado, tal como ha sido copiado desde el referido programa:

10 BORDER 0: PAPER 0: INK 7: CLS : GO SUB 9100
12 :
15 REM \{vi} Inicializacion de las dimensiones \{vn}
17 :
20 DIM a$(25,35)
22 :
25 REM \{vi} Se "marca" el contorno y el interior del laberinto \{vn}
27 :
30 LET A$(1)=" ": LET A$(25)=A$(1) "35 espacios en variable A$(1)"
40 FOR N=2 TO 24: LET A$(N)=" ": NEXT N "35 espacios en A$(N)"
42 :
45 REM \{vi} Inicializacion del contador de "direcciones" \{vn}
47 :
50 DIM C(120,2): LET CO=2
52 :
55 REM \{vi} Se asigna la posicion de inicio. Impresion inicial del contenido del laberinto \{vn}
57 :
60 LET V=13: LET H=3: LET A$(V,H)="\::": GO SUB 9000
65 :
100 REM \{vi} Construccion del laberinto \{vn}
105 :
110 GO SUB 400: IF NOT LI THEN GO SUB 300: GO TO 100+400*(NOT V AND NOT H): REM \{vi} Si V=0 y H=0 el laberinto esta terminado \{vn}
120 IF LI>1 THEN GO SUB 200
130 IF (RND>.6 OR LI=1) AND A$(V-2,H)=" " THEN LET A$(V-1,H)="\::": LET A$(V-2,H)="\::": PRINT AT V-4,H-3;"\::";AT V-5,H-3;"\::": LET V=V-2: GO TO 100
140 IF (RND>.5 OR LI=1) AND A$(V,H+2)=" " THEN LET A$(V,H TO H+2)="\::\::\::": PRINT AT V-3,H-2;"\::\::": LET H=H+2: GO TO 100
150 IF (RND>.5 OR LI=1) AND A$(V+2,H)=" " THEN LET A$(V+1,H)="\::": LET A$(V+2,H)="\::": PRINT AT V-2,H-3;"\::";AT V-1,H-3;"\::": LET V=V+2: GO TO 100
160 IF (RND>.5 OR LI=1) AND A$(V,H-2)=" " THEN LET A$(V,H-2 TO H)="\::\::\::": PRINT AT V-3,H-5;"\::\::": LET H=H-2: GO TO 100
170 GO TO 130
175 :
200 REM \{vi} La posicion actual queda almacenada. El contador se incrementa \{vn}
205 :
210 LET C(CO,1)=V: LET C(CO,2)=H: LET CO=CO+1: RETURN
250 :
300 REM \{vi} La posicion del "contador de direcciones" se reduce \{vn}
305 :
310 LET CO=CO-1: LET V=C(CO,1): LET H=C(CO,2): RETURN
395 :
400 REM \{vi} La variable LI toma el numero de "caminos" posibles \{vn}
405 :
410 LET LI=(A$(V+2,H)=" ")+(A$(V-2,H)=" ")+(A$(V,H+2)=" ")+(A$(V,H-2)=" ")
420 RETURN
425 :
500 REM \{vi}El laberinto esta totalmente terminado \{vn}
505 :
510 PRINT #0;"TERMINADO": PAUSE 0
520 PRINT #0;AT 1,0;"Otro laberinto (s/n)?": PAUSE 0
530 IF INKEY$="s" OR INKEY$="S" THEN RUN
540 IF INKEY$"n" AND INKEY$"N" THEN GO TO 530
550 STOP
8900 :
9000 REM \{vi} Ejemplo de impresion del laberinto \{vn}
9005 :
9010 PRINT AT 0,0;: FOR N=3 TO 23: PRINT A$(N,3 TO 33): NEXT N: RETURN
9050 :
9100 REM \{vi} El grafico "A" puede tomar cualquier forma \{vn}
9105 :
9110 FOR N=USR "A" TO USR "A"+7: POKE N,INT (RND*256): NEXT N: RETURN

Anuncios

Acerca de Neil Parsons
I like retrogaming, music, sci-fi and fantasy movies, football and few more things.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s