fogefoge.c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "fogefoge.h"
#include "mapa.h"
MAPA m;
POSICAO heroi;
int direcao_fantasma(int origemx, int origemy, int* destinox, int* destinoy){
int opcoes[4][2] = {
{origemx, origemy + 1},
{origemx, origemy - 1},
{origemx + 1, origemy},
{origemx - 1, origemy}
};
srand(time(0));
for(int i = 0; i < 10; i++){
int posicao = rand() % 4;
if(pode_andar(&m, FANTASMA, opcoes[posicao][0], opcoes[posicao][1])){
*destinox = opcoes[posicao][0];
*destinoy = opcoes[posicao][1];
return 1;
}
}
return 0;
}
void fantasmas(){
MAPA copia;
copiar_mapa(&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 destinox;
int destinoy;
int encontrou = direcao_fantasma(i, j, &destinox, &destinoy);
if(encontrou){
andar_no_mapa(&m, i, j, destinox, destinoy);
}
}
}
}
liberar_mapa(&copia);
}
int verificar_direcao(char direcao){
return direcao == ESQUERDA ||
direcao == CIMA ||
direcao == DIREITA ||
direcao == BAIXO;
}
void move(char direcao){
if(!verificar_direcao(direcao))
return;
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;
}
if(!pode_andar(&m, HEROI, proximox, proximoy))
return;
andar_no_mapa(&m, heroi.x, heroi.y, proximox, proximoy);
heroi.x = proximox;
heroi.y = proximoy;
}
int acabou(){
POSICAO pos;
int encontrou_fogefoge = encontrar_mapa(&m, &pos, HEROI);
return !encontrou_fogefoge;
}
int main(){
ler_mapa(&m);
encontrar_mapa(&m, &heroi, HEROI);
do {
imprimir_mapa(&m);
char comando;
scanf(" %c", &comando);
move(comando);
fantasmas();
} while(!acabou());
liberar_mapa(&m);
}
mapa.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "mapa.h"
int pode_andar(MAPA* m, char personagem, int x, int y) {
return
eh_valida(m, x, y) &&
!eh_parede(m, x, y) &&
!eh_personagem(m, personagem, x, y);
}
int eh_valida(MAPA* m, int x, int y) {
if(x >= m->linhas)
return 0;
if(y >= m->colunas)
return 0;
return 1;
}
int eh_personagem(MAPA* m, char personagem, int x, int y) {
return
m->matriz[x][y] == personagem;
}
int eh_parede(MAPA* m, int x, int y) {
return
m->matriz[x][y] == PAREDE_VERTICAL ||
m->matriz[x][y] == PAREDE_HORIZONTAL;
}
void copiar_mapa(MAPA* destino, MAPA* origem){
destino->linhas = origem->linhas;
destino->colunas = origem->colunas;
alocar_mapa(destino);
for(int i = 0; i < origem->linhas; i++){
strcpy(destino->matriz[i], origem->matriz[i]);
}
}
int verificar_vazio(MAPA* m, int x, int y){
return m->matriz[x][y] == VAZIO;
}
void andar_no_mapa(MAPA* m, int origemx, int origemy, int destinox, int destinoy){
char personagem = m->matriz[origemx][origemy];
m->matriz[destinox][destinoy] = personagem;
m->matriz[origemx][origemy] = VAZIO;
}
int encontrar_mapa(MAPA* m, POSICAO* p, char c){
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;
return 1;
}
}
}
return 0;
}
void ler_mapa(MAPA* m){
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));
alocar_mapa(m);
for(int i = 0; i < 5; i++){
fscanf(f, "%s", m->matriz[i]);
}
fclose(f);
}
void alocar_mapa(MAPA* m){
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 liberar_mapa(MAPA* m){
for(int i = 0; i < m->linhas; i++){
free(m->matriz[i]);
}
free(m->matriz);
}
void imprimir_mapa(MAPA* m){
for(int i = 0; i < 5; i++){
printf("%s\n", m->matriz[i]);
}
}