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.

AخA
1
        Função CaminhoReto (Int x0, Int y0, Int x1, Int y1)
2
            Real inclinação = (x1 – x0) / (y1 – y0);
3
            Real erro = -0.5;
4
            Arranjo caminho = [];
5
 
6
            Int x, y = y0;
7
            Para x de x0 a x1 - 1
8
                insere (x,y) em caminho
9
                erro = erro + inclinação
10
                Se erro ≥ 1 então
11
                    y = y + 1
12
                    erro = erro - 1
13
                    insere (x,y) em caminho
14
                Fim_se
15
            Fim_para
16
            insere (x1,y1) em caminho
17
        
18
            Retorna caminho
19
        Fim_procedimento

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.

Figura 14 - O segundo octante do plano e referências para os demais
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