Paso 2: Software
Mayor parte es bastante sencilla. El único digno de mencionar están el algoritmo de generación de laberinto y la forma en que tratamos de dibujar un laberinto rotado.
Generación del laberinto
Estoy usando algoritmo de Kruskal, y ni estoy probando cualquiera de las cosas de lujo Wikipedia sugiere con el fin de optimizarlo. Es lo suficientemente rápido como.
Es bastante simple:
- Comenzar con todas las paredes intactas y dar a cada célula un identificador de grupo (puede utilizar el número columna + fila * ancho o cadenas como "R0C0". No importa como son únicos).
- Encontrar una pared entre dos células que tienen un grupo diferentes identificadores.
- Quitar esa pared.
- Unir a los dos grupos: todas las células que tienen el identificador de grupo de la primera célula, ahora tendrá el identificador de grupo de la otra célula.
- Pasos 2-4 debe ejecutar veces n-1 (donde n es el número de células).
Al final del proceso, todas las células están conectadas, y hay no hay bucles en el laberinto.
La imagen de abajo muestra cómo las paredes y los identificadores de grupo después de unas cuantas rondas y al final del proceso.
También hay una versión de JavaScript aquí. Usted puede experimentar con él incluso si no tienes un Arduino, y podría ser útil para algún juego JS con que usted puede subir.
La diferencia principal entre el JS y las versiones de Arduino es en JS sólo almacenamos para cada celda si tiene una pared izquierda y si tiene un fondo uno. En el Arduino almacenamos todas las 4 paredes (aunque hay un redunduncy aquí), ya que también tenemos que dibujar las células rotan, y es más fácil si tenemos acceso a todas las paredes de una celda.
Dibujo de un laberinto girado
Definimos 4 direcciones absolutas como 0-4:
byte const norte = 0;
byte const este = 1;
byte const sur = 2;
byte const oeste = 3;
Hay una matriz de rotación que nos ayuda a mapa de arriba/derecha/izquierda/abajo relativa a la absoluta N/E/S/W para una línea específica (rumbo es la dirección absoluta está mirando nuestro personaje):
/ * mapa de rotación: para cada partida, una asignación de filas/cols [delta] [delta] sureste
{abajo -> Sur -> derecha este, abajo -> este, derecha -> Sur} * /
int rotation_map [4] [4] = {}
{1,1,0,0} / / norte: abajo es sur, derecha es este
, {0,0,-1, 1} / / este: abajo es oeste, justo al sur
, {-1,-1.0.0} / / sur: abajo es hacia el norte, derecha es oeste
, {0.0.1, -1} / / oeste: abajo es este, justo al norte
};
Estas son las macros que hacen la asignación real:
#define MAP2SOUTH(heading,row,col) ((row)*rotation_map[heading][0]+(col)*rotation_map[heading][3]) de
#define MAP2EAST(heading,row,col) ((row)*rotation_map[heading][2]+(col)*rotation_map[heading][1])
MAP2SOUTH devuelve la fila absoluta correspondiente a una fila, columna en la pantalla, y MAP2EAST devuelve la columna absoluta.
El resto es auto explicativo (dejen un comentario si acaso todavía no).
Disfrutar,