Pathfind pra que te quero
Autor: Emilio | Publicado: 2011-08-15T18:34:00-07:00

x3! Esse é outro caso de código que ficou lá no pc que pifou.

Eu confesso que esse deu um pouco de medo, o código de pathfinding as vezes faz umas maluquices. Tipo o fato do mesmo programa estar fazendo uma rota em aula e outra em casa... Sem contar o cheating que o código do professor fez na sala, visto que ao não conseguir chegar no local de destino, encurralado no canto usou teleporte e foi parar direto no local de destino!



Meio burrinho, eu sei, mas de uma reles decisão empírica pra uma decisão correta vão aí umas 30 linhas de código...


A questão é que o código só enxerga as 8 posições adjacentes. Se ele soubesse o trajeto inteiro, aí não seria mais pathfiding né...
Enfim, o segredo é usar a recursividade. Já que o próprio path gerado pelo código ocupa a área usada pra se mover (ou seja, ele não vai voltar pra um quadrado no qual ele já passou uma vez), visto uma posição onde não há saída, e lembrando que as pedras atribuídas meramente tem uma dificuldade pra passar, ao invés de simplesmente ser impossível passar, ou seja, você tem que alterar o método pra um certo número de dificuldade ser considerado "impossível", enfim, dado essa flag "impossível", a recursividade é feita fazendo a lógica de pathfinding ser executada novamente. É como se o programa tivesse começado denovo, só que agora ele está em outra posição no campo.


É uma simulação do meu programa pronto, eu perdí o código no outro pc. Mas ele tava se comportando assim.
&nbsp;A vantagem da recursividade é que uma vez implementada, tu não precisa implementar denovo, afinal de contas, se o código possui recursividade, ao "recursivar" a parte da recursividade está implementada. (E se não tiver entendido, recursive a frase acima. Entendeu agora, ou vai ler denovo?)

(Leu denovo não foi? XD)

Tá, deixa eu explicar melhor com código (vai ficar algo assim):

arv-&gt;gerar(); //Gerando a árvore, ou "path"
...
nd = arv-&gt;acha(); //Vai meu filho, vai lá achar.
...
Node* Arvore::acha()
{
...
if (impossivel == true)
{
arv-&gt;gerar(); //Tenho que bolar outro caminho 
arv-&gt;acha(); //Lá vou eu
}
/*Não pode fazer mais nada depois, porque a recursividade não vai ler, só o caso de uma lógica pra fazer algo quando chegar no destino, porque afinal, se você chegou no destino a rota não era impossível...*/
} 

Sim, você tem que gerar a árvore denovo pra ele saber pra onde ir. Bom, e se for usar o mouse pra criar outro destino, é basicamente a mesma coisa. Na lógica que vai o clique do mouse você vai usar a recursividade. O coitado para no meio da rota, gera a árvore, e vai em busca do destino denovo.

Eu só não refiz o código porque tô muito ocupado com o projeto final, e a lógica do mouse é meio complicadinha de fazer, e a lógica de descobrir pro "impossivel == true" é feita com uma comparação de dificuldade (ele não verifica a rota já feita, e as pedras tem uma dificuldade distinta, dá algo como if dentro de if umas 7 vezes), então perdoem-me se ficar faltando algum detalhezinho que eu esquecí de comentar. Mas sabe, é isso! Não tem muito mistério, só é complexo.

Espero que tenham entendido a explicação. Qualquer coisa:
if(entender_a_explicação == false)
{
ler_post(Post "Pathfind pra que te quero");
}