apareceu esse warning:
fogefoge.c: In function ‘main’:
fogefoge.c:148:1: warning: control reaches end of non-void function [-Wreturn-type]
}
^
fogefoge.c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "fogefoge.h"
#include "mapa.h"
MAPA m;
POSICAO heroi;
int tempilula = 0;
int i, j;
int acabou(){
POSICAO pos;
int fogefogenomapa = encontramapa(&m, &pos, HEROI);
return !fogefogenomapa;
}
int ehdirecao(char direcao){
return
direcao == ESQUERDA
|| direcao == CIMA
|| direcao == DIREITA
|| direcao == BAIXO;
}
void move(char direcao){
if(!ehdirecao(direcao)){
return; //matar a função
}
int proximox = heroi.x;
int proximoy = heroi.y;
switch(direcao){
case ESQUERDA:
proximoy--;
break;
case CIMA:
proximox--;
break;
case DIREITA:
proximoy++;
break;
case BAIXO:
proximox++;
break;
}
if(!podeandar(&m, HEROI, proximox, proximoy)){
return;
}
andanomapa(&m, heroi.x, heroi.y, proximox, proximoy);
heroi.x = proximox;
heroi.y = proximoy;
}
int praondefantasmavai(int xatual, int yatual,
int* xdestino, int* ydestino){
int opcoes[4][2] = {
{ xatual , yatual+1 },
{ xatual+1 , yatual },
{ xatual , yatual-1 },
{ xatual-1 , yatual }
};
srand(time(0));
for(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(i = 0; i < copia.linhas; i++){
for(j = 0; j < copia.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 main(){
lemapa(&m);
encontramapa(&m, &heroi, HEROI);
do{
imprimemapa(&m);
char comando;
scanf(" %c", &comando);
move(comando);
fantasmas();
}while(!acabou());
liberamapa(&m);
}
fogefoge.h
#define CIMA 'w'
#define BAIXO 's'
#define ESQUERDA 'a'
#define DIREITA 'd'
int acabou();
void move(char direcao);
int ehdirecao(char direcao);
void fantasmas();
int praondefantasmavai(int xatual, int yatual,
int* xdestino, int* ydestino);
mapa.h
#define HEROI '@'
#define FANTASMA 'F'
#define VAZIO '.'
#define PAREDE_VERTICAL '|'
#define PAREDE_HORIZONTAL '-'
struct mapa{
char** matriz;
int linhas;
int colunas;
};
typedef struct mapa MAPA;
struct posicao {
int x;
int y;
};
typedef struct posicao POSICAO;
void liberamapa(MAPA* m);
void alocamapa(MAPA* m);
void lemapa(MAPA* m);
void imprimemapa(MAPA* m);
int encontramapa(MAPA* m, POSICAO* p, char c);
int ehvalida(MAPA* m, int x, int y);
int ehvazia(MAPA* m, int x, int y);
void andanomapa(MAPA* m, int xorigem, int yorigem, int xdestino, int ydestino);
void copiamapa(MAPA* destino, MAPA* origem);
int podeandar(MAPA* m, char personagem, int x, int y);
int ehparede(MAPA* m, int x, int y);
int ehpersonagem(MAPA* m, char personagem, int x, int y);
mapa.txt
5 10
|--------|
|.F.|..-.|
|..-|.@..|
|.F....-.|
|--------|
olha o que acontece:
|--------|
|.F.|..-.|
|..-|.@..|
|.F....-.|
|--------|
a
|-.------|
|F.-|..-.|
|.--|@...|
|.F....-.|
|-.------|
s
Falha de segmentação (imagem do núcleo gravada)
normalmente a falha de segmentação aparece logo quando entro com a primeira direção, as vezes acontece isso de os fantasmas andarem uma vez e aparece pontos aonde devia estar as paredes no mapa