Diseñé un algoritmo hace algún tiempo para laberintos 2D en una cuadrícula, no hay ninguna razón por la que esto tampoco debería funcionar para un laberinto 3D en una cuadrícula cúbica.
Comience con una cuadrícula 3D inicialmente completamente poblada con celdas de pared.
...
Start un agente en un borde de la red, el agente se desplaza en una línea recta en la X, Y, Z, -X, -Y o en la pared de compensación dirección -Z mientras viaja .
Acción 'N' tiene una pequeña posibilidad de aparecer en cada paso.
La acción 'M' ocurre cuando la celda directamente en frente del agente está en la pared y la celda que está delante está vacía.
'N' es una elección aleatoria de:
- eliminación de ese agente
- girando a la izquierda o derecha 90 grados
- y la creación de un agente en el mismo cuadrado gira 90 grados a la izquierda, a la derecha o ambos (dos agentes).
'M' es una elección aleatoria de:
- la eliminación de ese agente
- la eliminación de la pared frente a ese agente y luego la eliminación de ese agente
- y sin hacer nada, llevando a cabo
- girando a la izquierda o 90 grados a la derecha.
- y crear un agente en el mismo cuadrado girado 90 grados a la izquierda, a la derecha o ambos (dos agentes).
los laberintos son distintivos, y su carácter es muy flexible mediante el ajuste del disparador de 'M' (que ver con uniones válidas) y por ajustar también las posibilidades de 1 a 8 que se produzcan. Es posible que desee eliminar una o dos acciones o introducir sus propias acciones, por ejemplo, una para hacer un pequeño claro o dar un paso atrás.
El activador para 'N' también puede ser otro tipo de aleatoriedad, por ejemplo, el siguiente ejemplo se puede utilizar para crear laberintos bastante ramificados que todavía tienen algunas partes rectas largas.
float n = 1;
while (random_0_to_1 > 0.15)
{
n *= 1.2;
}
return (int)n;
algunos pequeños ajustes serán necesarios a partir de la descripción de mi sencilla, por ejemplo disparador para la acción 'M' tendrá que comprobar las células adyacentes a las células comprueba así, dependiendo de qué tipo de uniones son deseable.
Se necesitan 5 o 6 para que el laberinto contenga ciclos y se requiere al menos una acción alternativa 'M' para 5 y 6 para que el laberinto contenga callejones sin salida.
Algunas opciones de posibilidades/acciones y desencadenantes 'M' tenderán a hacer laberintos que no funcionan, por ejemplo, son irresolubles o están llenos de células vacías o de pared, pero muchos producirán buenos resultados consistentemente.
¿Quieres uno que _solve_ un laberinto, o _genere_ un laberinto? –
@ X-Zero lo genera. – jmasterx
podría crear un 2d laberinto en una cuadrícula y para hacerlo en 3D cada celda de la cuadrícula sería en cambio una caja con una "altura" – danca