Mano Izquierda Contra El Muro; Bucle(S) Principal - Pololu 3pi Guía De Usuario

Tabla de contenido
lista. Cuando compiles el código AVR Studio compila automáticamente todos los ficheros del
proyecto.
8.c Mano izquierda contra el muro
Una estrategia básica para solucionar laberintos se llama "left hand on the wall". Imagínate
caminando por un laberinto de verdad
izquierda sobre el muro para seguir el camino varias veces. Puedes girar a izquierda siempre que
sea posible y solo puedes girar a derecha en una intersección. Algunas veces cuando vas a parar
a un callejón sin salida debes girar 180º y retornar por donde has venido. Supongamos que a lo
largo del trayecto no hay bucles, tu mano viajaría a lo largo de cada tramo del muro de la misma
manera y al final encontrarías la salida. Si hay una habitación en algún lugar del laberinto con
un monstruo o algún tesoro, encontrarás el camino, ya que recorres cada pasillo exactamente dos
veces. Usamos esta sencilla y fiable estrategia en nuestro 3pi como solución al ejemplo:
1.
// maze solving.
2.
// This function decides which way to turn during the learning phase of
3.
// found_right, which indicate whether there is an exit in each of the
4.
// three directions, applying the "left hand on the wall" strategy.
5.
char select_turn(unsigned char found_left, unsigned char found_straight, un
und_right)
6.
{
7.
// Make a decision about how to turn.
8.
// implements a left-hand-on-the-wall strategy, where we always
9.
// turn as far to the left as possible.
10.
if(found_l
11.
return 'L';
12.
else if(found_straight)
13.
return 'S';
14.
else if(found_rig
15.
return 'R';
16.
else
17.
return 'B';
18. }
Los valore devueltos por
estas funciones trabajen corre
8.d Bucle(s) principal
La estrategia del programa se encuentra en el fichero
hacer un seguimiento de l
100 datos que serán los mismos caracteres utilizados en la función turn(). También tenemos que
hacer un seguimiento de la longitud actual del camino para que sepamos que valores poner en la
matriz.
1.
path[100] =
char
2. unsigned
char
El "mai
n loop" se encuentra en la función maze_solve(), que es llamada después de la
calibración, desde
main.c
"manualmente" se resuelve el laberinto y el segundo donde se rep
tiempo. De hecho, el segundo bucle es en realidad un bucle dentro de un bucle, ya que queremos
ser capaces de reproducir la solución varias veces. He aquí un esbozo del código:
1.
// This function is called once, from main.c.
2.
void
maze_solve()
3.
{
4.
while(1)
5.
{
6.
// FIRST MAI
7.
// (when we f
8.
}
9.
// N
ow enter
10.
// times as we want to.
11.
while(1)
12.
{
It uses the variables found_left, found_straight, and
eft)
ht)
sele
ct_tur
n()
corresponden a los valores usador por
ctamente en el bucle principal.
a ruta recorrida hay que crear una matriz de almacenamiento de hasta
;
""
path_length = 0;
// the length of the path
. Es
ta función incluye dos bucles principales – el primero en donde
N LOOP BODY
ind the goal, we use break; to get out of this)
an infinite loop - we can re-run the maze as many
– uno típico, rodeado de muros – y pones tu mano
The following code
maze-solve.c
signed char fo
turn(),
siempre que
. Muy importante, si queremos
lica la solución para mejorar el
Tabla de contenido
loading

Tabla de contenido