Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Dúvida] Mapa só é exibido uma vez e pac man não anda;


#include <stdio.h>
#include <stdlib.h>
#include "pacman.h"
int i = 5;
int j = 10;

void LiberaMapa(){
    char** mapa[i];
   
    for(int z = 0; z < i; z++){
        free(mapa[z]);
    }

    free(mapa);
}



void LeMapa(){
    char** mapa[i];
 
    FILE* f;
    f = fopen("mapa.txt", "r");

    if(f == 0){

        printf("Erro na leitura do arquivo!!\n");
        exit(1);
}
fscanf(f, "%d %d", &i, &j);
mapa[i] = malloc(sizeof(char*) * i);
    for(int w = 0; w < i; w++){           
        mapa[w] = malloc(sizeof(char) * j);          
}

for(int x = 0; x < i; x++){
    
    fscanf(f, "%s", (char*)mapa[x]);

}
fclose(f);

}
void ImprimeMapa(){
    char** mapa[i];

    for(int y = 0; y < i; y++){
        
    printf("%s\n", (char*)mapa[y-1]);
}
}

int acabou(){
    return 0;
}


//Não pode-se esquecer de fazer o casting!!!
void move(char direcao){
    char** mapa[i];
    int x;
    int y;
    for(int n = 0; n < i; n++){
        for(int m = 0; m < j; m++){
            if(mapa[n][m] == (char*)"@"){
                x = n;
                y = m;
                break;
            }
        }
    }switch(direcao){
        case 'a':
        mapa[x][y-1] = (char*)"@";
        break;
        case 'w':
        mapa[x-1][y] = (char*)"@";
        break;
        case 's':
        mapa[x+1][y] = (char*)"@";
        break;
        case 'd':
        mapa[x][y+1] = (char*)"@";
        break;
    }
    mapa[x][y] = (char*)'.';


}

int main(){
    
   LeMapa();

do{
   
    ImprimeMapa();
    char comando;
    scanf(" %c\n", &comando);
    move(comando);
   

}while(!acabou());



    LiberaMapa();
   

}

1 resposta
solução!

Olá Ilauan! Tudo joia?

Vamos por partes para entender o que pode estar acontecendo com o seu código.

Primeiro, notei que você está declarando o mapa como uma variável local em várias funções (LiberaMapa, LeMapa, ImprimeMapa e move). Isso significa que cada função tem sua própria versão do mapa, e elas não compartilham o mesmo estado. Para corrigir isso, você deve declarar o mapa como uma variável global.

Aqui está um exemplo de como você pode ajustar seu código:

#include <stdio.h>
#include <stdlib.h>
#include "pacman.h"

int i = 5;
int j = 10;
char** mapa;

void LiberaMapa(){
    for(int z = 0; z < i; z++){
        free(mapa[z]);
    }
    free(mapa);
}

void LeMapa(){
    FILE* f;
    f = fopen("mapa.txt", "r");

    if(f == 0){
        printf("Erro na leitura do arquivo!!\n");
        exit(1);
    }

    fscanf(f, "%d %d", &i, &j);
    mapa = malloc(sizeof(char*) * i);
    for(int w = 0; w < i; w++){           
        mapa[w] = malloc(sizeof(char) * (j + 1));  // +1 para o caractere nulo '\0'
    }

    for(int x = 0; x < i; x++){
        fscanf(f, "%s", mapa[x]);
    }
    fclose(f);
}

void ImprimeMapa(){
    for(int y = 0; y < i; y++){
        printf("%s\n", mapa[y]);
    }
}

int acabou(){
    return 0;
}

void move(char direcao){
    int x, y;
    for(int n = 0; n < i; n++){
        for(int m = 0; m < j; m++){
            if(mapa[n][m] == '@'){
                x = n;
                y = m;
                break;
            }
        }
    }

    switch(direcao){
        case 'a':
            mapa[x][y-1] = '@';
            break;
        case 'w':
            mapa[x-1][y] = '@';
            break;
        case 's':
            mapa[x+1][y] = '@';
            break;
        case 'd':
            mapa[x][y+1] = '@';
            break;
    }
    mapa[x][y] = '.';
}

int main(){
    LeMapa();

    do{
        ImprimeMapa();
        char comando;
        scanf(" %c", &comando);
        move(comando);
    } while(!acabou());

    LiberaMapa();
}

Algumas mudanças importantes:

  1. Variável Global mapa: Agora mapa é uma variável global, acessível por todas as funções.
  2. Alocação de Memória: Corrigi a alocação de memória para incluir o caractere nulo \0 na leitura das linhas do arquivo.
  3. Remoção de \n no scanf: Removi o \n do scanf para garantir que ele leia corretamente o comando.

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.