Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Ao digitar o programa se encerra

Quando aperto "b" para explodir a bomba, o programa simplesmente encerra. O que pode estar errado? no fogefoge.h fiz o #define BOMBA 'b'

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "fogefoge.h"
#include "mapa.h"

MAPA m;
POSICAO heroi;
int tempilula = 0;


int praondefantasmavai(int xatual, int yatual,
    int* xdestino, int* ydestino) {

    int opcoes[4][2] = {
        { xatual, yatual +1},
        { xatual +1, yatual},
        { xatual -1, yatual},
        { 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 = praondefantasmavai(i, j,
                    &xdestino, &ydestino);

                if(encontrou) {
                    andanomapa(&m, i, j, xdestino, ydestino);
                }
            }
        }
    }
    liberamapa(&copia);
}

int acabou() {
    POSICAO pos;
    int fogefogenomapa = encontramapa(&m, &pos, HEROI);
    return !fogefogenomapa;
}

int ehdirecao(char direcao) {
    return direcao == 'a' ||
        direcao == 'w' ||
        direcao == 's' ||
        direcao == 'd';

}

void move(char direcao) {

    if(!ehdirecao(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;    

    }
    // [2][7]
    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() {

    if(!tempilula) return;

    explodepilula(heroi.x, heroi.y, 0, 1, 3);
    explodepilula(heroi.x, heroi.y, 0, -1, 3);
    explodepilula(heroi.x, heroi.y, 1, 0, 3);
    explodepilula(heroi.x, heroi.y, -1, 1, 3);

    tempilula = 0;
}

void explodepilula2(int x, int y, int somax, int somay, int qtd) {

    if(qtd == 0) return;

    int novox = x + somax;
    int novoy = y + somay;

    if(!ehvalida(&m, novox, novoy)) return;
    if(ehparede(&m, novox, novoy)) return;

        m.matriz[novox][novoy] = VAZIO;
        explodepilula2(novox, novoy, somax, somay, qtd - 1);
}

int main() {

    lemapa(&m);

    encontramapa(&m, &heroi, HEROI);

    do {

        printf("Tem pilula: %s\n", (tempilula ? "SIM" : "NAO"));

        imprimemapa(&m);

        char(comando);
        scanf(" %c", &comando);
        move(comando);
        if(comando == BOMBA) explodepilula();
        fantasmas();

    }while(!acabou());


        liberamapa(&m);
}
1 resposta
solução!

Consegui resolver!