1
resposta

Função explodePilula não está atribuindo VAZIO ' . ' à posição da matriz. Ao executar o código e explodir a bomba, perco a bomba e os fantasmas continuam mudando de posição aleatoriamente.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "fogefoge.h"
#include "mapa.h"

//lista de structs
MAPA mp;
POSICAO heroi;
int temPilula = 0;


int main()
{
    leMapa(&mp);
    encontraMapa(&mp, &heroi, HEROI); //busca e armazena posicao do pacman no mapa

    do {

        //if ternario
        printf("Tem pilula: %s\n", (temPilula ? "SIM" : "NAO"));
        imprimeMapa(&mp);

        char comando;
        scanf(" %c", &comando);

        //se a tecla recebida for uma direcao, chama funcao movimenta
        if (verificaDirecao(comando)) movimenta(comando);

        if (comando == BOMBA) explodeBomba();

        fantasma();

    } while(!acabou());

    liberaMapa(&mp);

}

void explodeBomba(){

    if (!temPilula) return;

    explodePilula(heroi.x, heroi.y, 0, 1, 3); //explode para direita
    explodePilula(heroi.x, heroi.y, 0, -1, 3); //explode para esquerda
    explodePilula(heroi.x, heroi.y, 1, 0, 3); //explode para baixo
    explodePilula(heroi.x, heroi.y, -1, 0, 3); //explode para cima

    temPilula = 0;
}

//funcao recursiva que chama ela mesma de acordo com o numero de vezes informado
void explodePilula(int x, int y, int somax, int somay, int qtde){

    //a cada vezes que a funcao e executada, a qtde diminui. Quando a qtde for zero, sai da funcao
    if (qtde == 0) return;

    int novox = x + somax;
    int novoy = y + somay;

    //se a proxima posicao nao for vazia sai da funcao
    if (!verificaPosicaoLivreMapa(&mp, novox, novoy)) return;

    //se a proxima posicao for uma parede, sai da funcao
    if (verificaParede(&mp, novox, novoy)) return;

    //se a proxima posicao e vazia, explode
    mp.matriz[novox][novoy] = VAZIO;
    explodePilula(novox, novoy, somax, somay, qtde-1);
}

int direcaoFantasma(int xatual, int yatual, int* xdestino, int* ydestino){

    //matriz para armazenar as possiveis direcoes de movimento dos fantasmas
    int opcoesDirecao[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 direcao = rand() % 4;

        if (podeAndar(&mp, FANTASMA, opcoesDirecao[direcao][0], opcoesDirecao[direcao][1])){
            *xdestino = opcoesDirecao[direcao][0];
            *ydestino = opcoesDirecao[direcao][1];

            return 1;
        }

    }

    return 0;
}

void fantasma(){

    MAPA copia;

    copiaMapa(&copia, &mp);

    //percorre a matriz
    for (int i = 0; i < copia.linhas; i++){
        for(int j = 0; j < copia.colunas; j++){
            //verifica se posicao atual e um fantasma
            if (copia.matriz[i][j] == FANTASMA){

                int xdestino;
                int ydestino;

                //recebe direcao aleatoria
                int encontrou = direcaoFantasma(i, j, &xdestino, &ydestino);

                //se encontrou direcao aleatoria valida
                if (encontrou){
                    andaNoMapa(&mp, i, j, xdestino, ydestino);
                }
            }
        }
    }

    liberaMapa(&copia);
}

int verificaDirecao(char direcao){

    //retorna se a tecla digitada for uma direcao
    return (direcao == ESQUERDA || direcao == CIMA || direcao == BAIXO || direcao == DIREITA);

}



void movimenta(char direcao){

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

    //verifica direcao e movimenta o pacman
    switch(direcao){
        case ESQUERDA:
            proximoy--;
            break;
        case CIMA:
            proximox--;
            break;
        case BAIXO:
            proximox++;
            break;
        case DIREITA:
            proximoy++;
            break;
    }

    //verifica se o caminho esta livre para movimento
    if (!podeAndar(&mp, HEROI, proximox, proximoy)){
        return;
    }

    //verifica se tem pilula na proxima posicao
    if (verificaPersonagem(&mp, PILULA, proximox, proximoy)){
        temPilula = 1;
    }

    andaNoMapa(&mp, heroi.x, heroi.y, proximox, proximoy);
    heroi.x = proximox;
    heroi.y = proximoy;

}

int acabou(){
    //o jogo acaba qdo o pacman some do mapa
    POSICAO pos;

    int perdeu = !encontraMapa(&mp, &pos, HEROI);
    int ganhou = !encontraMapa(&mp, &pos, FANTASMA);
    return perdeu || ganhou;
}
1 resposta

Olá Felipe.

O que pode estar acontecendo é ele estar entrando nos if:

    //se a proxima posicao nao for vazia sai da funcao
    if (!verificaPosicaoLivreMapa(&mp, novox, novoy)) return;

    //se a proxima posicao for uma parede, sai da funcao
    if (verificaParede(&mp, novox, novoy)) return;

Você pode incluir um print para validar isso:

//se a proxima posicao nao for vazia sai da funcao
    if (!verificaPosicaoLivreMapa(&mp, novox, novoy)){
         printf("Entrou no if verificaPosicaoLivreMapa")
         return;
    }

    //se a proxima posicao for uma parede, sai da funcao
    if (verificaParede(&mp, novox, novoy)){
         printf("Entrou no if verificaParede")
         return;
    }

Para eu conseguir te ajudar, se possível me mande também o seu código do mapa.c

Bons Estudos.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software