RESOLVIDO eu percebi que no final, eu troquei proximox com proximo y.
Era pra ser:
m.matriz[proximoy][proximox] = '@';
m.matriz[p.x][p.y] = '.';
p.x = proximox;
p.y = proximoy;
e eu fiz
m.matriz[proximox][proximoy] = '@';
m.matriz[p.x][p.y] = '.';
p.x = proximox;
p.y = proximoy;
//////////////////////////////// post anterior ////////////////////////////////////
o heroi não se move corretamente, ele cria meio que um clone e faz um buraco na parede
jogo.c (principal)
#include <stdio.h>
#include <stdlib.h>
#include "jogoutils.h"
#include "mapa.h"
MAPA m;
PERSONAGEM p;
void mover(char direcao) {
printf("Coordenadas antes do movimento: (%d, %d)\n", p.x, p.y);
if(
direcao != 'a' &&
direcao != 'w' &&
direcao != 's' &&
direcao != 'd'
) return;
int proximox = p.x;
int proximoy = p.y;
switch(direcao) {
case 'a':
proximoy--;
break;
case 'w':
proximox--;
break;
case 's':
proximox++;
break;
case 'd':
proximoy++;
break;
}
if(proximox >= m.linhas)
return;
if(proximoy >= m.colunas)
return;
if(m.matriz[proximox][proximoy] != '.')
return;
m.matriz[proximox][proximoy] = '@';
m.matriz[p.x][p.y] = '.';
p.x = proximox;
p.y = proximoy;
}
int acabou(){
return 0;
}
int main() {
p.simbolo = '@';
ler_mapa(&m);
encontrar_personagem(&m, &p, '@');
do {
desenhar_mapa(&m);
char comando;
scanf(" %c", &comando);
mover(comando);
}
while (!acabou());
liberar_mapa(&m);
}
mapa.c
#include <stdio.h>
#include <stdlib.h>
#include "mapa.h"
#include "jogoutils.h"
void encontrar_personagem(MAPA* m, PERSONAGEM* p, char simbolo){
for (int i = 0; i < (*m).linhas; i++) {
for (int j = 0; j < (*m).colunas; j++) {
if (m->matriz[i][j] == (*p).simbolo) {
p->x = j;
p->y = i;
break;
}
}
}
}
void liberar_mapa (MAPA* m){
for (int x = 0; x < (*m).linhas; x++) {
free((*m).matriz[x]);
}
free((*m).matriz);
}
void alocar_mapa(FILE* f, MAPA* m){
(*m).matriz = malloc(sizeof(char*) * (*m).linhas);
for (int x = 0; x < (*m).linhas; x++) {
(*m).matriz[x] = malloc(sizeof(char) * ((*m).colunas + 1));
}
for (int i = 0; i < (*m).linhas; i++) {
fscanf(f, "%s", (*m).matriz[i]);
}
}
void ler_mapa(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));
alocar_mapa(f, &(*m));
fclose(f);
}
void desenhar_mapa(MAPA* m ){
for (int x = 0; x < (*m).linhas; x++) {
printf("%s\n", (*m).matriz[x]);
}
}
mapa.h
typedef struct personagem
{
char simbolo;
int x;
int y;
} PERSONAGEM;
typedef struct mapa
{
char** matriz;
int linhas;
int colunas;
} MAPA;
void liberar_mapa(MAPA* m);
void alocar_mapa(FILE* f, MAPA* m);
void ler_mapa(MAPA* m);
void desenhar_mapa(MAPA* m);
void encontrar_personagem(MAPA* m, PERSONAGEM* p, char simbolo);
jogoutils.h
void mover(char direcao);
output (após testar W\A\S\D):
##########
#........#
#.######.#
#...@....#
##########
w
Coordenadas antes do movimento: (4, 3)
##########
#........#
#.######.#
#..@@....#
###.######
a
Coordenadas antes do movimento: (3, 3)
##########
#........#
#.######.#
#.@.@....#
###.######
s
Coordenadas antes do movimento: (3, 2)
##########
#........#
#.######.#
#.@.@....#
###.######
d
Coordenadas antes do movimento: (3, 2)
##########
#........#
#.######.#
#..@@....#
###.######
^C