Solucionado (ver solução)
Solucionado
(ver solução)
6
respostas

Heroi consegue comer fantasmas

Boa tarde, estou com um único problema para a conclusão do jogo, já coloquei mensagem de vitória e de derrota mas o herói consegue as vezes comer os fantasmas, como eu faço para que se o herói for comer os fantasmas ele morra?

@edit os fantasmas também estão conseguindo comer as pílulas, por mais que no meu mapa editado eu tenha mantido uma boa distância deles para as pilulas eu gostaria q o fantasma não conseguisse comê-las.

6 respostas

Oi tudo bem? Consegue postar o seu código pra gente analisar?

bem , o pac man desse curso é feito de 7 arquivos, mas vou mandar somente as funçoes q se referem a movimento:

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

    srand(time(0));
    for (int i = 0; i < 10; i++) {
        int posicao = rand() % 4;

        if (podeandar(&m, FANTASMA, opcoes[posicao][0], opcoes[posicao][1])) {
            *xdestino = opcoes[posicao][0];
            *ydestino = opcoes[posicao][1];

            return 1;
        }
    }

    return 0;

}
void fantasmas() {
    MAPA copia;

    copiamapa(&copia, &m);

    for (int i = 0; i < m.linhas; i++) {
        for (int j = 0; j < m.colunas; j++) {

            if (copia.matriz[i][j] == FANTASMA) {

                int xdestino;
                int ydestino;

                int encontrou = praondefantasmavai(i, j, &xdestino, &ydestino);

                if(encontrou) {
                    andanomapa(&m, i, j, xdestino, ydestino);
                }
            }

        }
    }

    liberamapa(&copia);

}
int ehdirecao(char direcao) {
    return 
        direcao == ESQUERDA || 
        direcao == CIMA || 
        direcao == BAIXO || 
        direcao == DIREITA;
}

void move(char direcao) {

    if (!ehdirecao(direcao)) 
        return;

    int proximox = heroi.x;
    int proximoy = heroi.y;

    switch(direcao) {
        case ESQUERDA:
            proximoy--;
            break;
        case CIMA:
            proximox--;
            break;
        case BAIXO:
            proximox++;
            break;
        case DIREITA:
            proximoy++;
            break;
    }

    if (!podeandar(&m, HEROI, proximox, proximoy))
        return;

    if (ehpersonagem(&m, PILULA, proximox, proximoy)) {
        tempilula = 1;
    }

    andanomapa(&m, heroi.x, heroi.y, proximox, proximoy);
    heroi.x = proximox;
    heroi.y = proximoy;

}
int ehparede(MAPA *m, int x, int y) {
    return m->matriz[x][y] == PAREDE_VERTICAL || 
        m->matriz[x][y] == PAREDE_HORIZONTAL;
}

int ehpersonagem(MAPA *m, char personagem, int x, int y) {

    return m->matriz[x][y] == personagem;

}

int podeandar(MAPA* m, char personagem, int x, int y) {
    return
        ehvalida(m, x, y) &&
        !ehparede(m, x, y) &&
        !ehpersonagem(m, personagem, x, y);
}
void andanomapa(MAPA* m, int xorigem, int yorigem, int xdestino, int ydestino) {

    char personagem = m->matriz[xorigem][yorigem];
    m->matriz[xdestino][ydestino] = personagem;
    m->matriz[xorigem][yorigem] = VAZIO;
}

int ehvalida(MAPA* m, int x, int y) {
    if (x >= m->linhas)
        return 0;
    if (y >= m->colunas)
        return 0;

    return 1;
}

int ehvazia(MAPA* m, int x, int y) {
    return m->matriz[x][y] == VAZIO;
}

É só programar para varrer a posição dos fantasmas e se alguma for a mesma posição que o herói então chama o método de game over ou perde vida se tiver.

solução!

Boa noite, consegui da seguinte forma:

int podeandar(MAPA* m, char personagem, int x, int y) {
    return
        ehvalida(m, x, y) &&
        !ehparede(m, x, y) &&
        !ehpersonagem(m, FANTASMA, x, y);
}

o ehpersonagem estava com o personagem indefinido, sendo fantasma tanto o heroi como os fantasmas não podem comer outros fantasmas Quanto aos fantasmas comendo as pilulas fiz o seguinte:

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

    srand(time(0));
    for (int i = 0; i < 10; i++) {
        int posicao = rand() % 4;

        if (podeandar(&m, FANTASMA, opcoes[posicao][0], opcoes[posicao][1]) && !ehpersonagem(&m, PILULA, opcoes[posicao][0], opcoes[posicao][1])) {
            *xdestino = opcoes[posicao][0];
            *ydestino = opcoes[posicao][1];

            return 1;
        }
    }

    return 0;

}

coloquei como condição para que esse ande não seja pilula, até então tudo funcionando normalmente, agora se eu como os fantasmas eu morro e os fantasmas também não conseguem comer pílulas, obrigado pela ajuda, se alguém quiser o código do jogo 100% funcional só comentar aqui kkk :)

Se puder pra fins de ciência. Joga todos os arquivos nesse site https://www.onlinegdb.com/online_c_compiler clica em share pra gerar um link e vamos ver se o compilador online consegue rodar.

O compilador online consegue rodar sim, mas devido ao tamanho do console do site fica bem estranho e chatérrimo de jogar... compensa mais eu colocar depois em um IDE como o dev c++ que irá separar das dll e publicar para possível download mesmo