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

Posição do '@' não atualiza

Após as implementações dessa aula, a posição do "herói" ('@') não atualiza.

Na execução, quando insiro os comandos no teclado (teclas a, s, d, w) percebo que os outros caracteres do mapa são mudados para '.' a medida que eu movo o "herói". Mas o '@' não muda de lugar, permanece na sua posição inicial, como se heroi.x--; heroi.x++; heroi.y--; heroi.y++; ou os m.matriz[heroi.x-1][heroi.y] = '@'; da função move() não funcionassem.

fogefoge.c

#include <stdio.h>
#include <locale.h>
#include <stdlib.h>
#include "fogefoge.h"
#include "mapa.c"

MAPA m;
POSICAO heroi;

int acabou() {
    return 0;
}

void move(char direcao) {
    switch (direcao) {
        case 'w': 
            m.matriz[heroi.x-1][heroi.y] = '@';
            heroi.x--;
            break;
        case 's': 
            m.matriz[heroi.x+1][heroi.y] = '@';
            heroi.x++;
            break;
        case 'a': 
            m.matriz[heroi.x][heroi.y-1] = '@';
            heroi.y--;
            break;
        case 'd': 
            m.matriz[heroi.x][heroi.y+1] = '@';
            heroi.y++;
            break;
        default:
            printf("Comando inválido.\n");
    }

    m.matriz[heroi.x][heroi.y] = '.';
    }

int main () {
    setlocale (LC_ALL, "portuguese");

    lemapa(&m);
    encontraHeroi(&m, &heroi, '@');

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

    liberamapa(&m);            
 }

fogefoge.h

void move(char direcao);
int acabou();

mapa.c

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

int i = 0;

void encontraHeroi(MAPA* m, POSICAO* p, char c) {
    //achar a posição do foge foge
    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;
                break; // o break é para, quando achar, não continuar com o loop.
            }
        }
    }
}

void liberamapa(MAPA* m) {
    for (int i = 0; i < m->linhas; i++) {
        free(m->matriz[i]);
    }    
    free(m->matriz);
}

void alocamapa(MAPA* m) {
    m->matriz = malloc(sizeof(char*) * m->linhas);

    for(i = 0; i  < m->linhas; i++) {
        m->matriz[i] = malloc(sizeof(char) * (m->colunas + 1));
    }
}

void lemapa(MAPA* m) {
    FILE* f;
    f = fopen("mapa.txt", "r");
    if(f == 0) {
        printf("Erro na leitura do mapa\n");
        exit(1);
    }

    fscanf(f, "%d %d", &(m->linhas), &(m->colunas));

    alocamapa(m);

    for (i = 0; i < m->linhas; i++) {
        fscanf(f, "%s", m->matriz[i]);   
    }                                
fclose(f);
}

void imprimemapa(MAPA* m) {
    for (i = 0; i < m->linhas; i++) {
        printf("%s\n", m->matriz[i]);
    }
}

mapa.h

struct mapa {
    char** matriz;
    int linhas, colunas;
};
typedef struct mapa MAPA;


struct posicao {
    int x;
    int y;
};
typedef struct posicao POSICAO;

void liberamapa(MAPA *m);
void lemapa(MAPA *m);
void alocamapa(MAPA *m);
void imprimemapa(MAPA *m);
void encontraHeroi(MAPA* m, POSICAO* p, char c);
1 resposta
solução!

O funcionamento do programa voltou ao normal quando eu coloquei m.matriz[heroi.x][heroi.y] = '.'; antes do trecho switch case na função move(). .

void move(char direcao) {

    m.matriz[heroi.x][heroi.y] = '.';

        switch (direcao) {
            case 'w': 
                m.matriz[heroi.x-1][heroi.y] = '@';
                heroi.x--;
                break;
            case 's': 
                m.matriz[heroi.x+1][heroi.y] = '@';
                heroi.x++;
                break;
            case 'a': 
                m.matriz[heroi.x][heroi.y-1] = '@';
                heroi.y--;
                break;
            case 'd': 
                m.matriz[heroi.x][heroi.y+1] = '@';
                heroi.y++;
                break;
            default:
                printf("Comando inválido.\n");
        }
}