0
respostas

[Bug] O herói está devorando os fantasmas e o jogo não finaliza

não consigo identificar o erro do código fogefoge.c:

MAPA m;
POSICAO heroi;
int posicaofantasma (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++){ // numero de tentativas do fantasma se locomover
        int posicao = rand() % 4;//!!ATENÇÃO

        if (podeandar(&m, FANTASMA, opcoes[posicao][0], opcoes[posicao][1])){
        
            *xdestino = opcoes[posicao][0]; 
            *ydestino = opcoes[posicao][1];
            return 1;
        }
    }
    return 0;
}
int acabou(){
    POSICAO pos;
    
    int encontroufoge = encontramapa(&m, &pos, HEROI);
    return !encontroufoge;
}
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 = posicaofantasma(i, j, &xdestino, &ydestino);
                if (encontrou){
                    andanomapa(&m, i, j, xdestino, ydestino);
                }
            }
        }
    }
    liberamapa(&copia);
}
int saodirecoes(char direcao){
    return direcao == 'a' || direcao == 'w' || direcao == 'd' || direcao =='s';
}
void move(char direcao){
    if(!saodirecoes(direcao)){
        return;
    }
    int proximox = heroi.x; 
    int proximoy = heroi.y;
    
    switch (direcao)
    {
    case ESQUERDA:
       proximoy--;
        break;
    case CIMA:
        proximox--;
        break;
    case DIREITA:
        proximoy++;
        break;
    case BAIXO:
        proximox++;
        break;
    }
    if(!podeandar(&m, HEROI, proximox, proximoy)){
        return;
    }
    andanomapa(&m, heroi.x, heroi.y, proximox, proximoy);
    heroi.x = proximox;
    heroi.y = proximoy;
}
int main(){
    lemapa(&m); 
    encontramapa(&m, &heroi, HEROI );
    
    do{
    
        printmapa(&m);
        char comando;
        scanf(" %c", &comando);
        move(comando);
        
        fantasmas();
        
    } while (!acabou());
    
    liberamapa(&m);

mapa.c:

void lemapa(MAPA* m){
    FILE* mapa = fopen(CAMINHO_ARQUIVO, "r");
    if (mapa == NULL){
        printf("Arquivo vazio ou nao encontrado");
        exit(1);
    }
    fscanf(mapa, "%d %d", &(m->linhas), &(m->colunas));
    
    alocamapa(m);
    
    for (int i = 0; i < m->linhas; i++){
       fscanf(mapa, "%s", m->matriz[i]);
    }
    fclose(mapa);
}
void alocamapa(MAPA* m){
    m->matriz = malloc(sizeof(char*) * m->linhas); 
    
    for (int i = 0; i < m->linhas; i++){
        m->matriz[i] = malloc(sizeof(char) * (m->colunas + 1));
    }
}
void copiamapa(MAPA* destino, MAPA* origem ){
    destino->linhas = origem->linhas;
    destino->colunas = origem->colunas;
    
    alocamapa(destino);
    
    for (int i = 0; i < origem->linhas; i++){
        strcpy(destino->matriz[i], origem->matriz[i]);
    }
}
int ehparede(MAPA* m, int x, int y){
    return m->matriz[x][y] == PAREDE_HORIZONTAL ||
           m->matriz[x][y] == PAREDE_VERTICAL;
}
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 liberamapa(MAPA* m){
    for (int i = 0; i < m->linhas; i++){
        free(m->matriz[i]);
    }
    free(m->matriz);
} 

void printmapa(MAPA* m){
    for (int i = 0; i < m->linhas; i++){
        printf("%s\n", m->matriz[i]);
    }
        printf("\n");
}
int encontramapa(MAPA* m, POSICAO* p, char c){
   
    for (int i = 0; i < m->linhas; i++){
        for (int j = 0; j < m->colunas; j++){
        
            if(m->matriz[i][j] == c){
                p->x = i;
                p->y = j;
                
                return 1;
            }
        }
    }
    return 0;
}
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;
}

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;
}