Creemos que nos va a ser útil definir “caminos” a lo largo del laberinto, y poder
indicarle al robot que vaya por una ruta preplanificada. Vamos a añadir esta
implementación en su propio fichero camino.cpp
.
Un camino es una secuencia de pasos, que únicamente pueden ser: RECTO, IZQUIERDA o DERECHA, y STOP.
enum tipo_paso {PASO_RECTO, PASO_DER, PASO_IZQ, PASO_STOP};
Los pasos estarán almacenados en el array de celdas, ocupando otros dos bytes en cada una de ellas:
typedef struct {
volatile char paredN : 1;
volatile char paredO : 1;
volatile char visitada: 1;
volatile tipo_paso paso: 2;
volatile uint8_t flood;
} tipo_celda;
La idea es la siguiente: supongamos que queremos definir un camino en un laberinto de 3x4, que vaya por las siguientes casillas: 8, 9, 10, 11, 7, 3, 2, 1. El robot se encuentra inicialmente en la casilla 8, mirando al NORTE.
+-----+-----+-----+-----+
| |
| 0 1 2 3 |
+ + +-----+ +
| | |
| 4 5 6 | 7 |
+-----+-----+-----+ +
| |
| 8 9 10 11 |
+-----+-----+-----+-----+
Ese camino quedaría definido por los siguientes pasos: PASO_DERECHA (ya que se está mirando al NORTE y queremos ir a la casilla 9), PASO_RECTO hasta llegar a la casilla 11, PASO_IZQ para girar de nuevo hacia el norte, PASO_RECTO hasta llegar a la casilla 3, PASO_IZQ, y luego PASO_RECTO hasta llegar a la casilla 1.
Por convención, entenderemos que un PASO_IZQ o PASO_DER incluye el avance correspondiente después del giro. Esto nos soluciona un poco el almacenamiento en el array de celdas. La lista de pasos quedaría así:
Los pasos quedarían almacenados en el array de la siguiente manera (REC es RECTO):
+-----+-----+-----+-----+
| STOP REC IZQ |
| 0 1 2 3 |
+ + +-----+ +
| | REC |
| 4 5 6 | 7 |
+-----+-----+-----+ +
| DER REC REC IZQ |
| 8 9 10 11 |
+-----+-----+-----+-----+