#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "fogefoge.h"
#include "mapa.h"
//lista de structs
MAPA mp;
POSICAO heroi;
int temPilula = 0;
int main()
{
leMapa(&mp);
encontraMapa(&mp, &heroi, HEROI); //busca e armazena posicao do pacman no mapa
do {
//if ternario
printf("Tem pilula: %s\n", (temPilula ? "SIM" : "NAO"));
imprimeMapa(&mp);
char comando;
scanf(" %c", &comando);
//se a tecla recebida for uma direcao, chama funcao movimenta
if (verificaDirecao(comando)) movimenta(comando);
if (comando == BOMBA) explodeBomba();
fantasma();
} while(!acabou());
liberaMapa(&mp);
}
void explodeBomba(){
if (!temPilula) return;
explodePilula(heroi.x, heroi.y, 0, 1, 3); //explode para direita
explodePilula(heroi.x, heroi.y, 0, -1, 3); //explode para esquerda
explodePilula(heroi.x, heroi.y, 1, 0, 3); //explode para baixo
explodePilula(heroi.x, heroi.y, -1, 0, 3); //explode para cima
temPilula = 0;
}
//funcao recursiva que chama ela mesma de acordo com o numero de vezes informado
void explodePilula(int x, int y, int somax, int somay, int qtde){
//a cada vezes que a funcao e executada, a qtde diminui. Quando a qtde for zero, sai da funcao
if (qtde == 0) return;
int novox = x + somax;
int novoy = y + somay;
//se a proxima posicao nao for vazia sai da funcao
if (!verificaPosicaoLivreMapa(&mp, novox, novoy)) return;
//se a proxima posicao for uma parede, sai da funcao
if (verificaParede(&mp, novox, novoy)) return;
//se a proxima posicao e vazia, explode
mp.matriz[novox][novoy] = VAZIO;
explodePilula(novox, novoy, somax, somay, qtde-1);
}
int direcaoFantasma(int xatual, int yatual, int* xdestino, int* ydestino){
//matriz para armazenar as possiveis direcoes de movimento dos fantasmas
int opcoesDirecao[4][2] = {
{xatual, yatual+1},
{xatual+1, yatual},
{xatual, yatual-1},
{xatual-1, yatual}
};
srand(time(0));
for (int i=0; i<10; i++){
int direcao = rand() % 4;
if (podeAndar(&mp, FANTASMA, opcoesDirecao[direcao][0], opcoesDirecao[direcao][1])){
*xdestino = opcoesDirecao[direcao][0];
*ydestino = opcoesDirecao[direcao][1];
return 1;
}
}
return 0;
}
void fantasma(){
MAPA copia;
copiaMapa(&copia, &mp);
//percorre a matriz
for (int i = 0; i < copia.linhas; i++){
for(int j = 0; j < copia.colunas; j++){
//verifica se posicao atual e um fantasma
if (copia.matriz[i][j] == FANTASMA){
int xdestino;
int ydestino;
//recebe direcao aleatoria
int encontrou = direcaoFantasma(i, j, &xdestino, &ydestino);
//se encontrou direcao aleatoria valida
if (encontrou){
andaNoMapa(&mp, i, j, xdestino, ydestino);
}
}
}
}
liberaMapa(&copia);
}
int verificaDirecao(char direcao){
//retorna se a tecla digitada for uma direcao
return (direcao == ESQUERDA || direcao == CIMA || direcao == BAIXO || direcao == DIREITA);
}
void movimenta(char direcao){
int proximox = heroi.x;
int proximoy = heroi.y;
//verifica direcao e movimenta o pacman
switch(direcao){
case ESQUERDA:
proximoy--;
break;
case CIMA:
proximox--;
break;
case BAIXO:
proximox++;
break;
case DIREITA:
proximoy++;
break;
}
//verifica se o caminho esta livre para movimento
if (!podeAndar(&mp, HEROI, proximox, proximoy)){
return;
}
//verifica se tem pilula na proxima posicao
if (verificaPersonagem(&mp, PILULA, proximox, proximoy)){
temPilula = 1;
}
andaNoMapa(&mp, heroi.x, heroi.y, proximox, proximoy);
heroi.x = proximox;
heroi.y = proximoy;
}
int acabou(){
//o jogo acaba qdo o pacman some do mapa
POSICAO pos;
int perdeu = !encontraMapa(&mp, &pos, HEROI);
int ganhou = !encontraMapa(&mp, &pos, FANTASMA);
return perdeu || ganhou;
}