Novamente, você pensou que seu algoritmo era bom o suficiente para escapar do labirinto, e novamente, seu buggle está agora num labirinto onde seu algoritmo anterior falhou. Dê a ele uma chance: copie-e-cole seu código e aperte o botão "Rodar" e veja sua criação falhar. A pegadinha é no formato de um "G" maiúsculo. O buggle entra na armadilha e segue a borda interior. Em um determinado momento, ele encontra a direção norte livre, vai nesta direção, e cai de novo na armadilha.
O algoritmo de Pledge (em homenagem a Jon Pledge of Exeter) pode resolver este labirinto.
Este algoritmo é uma modificação do anterior para evitar obstáculos. Ele pega aleatoriamente uma direção e deixa o buggle ir nesta direção. Quando encontra um obstáculo, uma pata (por exemplo, a da esquerda) é mantida na parede seguindo o obstáculo enquanto conta as curvas. Quando o buggle está de volta à sua direção original e a soma das curvas deu 0, o buggle deixa o obstáculo e continua mantendo sua direção original.
Observe que o uso de "total turning" ao invés de simplesmente o "current direction" permite que o algoritmo evite almadilhas no formato G. Se alguém pega a esquerda para dentro da armadilha, acaba girando 260 graus pelas paredes. Como dissemos antes, o algoritmo simplório "current direction" entra num ciclo limitado à medida em que ele deixa a parede mais à direita apontando para a esquerda e anda para a seção curvada na esquerda de novo.
O algoritmo de Pledge não deixa a parede mais à direita devido ao total de curvas não ser zero neste ponto. Ele segue a parede na volta toda, deixando finalmente ela apontando para a esquerda no "fundo exterior"
Agora você tem que modificar sua solução para implementar o algoritmo de Pledge para escapar deste labirinto.
Mude seu método keepHandOnSideWall()
para contar a
quantidade de curvas feitas pelo buggle (+1 quando gira para a
esquerda, e -1 quando gira para a direita). Esta contagem pode
necessitar a adição de um valor inteiro angleSum
no seu
programa.
Escreva um método booleano isDirectionFree(dir)
indicando
se a direção dada está livre, ou seja, se você pode se mover naquela
direção (Observe que a demonstração usa a direção NORTH para
isto). Você pode recuperar a direção atual do buggle usando o método
getDirection()
. Você pode mudar sua direção (sem se
mover) usando setDirection(dir)
. Não esqueça de guardar a
direção anterior de seu buggle (numa variável exclusiva) antes de
verificar se sua direção favorita está livre para depois recuperar seu
estado.
Você pode ter que mudar o resto de seu código também, mas estas mudanças devem se manter limitadas.
[!python]Não esqueça que se você tem um método modificando uma variável global (como angleSum), você deve garantir que ele declara esta variável como global. Sem ele, o método cria uma nova variável de mesmo nome, e a global nunca é modificada.
def myMethod(): global angleSum ... angleSum = angleSum + 1[/!]
keepHandOnSideWall()
) enquanto a soma de curvas não for
null (nula) e a direção favorita não estiver livre. Faça isto até que
você encontre seu baggle.