Fallo con el programa "Cómo generar laberintos"

Emuladores y aplicaciones que ayudarán a la perpetuación del Spectrum y su software en el futuro

Moderador: Sir Cilve Sinclair

Fallo con el programa "Cómo generar laberintos"

Notapor NeilParsons el Vie Sep 21, 2012 2:03 pm

En el nº 26 de Microhobby se publicó un artículo junto con un programa de Paco Martín sobre la generación de laberintos. Este programa fue después preservado en la web de Elfoscuro "K y Enter" en su tiempo y tal cual estaba en dicha web lo añadí a mi Proyecto BASIC ZX con posterioridad.

Ahora resulta que el programa no funciona correctamente y entrega el mensaje de error B Integrer Out Of Range en la linea 410. Por otra parte, en el archivo LAB1.TAP contenido en el fichero descargado tanto de KyEnter como del blog (es el mismo) le faltaba la línea 120 que ha sido añadido y adjuntado al nuevo fichero que ha sido subido a la red e incluido su link de descarga en la última actualización del blog del proyecto. Aun habiéndole añadido la linea que le faltaba, el programa sigue dando el mismo error.

El listado adjunto es tal como lo he extraido desde el BASin de Paul Dunn, con sus símbolos y todo. Si alguien observa algo raro en este programa, aparte de que el algoritmo para la generación de laberintos pueda ser correcto, puede echarle mano cuantas veces quiera.

Código: Seleccionar todo
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)
40 FOR N=2  TO 24: LET A$(N)="                                   ": NEXT 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
Avatar de Usuario
NeilParsons
Dizzy
 
Mensajes: 1048
Registrado: Mar Oct 02, 2007 5:13 pm

Re: Fallo con el programa "Cómo generar laberintos"

Notapor na_th_an el Vie Sep 21, 2012 2:50 pm

Comprueba que V o H nunca se salgan de las dimensiones del array A$... El error lo da por eso.

Esto es una conjetura, pero... es probable que la linea 30, en la que pone "se marca el contorno", esos espacios que se escriben en las lineas 1 y 25 (primera y última) no sean espacios, sino \:: ... Al igual, en la linea siguiente, donde se rellena la parte central del array (2 a 24), lo más probable es que no sean espacios, sino que el primer y el último sean \:: igualmente. Así se hace un cuadrado con \:: en los bordes del array y espacios dentro.

Tal y como está, y viendo que siempre mira si la posición es igual a " " para avanzar, al no tener bordes, pues terminará saliéndose del array, y por tanto la linea 410 da ese error.

Del algoritmo de generación que utiliza no tengo ni idea, pero casi seguro que falla por lo que te digo arriba. No es un problema de algoritmo, es que el listado está mal pasado (o estaba mal reproducido).
Avatar de Usuario
na_th_an
Nonamed
 
Mensajes: 1889
Registrado: Lun May 07, 2007 10:16 am
Ubicación: Andalucía

Re: Fallo con el programa "Cómo generar laberintos"

Notapor NeilParsons el Vie Sep 21, 2012 2:59 pm

En el listado original, esas lineas (30 y 40) figuran como espacios y en aquellas líneas en las que el BASin interpreta como \:: pertenece a un espacio invertido o el carácter gráfico 8 invertido.

http://microhobby.speccy.cz/mhf/026/MH026_24.jpg

Aparte, creo que al maquetar el programa se ha traspapelado el carácter gráfico de "A" que se define en la línea 9110 y en ninguna otra línea del programa advierte de su presencia, al igual que el carácter gráfico "B" de la línea 2000 del segundo programa. :?:
Ultima edición por NeilParsons el Vie Sep 21, 2012 3:02 pm, editado 1 vez en total
Avatar de Usuario
NeilParsons
Dizzy
 
Mensajes: 1048
Registrado: Mar Oct 02, 2007 5:13 pm

Re: Fallo con el programa "Cómo generar laberintos"

Notapor na_th_an el Vie Sep 21, 2012 3:00 pm

Así:

Código: Seleccionar todo
    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)
    40 FOR N=2  TO 24: LET A$(N)="\::                                 \::": NEXT 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


Ojo, no lo he probado. Podría tener más cagadas, sólo he detectado las que me han saltado a la vista del tirón.
Avatar de Usuario
na_th_an
Nonamed
 
Mensajes: 1889
Registrado: Lun May 07, 2007 10:16 am
Ubicación: Andalucía

Re: Fallo con el programa "Cómo generar laberintos"

Notapor na_th_an el Vie Sep 21, 2012 3:01 pm

NeilParsons escribió:En el listado original, esas lineas (30 y 40) figuran como espacios y en aquellas líneas en las que el BASin interpreta como \:: pertenece a un espacio invertido o el carácter gráfico 8 invertido.

http://microhobby.speccy.cz/mhf/026/MH026_24.jpg

Entonces está mal reproducido. No tiene sentido que hable de bordes cuando no los hay. Además, en el caso de ser espacios, hubiera usado un solo bucle de 1 a 25 en vez de pintar por un lado 1 y 25 y luego hacer un bucle de 2 a 24, ¿no crees? ;) Muy sospechoso. Ahí faltan \::.
Avatar de Usuario
na_th_an
Nonamed
 
Mensajes: 1889
Registrado: Lun May 07, 2007 10:16 am
Ubicación: Andalucía

Re: Fallo con el programa "Cómo generar laberintos"

Notapor NeilParsons el Vie Sep 21, 2012 3:03 pm

Sospecho más de un error en la maquetación del programa que otra cosa...
Avatar de Usuario
NeilParsons
Dizzy
 
Mensajes: 1048
Registrado: Mar Oct 02, 2007 5:13 pm

Re: Fallo con el programa "Cómo generar laberintos"

Notapor na_th_an el Vie Sep 21, 2012 7:41 pm

¿Pero lo has probado?
Avatar de Usuario
na_th_an
Nonamed
 
Mensajes: 1889
Registrado: Lun May 07, 2007 10:16 am
Ubicación: Andalucía

Re: Fallo con el programa "Cómo generar laberintos"

Notapor NeilParsons el Vie Sep 21, 2012 9:04 pm

Urrr...
Ultima edición por NeilParsons el Vie Sep 21, 2012 9:06 pm, editado 1 vez en total
Avatar de Usuario
NeilParsons
Dizzy
 
Mensajes: 1048
Registrado: Mar Oct 02, 2007 5:13 pm

Re: Fallo con el programa "Cómo generar laberintos"

Notapor NeilParsons el Vie Sep 21, 2012 9:06 pm

Sí, y la mayoría de las veces me da el error B Integrer out of range 410:1 o bien me puede aparecer o un 3 Subscript wrong en la misma línea o un 5 Out of screen 150:4, dependiendo de la zona por la que vaya creándose el laberinto.

Me gustaría investigar más el asunto y si algo tiene que ver que en las líneas 130 a 160 puede haber un error con los espacios y los bloques en negro, pero no quiero cansar demasiado mi vista por hoy.
Avatar de Usuario
NeilParsons
Dizzy
 
Mensajes: 1048
Registrado: Mar Oct 02, 2007 5:13 pm

Re: Fallo con el programa "Cómo generar laberintos"

Notapor Metalbrain el Vie Sep 21, 2012 9:30 pm

Tal y como está publicado en la revista está claro que está mal: los bordes deben ser caracteres distintos del espacio. Cambiando por otros caracteres en toda la cadena de la línea 30, y en los caracteres primero y último de la línea 40, funciona. Lo probé con el .tap en ZXSpin poniendo asteríscos y funcionó a la primera.

Y cuando fui a publicarlo aquí en foro, al terminar de escribir había ya 3 respuestas y el foro no posteó el mensaje por si lo quería revisar. Total, que le pongo un "PD: se me han adelantado" y lo vuelvo a enviar... ...para volver de comer media hora más tarde y ver que otra nueva respuesta ha impedido de nuevo postear :lol: , y ahí ya me rendí, pensando que estaba todo solucionado.

Así pues, resumiendo, que no hay más fallos en el programa aparte de los mencionados.
SevenuP se escribe con u minúscula y P mayúscula.
Avatar de Usuario
Metalbrain
Freddy Hardest
 
Mensajes: 583
Registrado: Lun May 07, 2007 8:17 am
Ubicación: Sevilla

Re: Fallo con el programa "Cómo generar laberintos"

Notapor NeilParsons el Sab Sep 22, 2012 2:14 pm

Lo he probado tal como dices y realmente funciona. Gracias Metalbrain. Resubiré el programa con esta modificación. :)

Y ahora qye me doy cuenta, na_th_an fue el primero en advertir de que el quid de la cuestión estaba precisamente en esas líneas... necesito ceregumil o revital... :lol:
Avatar de Usuario
NeilParsons
Dizzy
 
Mensajes: 1048
Registrado: Mar Oct 02, 2007 5:13 pm

Re: Fallo con el programa "Cómo generar laberintos"

Notapor mcleod_ideafix el Lun Oct 01, 2012 5:58 pm

Recuerdo haber tecleado ese programa en su momento, y me funcionaba. Tiempo después lo rehice en Pascal sin problemas.
La última encarnación de las rutinas estas de hacer laberintos las he usado en un programa que publiqué en uno de los concursos de Bytemaniacos: "Leo contra todos". Ahí uso esas mismas rutinas tanto para generar el laberinto como para que luego Leo lo recorra buscando al personaje.
Web: ZX Projects | Twitter: @zxprojects
Avatar de Usuario
mcleod_ideafix
Johnny Jones
 
Mensajes: 3982
Registrado: Vie Sep 21, 2007 1:26 am
Ubicación: Jerez de la Frontera

Re: Fallo con el programa "Cómo generar laberintos"

Notapor Rinconete el Mie Oct 03, 2012 12:37 am

En la Microhobby num 27 hay una referencia a un error en el listado del programa generador de laberintos:

http://microhobby.speccy.cz/mhf/027/MH027_37.jpg

Hasta donde recuerdo la rutina de generación del mapa de Fred es, con alguna pequeña diferencia, idéntica a esa.
Avatar de Usuario
Rinconete
Jack The Nipper
 
Mensajes: 193
Registrado: Mar Oct 09, 2007 7:32 pm
Ubicación: Valladolid

Re: Fallo con el programa "Cómo generar laberintos"

Notapor NeilParsons el Mie Oct 03, 2012 1:30 am

Pero en esa corrección soslayaron que en las líneas 30 y 40 no habían espacios donde aparentemente los había. Es por eso que tanto Na_th_an como Metalbrain dieran en la diana con la resolución del fallo.
Avatar de Usuario
NeilParsons
Dizzy
 
Mensajes: 1048
Registrado: Mar Oct 02, 2007 5:13 pm


Volver a Emulación y preservación

¿Quién está conectado?

Usuarios navegando este Foro: No hay usuarios registrados visitando el Foro y 1 invitado