1
resposta

Algoritmo para o fantasma perseguir o herói.

Mudei um pouco o código para que a movimentação do fantasma não fosse aleatória mais. A função pesquisa a posição do herói e move o fantasma a partir dela, caso o fantasma fique preso, por exemplo, o herói está ao lado direito do fantasma e abaixo dele, mas existe um obstáculo tanto a direita quanto abaixo, ele se moverá aleatoriamente para poder sair.

int paraondeofantasmavai (int xatual, int yatual, int* xdestino, int* ydestino){
    int opcoes[4][2] = {
    {xatual, yatual+1},
    {xatual+1, yatual},
    {xatual, yatual-1},
    {xatual-1, yatual}
    };

    achamapa(&m, &heroi, HEROI);

    for(int i = 0; i<10; i++){

        if(heroi.x > xatual){
            if(podeandar(&m, opcoes[1][0], opcoes[1][1])){
                *xdestino = opcoes[1][0];
                *ydestino = opcoes[1][1];
                return 1;
                break;
            }
        }
        if(heroi.x < xatual){
            if(podeandar(&m, opcoes[3][0], opcoes[3][1])){
                *xdestino = opcoes[3][0];
                *ydestino = opcoes[3][1];
                return 1;
                break;
            }
        }
        if(heroi.y > yatual){
            if(podeandar(&m, opcoes[0][0], opcoes[0][1])){
                *xdestino = opcoes[0][0];
                *ydestino = opcoes[0][1];
                return 1;
                break;
            }
        }
        if(heroi.y < xatual){
            if(podeandar(&m, opcoes[2][0], opcoes[2][1])){
                *xdestino = opcoes[2][0];
                *ydestino = opcoes[2][1];
                return 1;
                break;
            }
        }
        else{

            srand(time(0));
            int posicao = rand() % 4;
            if (podeandar(&m, opcoes[posicao][0], opcoes[posicao][1])){
                *xdestino = opcoes[posicao][0];
                *ydestino = opcoes[posicao][1];
                return 1;
                break;
            }
        }
    }
    return 0;
}
1 resposta

Olá Pedro! Tudo bem?

Achei a ideia muito interessante, parabéns!

No entanto, notei um pequeno erro no seu código. Na condição if(heroi.y < xatual), você está comparando a posição do herói com xatual, que na verdade deveria ser yatual. Para corrigir isso, você pode alterar essa linha para if(heroi.y < yatual).

Além disso, gostaria de sugerir uma melhoria no seu código. Ao invés de utilizar um loop for com um número fixo de iterações (10 no seu caso), você pode utilizar um loop while que verifica se o fantasma conseguiu se mover ou não. Dessa forma, o loop irá continuar até que o fantasma consiga se mover ou até que todas as opções tenham sido testadas.

Aqui está o código com as alterações sugeridas:

int paraondeofantasmavai(int xatual, int yatual, int* xdestino, int* ydestino) {
    int opcoes[4][2] = {
        {xatual, yatual+1},
        {xatual+1, yatual},
        {xatual, yatual-1},
        {xatual-1, yatual}
    };

    achamapa(&m, &heroi, HEROI);

    int i = 0;
    while (i < 4) {
        if (heroi.x > xatual) {
            if (podeandar(&m, opcoes[1][0], opcoes[1][1])) {
                *xdestino = opcoes[1][0];
                *ydestino = opcoes[1][1];
                return 1;
            }
        }
        if (heroi.x < xatual) {
            if (podeandar(&m, opcoes[3][0], opcoes[3][1])) {
                *xdestino = opcoes[3][0];
                *ydestino = opcoes[3][1];
                return 1;
            }
        }
        if (heroi.y > yatual) {
            if (podeandar(&m, opcoes[0][0], opcoes[0][1])) {
                *xdestino = opcoes[0][0];
                *ydestino = opcoes[0][1];
                return 1;
            }
        }
        if (heroi.y < yatual) {
            if (podeandar(&m, opcoes[2][0], opcoes[2][1])) {
                *xdestino = opcoes[2][0];
                *ydestino = opcoes[2][1];
                return 1;
            }
        }
        else {
            srand(time(0));
            int posicao = rand() % 4;
            if (podeandar(&m, opcoes[posicao][0], opcoes[posicao][1])) {
                *xdestino = opcoes[posicao][0];
                *ydestino = opcoes[posicao][1];
                return 1;
            }
        }

        i++;
    }

    return 0;
}

Obrigada por compartilhar o código com a gente! Qualquer dúvida, estou à disposição!

Espero ter ajudado e bons estudos!