Olá, todo o código estava funcionando normalmente até eu implementar a função 'explodepilula', após algumas horas colocando vários printf, consegui enxugar o problema em apenas uma única linha de código, mas não consegui resolver por conta própria. A linha de código em questão é: m.matriz[heroi.x][heroi.y+i] = ESPACO_VAZIO;
da função explodepilula, bom, o único jeito que encontrei do jogo não encerrar foi deixando essa linha comentada.
Arquivo fogefoge.c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "fogefoge.h"
#include "mapa.h"
MAPA m;
POSICAO heroi;
int tempilula = 0;
int praondeofantasmavai(int xatual, int yatual, int* xdestino, int* ydestino) {
int opcoes[4][2] = {
{xatual + 1, yatual},
{xatual - 1, yatual},
{xatual, yatual + 1},
{xatual, yatual - 1}
};
srand(time(0));
for(int i = 0; i < 10; i++){
int posicao = rand() % 4;
if(podeandar(&m, FANTASMA, opcoes[posicao][0], opcoes[posicao][1])) {
*xdestino = opcoes[posicao][0];
*ydestino = opcoes[posicao][1];
return 1;
}
}
return 0;
}
void fantasmas() {
MAPA copia;
copiamapa(&copia, &m);
for(int i = 0; i < m.linhas; i++) {
for(int j = 0; j < m.colunas; j++) {
if(copia.matriz[i][j] == FANTASMA) {
int xdestino;
int ydestino;
int encontrou = praondeofantasmavai(i, j, &xdestino, &ydestino);
if(encontrou) {
andanomapa(&m, i, j, xdestino, ydestino);
}
}
}
}
liberamapa(&copia);
}
int acabou(){
POSICAO pos;
int encontrouoheroi = encontramapa(&m, &pos, HEROI);
return !encontrouoheroi;
}
int ehdirecao(char direcao) {
return direcao == ESQUERDA ||
direcao == CIMA ||
direcao == BAIXO ||
direcao == DIREITA;
}
void move(char direcao){
int proximox = heroi.x;
int proximoy = heroi.y;
// validação da entrada o usuário, "reseta" toda vez que o usuário
// digital alguma tecla diferente das direcionais.
if (!ehdirecao(direcao)) {
return;
}
switch(direcao){
case ESQUERDA:
proximoy--;
break;
case BAIXO:
proximox++;
break;
case DIREITA:
proximoy++;
break;
case CIMA:
proximox--;
break;
}
if(!podeandar(&m, HEROI, proximox, proximoy))
return;
if(ehpersonagem(&m, PILULA, proximox, proximoy)) {
tempilula = 1;
}
andanomapa(&m, heroi.x, heroi.y, proximox, proximoy);
heroi.x = proximox;
heroi.y = proximoy;
}
void explodepilula(){
for(int i = 0; i <= 3; i++) {
if(ehvalida(&m, heroi.x, heroi.y+i)) {
if(ehparede(&m, heroi.x, heroi.y+i)){
break;
}
//m.matriz[heroi.x][heroi.y+i] = ESPACO_VAZIO;
}
}
}
void loop() {
do{
printf("Tem pilula: %s\n", (tempilula ? "Sim" : "Não"));
imprimemapa(&m);
char comando;
scanf(" %c", &comando);
move(comando);
if(comando == BOMBA)
explodepilula();
fantasmas();
} while(!acabou());
}
int main() {
lemapa(&m);
encontramapa(&m, &heroi, HEROI);
loop();
// Limpando memória alocada dinâmicamente.
liberamapa(&m);
}
Arquivo fogefoge.h:
#define CIMA 'w'
#define ESQUERDA 'a'
#define DIREITA 'd'
#define BAIXO 's'
#define BOMBA 'b'
void explodepilula();
void fantasmas();
void loop();
void move(char direcao);
int acabou();
int ehdirecao(char direcao);
int praondeofantasmavai(int xatual, int yatual, int* xdestino, int* ydestino);