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:
- Variável Global
mapa
: Agora mapa
é uma variável global, acessível por todas as funções. - Alocação de Memória: Corrigi a alocação de memória para incluir o caractere nulo
\0
na leitura das linhas do arquivo. - 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 ✓.