Skip to content

Instantly share code, notes, and snippets.

@boriel
Created December 11, 2017 23:03
Show Gist options
  • Save boriel/639bcc3ccc02ac1f8eddf840679662f1 to your computer and use it in GitHub Desktop.
Save boriel/639bcc3ccc02ac1f8eddf840679662f1 to your computer and use it in GitHub Desktop.
Fills a figure with a random maze-like pattern
#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