O mapa é impresso uma primeira vez, mas ao informar algum comando (com as teclas: a, s, w ou d) o programa "trava" - um novo mapa não é impresso e o pacman não anda.
Seguem meus arquivos:
fogefoge.c
#include<stdio.h>
#include<stdlib.h>
#include "fogefoge.h"
#include<time.h>
#include "mapa.h"
#include "mapa.c"
MAPA m;
POSICAO heroi;
int i,j;
int praondeofantasmavai(int xatual, int yatual, int* xdestino, int* ydestino){
//As opções de deslocamento que o fantasma tem
int opcoes[4][2] = {
{ xatual, yatual+1},
{ xatual+1, yatual},
{ xatual, yatual-1},
{ xatual-1, yatual}
};
srand(time(0));
//Há 10 chances do fantasma ter um deslocamento para uma posição válida
for(i=0;i<10;i++){
//Adquirindo um número randômico qualquer de 0 a 3
int posicao = rand() % 4;
//Se for uma posicao válida
//Nós então atribuímos valores a xdestino e ydestino
if(ehvalida(&m, opcoes[posicao][0], opcoes[posicao][1]) && ehvazia(&m, opcoes[posicao][0], opcoes[posicao][1])){
*xdestino = opcoes[posicao][0];
*ydestino = opcoes[posicao][1];
//Retorna verdadeiro quando a atribuição ocorre de forma correta
return 1;
}
}
return 0;
}
void fantasmas(){
MAPA copia;
copiamapa(&copia,&m);
for(i=0;i<m.linhas;i++){
for(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);
}
if(ehvalida(&m, i, j+1) && ehvazia(&m, i, j+1)){
andanomapa(&m, i, j, i, j+1);
}
}
}
}
liberamapa(&copia);
}
int acabou(){
return 0;
}
// Validar a entrada do usuário
// Caso o usuário digite uma letra diferente daquelas usadas para comando então
// o pacman não vai se movimentar
int ehdirecao(char direcao){
return direcao == 'a' || direcao == 'w' || direcao == 's' || direcao == 'd';
}
void move(char direcao){
// Se não for uma direção válida então o pacman não se movimenta
if(!ehdirecao(direcao) )
return;
// Descobrindo o que tem na 'casa' para qual o comando do usuário levaria o pacman
int proximox = heroi.x;
int proximoy = heroi.y;
switch(direcao){
case ESQUERDA:
proximoy--;
break;
case CIMA:
proximox--;
break;
case BAIXO:
proximox++;
break;
case DIREITA:
proximoy++;
break;
}
// Valida a posicao para a qual o comando do usuário 'aponta'
if(!ehvalida(&m, proximox, proximoy))
return;
// Se a proxima posição não for vazia '.' então o pacman não pode se deslocar
if(!ehvazia(&m, proximox, proximoy))
return;
andanomapa(&m, heroi.x, heroi.y, proximox, proximoy);
// Atualizando a posição do heroi no mapa
heroi.x = proximox;
heroi.y = proximoy;
}
int main(){
lemapa(&m);
encontramapa(&m,&heroi, HEROI);
do {
imprimemapa(&m);
char comando;
scanf(" %c", &comando);
move(comando);
fantasmas();
} while (!acabou());
liberamapa(&m);
return 0;
}
fogefoge.h
//HEADER DEMAIS FUNÇÕES DO JOGO*************************************************
#define CIMA 'w'
#define BAIXO 's'
#define DIREITA 'd'
#define ESQUERDA 'a'
int acabou();
void move(char direcao);
int ehdirecao(char direcao);
void fantasmas();
int praondeofantasmavai(int xatual, int yatual, int* xdestino, int* ydestino);