O mesmo fantasma era movido várias vezes, pois o loop encontrava ele em posições diferentes. Para resolver isso, na aula, foi criada uma cópia do mapa, usando a função copiamapa(). Porém, consegui resolver o bug de uma maneira muito mais simples.
Função inicial (bug):
void fantasmas() {
//varre a matriz
for(int i = 0; i < m.linhas; i++) {
for(int j = 0; j < m.colunas; j++) {
if(m.matriz[i][j] == FANTASMA) {
if(posicaovazia(&m, i, j+1))
andanomapa(&m, i, j, i, j+1);
}
}
}
}
Para resolver, eu adicionei um j++ após a função andanomapa(), dentro do mesmo if. Sendo assim, após mover o fantasma, o loop for(int j = 0; j < m.colunas; j++) pula a nova posição do fantasma. Sendo assim, não reconhece essa posição como fantasma e não executa o if infinitamente.
Função corrigida:
void fantasmas() {
//varre a matriz
for(int i = 0; i < m.linhas; i++) {
for(int j = 0; j < m.colunas; j++) {
if(m.matriz[i][j] == FANTASMA) {
if(posicaovazia(&m, i, j+1)) {
andanomapa(&m, i, j, i, j+1);
j++;
}
}
}
}
}