1
resposta

Continuando o jogo

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]);
    }
}
1 resposta

Valeu por compartilhar!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software