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