Cursos / Jogos Digitais / Inteligência Artificial para Jogos / Aula

arrow_back Aula 07 - Descoberta de caminho - Parte 01

2.3 Algoritmo completo

Agora que você entendeu a ideia do algoritmo, já pode descrevê-lo em formato de pseudocódigo. A rotina recebe quatro valores inteiros (x0, y0, x1 e y1) que correspondem às coordenadas da posição na qual personagem se encontra e a posição a qual ele deseja ir. Algumas variáveis são declaradas no início da rotina para facilitar os cálculos. Inclinação, que é o coeficiente angular da reta definida pelos pontos passados, erro, que é o fator de erro que se adiciona para totalizar o valor da inclinação e caminho, que é uma sequência de pontos inicialmente vazia, mas que representa o caminho a ser construído. Antes de iniciar o laço do algoritmo, defina as variáveis x e y que ficarão armazenando a posição a ser inserida no caminho.

A cada iteração do laço, insira o ponto (x, y) no caminho e atualize o erro em função da inclinação da reta. Se o erro for maior ou igual a 1, então y é incrementado (chegou a hora de gerar uma mudança na rota ), o erro é reajustado e o ponto com o novo y é inserido no caminho. Por fim, após o término do laço, a posição do destino também é inserida no caminho, e este retornado.

O último detalhe que resta é fazer esse algoritmo funcionar para os demais sete octantes que restam no plano. Como já dito, da forma que foi descrita, funciona apenas para o primeiro octante. Você precisará generalizar para que o personagem siga em qualquer direção. O primeiro passo é descobrir em qual octante o caminho se encontra. Veja a figura 14.

O segundo octante do plano e referências para os demais

Se você se lembra, o primeiro octante era definido pelo conjunto de pontos tal que x > 0, y > 0 e x ≥ y, não é? Raciocine agora sobre o segundo quadrante, apresentado na Figura 14. Esse octante é definido pelos conjuntos de pontos tal que x > 0, y > 0 e y ≥ x. Aplicando a mesma ideia para os demais octantes, você terá as condições presentes no Quadro 02. Nele, abs(x) representa o valor em absoluto (valor positivo) de x.

Quadro 02 - Condições de cada quadrante
Octante Condição
1 X1 > X0, Y1 > Y0 e X1 ≥ Y1
2 X1 > X0, Y1 > Y0 e Y1 ≥ X1
3 X1 < X0, Y1 > Y0 e Y1 ≥ abs(X1)
4 X1 < X0, Y1 > Y0 e abs(X1) ≥ Y1
5 X1 < X0, Y1 < Y0 e abs(X1) ≥ abs(Y1)
6 X1 < X0, Y1 < Y0 e abs(Y1) ≥ abs(X1)
7 X1 > X0, Y1 < Y0 e abs(Y1) ≥ X1
8 X1 > X0, Y1 < Y0 e abs(X1) ≥ Y1

Agora que você sabe identificar os diferentes casos, falta chamar o procedimento de forma adequada. A estratégia mais simples é “enganar” o algoritmo fazendo-o “pensar” que se trata do primeiro octante, mesmo que não seja. Para isso, inverta as coordenadas, tanto as que você passou para ele, quanto as que ele insere no caminho. Por exemplo, em vez de passar as coordenadas (x0, y0) e (x1, y1) para ele, você passou (y0, x0) e (y1, x1), e trocou de volta o caminho gerado fazendo com que as coordenadas (x0, y0) e (x1, y1) sejam consideradas (y0, x0) e (y1, x1).

Para levar em conta todos os quadrantes, você precisará realizar as seguintes trocas:

Quadro 03 - Inversão dos dados para calcular caminho nos diferentes octantes
Octante Ordem
normal
Alteração na ordem de
entrada
Alteração na ordem do
caminho gerado
1 x, y x, y x, y
2 x, y y, x y, x
3 x, y y, -x -y, x
4 x, y -x, y -x, y
5 x, y -x, -y -x, -y
6 x, y -y, -x -y, -x
7 x, y -y, x y, -x
8 x, y x, -y x, -y

Versão 5.3 - Todos os Direitos reservados