Created
December 11, 2017 23:03
-
-
Save boriel/639bcc3ccc02ac1f8eddf840679662f1 to your computer and use it in GitHub Desktop.
Fills a figure with a random maze-like pattern
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <point.bas> | |
10 REM Algoritmo para generar laberintos aleatorios | |
REM Inicializa el laberinto | |
20 CONST Filas As UInteger = 21 | |
30 CONST Columnas As UInteger = 31 | |
40 DIM i, j As UInteger | |
DIM Arriba, Abajo, Izquierda, Derecha as Ubyte | |
DIM direccion AS UByte | |
80 BORDER 0: PAPER 0: INK 7: CLS: REM Pantalla en Negro (tipico) | |
90 GOSUB 2000: REM Pintamos el borde del laberinto | |
100 REM Generamos un numero de fila impar entre 1 y Filas | |
110 REM LET i = 1 + 2 * INT(RND * (Filas / 2)) | |
120 REM Generamos un numero de columna impar entre 1 y Columnas | |
130 REM LET j = 1 + 2 * INT(RND * (Columnas / 2)) | |
140 REM Comprobamos si está ocupada, y si es asi, repetimos | |
150 REM IF POINT(i, j) THEN GOTO 100: END IF | |
LET i = 87: LET j = 127 | |
160 GOSUB 1000: REM llamamos a la subrutina de generacion | |
170 END | |
1000 REM Genera el Laberinto | |
1010 LET Arriba = 0 | |
1020 LET Abajo = 1 | |
1030 LET Izquierda = 2 | |
1040 LET Derecha = 3 | |
1100 PLOT i, j | |
1120 LET salidas = 0: REM Contador de salidas | |
1130 IF NOT POINT(i - 2, j) THEN LET salidas = salidas + 1: END IF: REM Comprueba salidas Arriba (i - 1) | |
1140 IF NOT POINT(i + 2, j) THEN LET salidas = salidas + 1: END IF: REM Comprueba salidas Abajo (i + 1) | |
1150 IF NOT POINT(i, j - 2) THEN LET salidas = salidas + 1: END IF: REM Comprueba salidas Izquierda (j - 1) | |
1160 IF NOT POINT(i, j + 2) THEN LET salidas = salidas + 1: END IF: REM Comprueba salidas Derecha (j + 1) | |
1170 IF NOT salidas THEN RETURN: END IF: REM Retornamos si no hay salidas | |
1180 LET direccion = RND * 4: REM Numero pseudoaleatorio de 0 a 3 | |
1190 IF direccion = Arriba AND NOT POINT(i - 2, j) THEN | |
REM Si ha salido "Arriba" y podemos subir | |
PLOT i - 1, j | |
LET i = i - 2 | |
GOSUB 1100 | |
LET i = i + 2: REM Volvemos a dejar i como estaba | |
END IF | |
1200 IF direccion = Abajo AND NOT POINT(i + 2, j) THEN | |
REM Si ha salido "Abajo" y podemos bajar | |
PLOT i + 1, j | |
LET i = i + 2 | |
GOSUB 1100 | |
LET i = i - 2: REM Volvemos a dejar i como estaba | |
END IF | |
1210 IF direccion = Izquierda AND NOT POINT(i, j - 2) THEN | |
REM Si ha salido "Izquierda" y podemos ir | |
PLOT i, j - 1 | |
LET j = j - 2 | |
GOSUB 1100 | |
LET j = j + 2: REM Volvemos a dejar i como estaba | |
END IF | |
1220 IF direccion = Derecha AND NOT POINT(i, j + 2) THEN | |
REM Si ha salido "Derecha" y podemos ir | |
PLOT i, j + 1 | |
LET j = j + 2 | |
GOSUB 1100 | |
LET j = j - 2: REM Volvemos a dejar i como estaba | |
END IF | |
1250 GOTO 1120: REM Repetimos hasta que no queden mas salidas | |
2000 REM Pinta el borde | |
2010 CIRCLE 127, 87, 61: CIRCLE 127, 87, 62: CIRCLE 101, 81, 61: CIRCLE 101, 81, 62 | |
2040 RETURN |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment