Mudei um pouco o código para que a movimentação do fantasma não fosse aleatória mais. A função pesquisa a posição do herói e move o fantasma a partir dela, caso o fantasma fique preso, por exemplo, o herói está ao lado direito do fantasma e abaixo dele, mas existe um obstáculo tanto a direita quanto abaixo, ele se moverá aleatoriamente para poder sair.
int paraondeofantasmavai (int xatual, int yatual, int* xdestino, int* ydestino){
int opcoes[4][2] = {
{xatual, yatual+1},
{xatual+1, yatual},
{xatual, yatual-1},
{xatual-1, yatual}
};
achamapa(&m, &heroi, HEROI);
for(int i = 0; i<10; i++){
if(heroi.x > xatual){
if(podeandar(&m, opcoes[1][0], opcoes[1][1])){
*xdestino = opcoes[1][0];
*ydestino = opcoes[1][1];
return 1;
break;
}
}
if(heroi.x < xatual){
if(podeandar(&m, opcoes[3][0], opcoes[3][1])){
*xdestino = opcoes[3][0];
*ydestino = opcoes[3][1];
return 1;
break;
}
}
if(heroi.y > yatual){
if(podeandar(&m, opcoes[0][0], opcoes[0][1])){
*xdestino = opcoes[0][0];
*ydestino = opcoes[0][1];
return 1;
break;
}
}
if(heroi.y < xatual){
if(podeandar(&m, opcoes[2][0], opcoes[2][1])){
*xdestino = opcoes[2][0];
*ydestino = opcoes[2][1];
return 1;
break;
}
}
else{
srand(time(0));
int posicao = rand() % 4;
if (podeandar(&m, opcoes[posicao][0], opcoes[posicao][1])){
*xdestino = opcoes[posicao][0];
*ydestino = opcoes[posicao][1];
return 1;
break;
}
}
}
return 0;
}