Estou com erro na movimentação do fantasma, toda vez que eu seleciono a tecla de movimentação ex. "D", oque movimenta é a linha horizontal do mapa ao inves dos fantasma
fogefoge.c
#include <stdio.h>
#include <stdlib.h>
#include "fogefoge.h"
#include "mapa.h"
//Variavel que permite eu agrupar outras variaveis dentro dela
MAPA m;
POSICAO heroi;
//Fazendo o fantasma andar para um lado
void Fantasmas() {
MAPA copia;
Copiamapa(&copia, &m);
for(int i = 0; i < copia.linhas; i++) {
for(int j = 0; j < copia.colunas; j++) {
if(copia.matriz[i][j] == FANTASMA) {
if(Ehvalida(&m, i, j+1) && Ehvazia(&m, i, j+1)) {
Andanomapa(&m, i, j, i, j+1);
}
return;
}
}
}
Liberamapa(&copia);
}
int acabou() {
return 0;
}
// Variavel para caso se o usuario apertar a tecla errado
int Ehdirecao(char direcao) {
return direcao == ESQUERDA ||
direcao == CIMA||
direcao == BAIXO ||
direcao == DIREITA;
}
void move(char direcao) {
//Variavel chamada caso o usuario chame a tecla erra
if(!Ehdirecao(direcao))
return;
// Variaveis de validação para o Pacman andar
int proximox = heroi.x;
int proximoy = heroi.y;
// Permite que eu selecione o lado que eu desejo ir
switch(direcao) {
// se eu apertar a seta para a esquerda mostra o pac man um pouco para a esquerda
case ESQUERDA:
proximoy--;
break;
case CIMA:
proximox--;
break;
case BAIXO:
proximox++;
break;
case DIREITA:
proximoy++;
break;
}
if(!Ehvalida(&m, proximox, proximoy))
return;
if(!Ehvazia(&m, proximox, proximoy))
return;
Andanomapa(&m, heroi.x, heroi.y, proximox, proximoy);
heroi.x = proximox;
heroi.y = proximoy;
}
int main() {
//Chamando a função para ler o mapa
Lemapa(&m);
Encontramapa(&m, &heroi, HEROI);
do {
imprimemapa(&m);
char comando;
scanf(" %c", &comando);
move(comando);
Fantasmas();
} while (!acabou());
//Liberação de memoria s
Liberamapa(&m);
}
Mapa.C
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "mapa.h"
//Variavel e função criada para criada para o mapa auxiliar
void Copiamapa(MAPA* destino, MAPA* origem) {
destino->linhas = origem->linhas;
destino->colunas = origem->colunas;
Alocamapa(destino);
for (int i = 0; i < origem->linhas; i++) {
//função que recebe um array de chaves
strcpy(destino->matriz[i], origem->matriz[i]);
}
}
int 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;
}
int Ehvalida(MAPA* m, int x, int y) {
//Metodo que não permite o Pacman passar das limitações do mapa
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 Encontramapa(MAPA* m, POSICAO* p, char c) {
// Metodo que acha a posição do pac man OBs: Porem ele guarda uma posição fixa
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;
}
}
}
}
int Liberamapa(MAPA* m) {
for(int i = 0; i < m->linhas; i++) {
free(m->matriz[i]);
}
free(m->matriz);
}
void Alocamapa(MAPA* m) {
// Tornando o mapa mais flexivel
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 Lemapa(MAPA* m) {
//Ponteiro de arquivos
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(int i = 0; i < 5; i++) {
fscanf(f, "%s", m->matriz[i]);
}
//Fechando o arquivo
fclose(f);
}
void imprimemapa(MAPA* m) {
for(int i = 0; i < 5; i++) {
printf("%s\n", m->matriz[i]);
}
}