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

[RESOLVIDO] [Bug] codigo bugado

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
1 resposta
solução!

resolvido, resolucao no propio post