main.cpp
#include <iostream>
#include <stdlib.h>
#include <locale.h>
#include <stdio.h>
#include "functions.h"
using namespace std;
MAPA m;
int main()
{
setlocale(LC_ALL,""); // Ativa o uso de acentos
leMapa(&m);
do{
char comando;
imprimeMapa(&m);
scanf(" %c", &comando);
move(comando, &m);
}while(!acabou());
liberaMapa(&m);
system("pause");
return 0;
}
int acabou()
{
return 0;
}
void move(char direcao) {
int x;
int y;
for(int i = 0; i < m.linhas; i++) {
for(int j = 0; j < m.colunas; j++) {
if(m.matriz[i][j] == '@') {
x = i;
y = j;
break;
}
}
}
switch(direcao) {
case 'a':
m.matriz[x][y-1] = '@';
break;
case 'w':
m.matriz[x-1][y] = '@';
break;
case 's':
m.matriz[x+1][y] = '@';
break;
case 'd':
m.matriz[x][y+1] = '@';
break;
}
m.matriz[x][y] = '.';
}
functions.h
struct MAPA {
char** matriz;
int linhas;
int colunas;
};
void liberaMapa(MAPA* m);
void leMapa(MAPA* m);
void alocaMapa(MAPA* m);
void imprimeMapa(MAPA* m);
int acabou();
void move(char direcao, MAPA* m);
mapa.c
#include <stdlib.h>
#include <stdio.h>
#include "mapa.h"
void liberaMapa(MAPA *m)
{
// Liberação da memória alocada
for (int i = 0; i < m->linhas; i++)
{
free(m->matriz[i]);
}
free(m->matriz);
}
void leMapa(MAPA *m)
{
FILE *f;
f = fopen("mapa.txt", "r");
if (f == 0)
{
printf("Erro na leitura do mapa");
exit(1);
}
fscanf(f, "%d %d", &(m->linhas), &(m->colunas));
alocaMapa(m);
// Leitura do mapa do arquivo
for (int i = 0; i < m->linhas; i++)
{
fscanf(f, "%s", m->matriz[i]);
}
fclose(f);
}
void alocaMapa(MAPA *m)
{
// Alocando dinamicamente da matriz
m->matriz = (char**)malloc(sizeof(char*) * m->linhas);
for (int i = 0; i < m->linhas; i++)
{
m->matriz[i] = (char*)malloc(sizeof(char) * (m->colunas + 1)); // +1 para o caractere nulo
}
}
void imprimeMapa(MAPA *m)
{
// Impressão do mapa
for (int i = 0; i < m->linhas; i++)
{
printf("%s\n", m->matriz[i]);
}
}
Boa tarde, Pedro! Joia?
Analisando e testando o seu projeto identifiquei alguns pontos que estavam causando os erros, vou apresentá-los em sequência e separados para ficar mais fácil seu entendimento.
Alterar importação no seu arquivo mapa.cpp
: nesse arquivo você está importando o arquivo de header mapa.h
, mas você tem apenas o arquivo funcitions.h
então deve alterar a importação #include "mapa.h"
para:
#include "functions.h"
Retirar o parâmetro MAPA
da função move
estabelecida no arquivo functions.h
: dentro do arquivo a declaração da função move
necessita de apenas um parâmetro e não dois, então não é necessário passar o parâmetro do mapa, logo a declaração deve estar assim:
void move(char direcao);
Modificar a passagem de parâmetros no arquivo main.cpp
: dentro do arquivo você está chamando a função move
na linha 22, nela você está passando &m
que é um Struct de MAPA como parâmetro, mas como modificamos anteriormente, não precisa passar, então remova. Seu código main
ficará assim:
int main()
{
setlocale(LC_ALL,""); // Ativa o uso de acentos
leMapa(&m);
do{
char comando;
imprimeMapa(&m);
scanf(" %c", &comando);
move(comando);
}while(!acabou());
liberaMapa(&m);
system("pause");
return 0;
}
Espero ter ajudado e bons estudos!
Não consegui perceber o que você mudou no main, mesmo lendo seu comentário.
Opa, Pedro!
Foi um equívoco meu, no método move
eu deveria ter retirado o parâmetro &m
, mas acabei esquecendo. Mas já editei o código acima com essa alteração.
Peço desculpas pelo meu erro!