Ahora que ya tenemos las rectas “aproximadamente” controladas, vamos a programar los caminos que nos dan los pesos de flood.
Para ello simplemente escogemos el mejor vecino de la casilla en la que estamos y vamos marcando el camino en el array laberinto.
void camino_recalcula() {
camino_init(robot_get_casilla(), robot_get_orientacion());
while (camino_casilla_actual != CASILLA_SOLUCION) {
siguiente = flood_mejor_vecino_desde(camino_casilla_actual);
for (dir = 0; dir < 4; dir++) {
if ((int) siguiente - camino_casilla_actual == incremento[dir]) {
switch ((camino_orientacion_actual - dir)) {
case 0: camino_anadir_paso(PASO_RECTO);
break;
case 1: camino_anadir_paso(PASO_IZQ);
break;
case -1:
case 3: camino_anadir_paso(PASO_DER);
break;
}
}
}
}
}
Hemos introducido unos cuantos estados más en el robot:
Hay que añadir un if en el estado AVANZANDO, ya que ahora vamos a seguir un camino que puede interrumpirse en cualquier momento si encontramos una pared frontal. En este caso, marcamos la casilla como PASO_STOP y volvemos al estado DECIDE.
Falta toda la lógica que ocurre cuando se encuentra la solución (y hay que volver al origen, repitiendo el proceso hasta que no hay caminos por descubrir). Pero queremos ver cómo se comporta Adefesio corrigiendo únicamente las trayectorias en las rectas.
Tal y como ha quedado el commit hoy, el robot llega a la solución aunque en nuestro laberinto pequeño con muchos giros, éstos no están bien sincronizados lo que hace que se vaya desfasando cada vez más, y en varios casos acaba chocando con una pared.
También tenemos algún bug en los giros: a veces el robot gira de más y luego retrocede… hay que repasar la máquina de estados.
Por el momento parece que vamos bien, pero tenemos que tratar urgentemente estos temas: