Apesar da função que movimenta os fantasmas ser chamada no código da função joga depois da função que movimenta o jogador. O fantasma está capturando a bomba primeiro que jogador e esse acaba sendo pego pelo fantasma com o movimento S. O mapa que eu uso tem a mesma configuração, vejam o printsreen: https://pasteboard.co/H9KNzmY.png
Qual será o motivo? será que é um problema de condição de corrida. Eu entendo que o mapa que entra na função que move fantasmas já é um que foi atualiza, afinal a passagem é por referência
def joga nome
mapa = le_mapa 3
while true
desenha_mapa mapa
direcao = pede_movimento
heroi = encontra_jogador mapa
nova_posicao = heroi.calcula_nova_posicao(direcao)
if !posicao_valida?(mapa, nova_posicao.to_array)
next
end
#Movendo o jogador
heroi.remove_do mapa
if mapa[nova_posicao.linha][nova_posicao.coluna]=="*"
for direita in 1..4
mapa[nova_posicao.linha][nova_posicao.coluna+direita]== " "
end
end
nova_posicao.coloca_no mapa
#movendo os fantasmas
mapa = move_fantasmas mapa
if jogador_perdeu? mapa
game_over
break;
end
end
end
def jogador_perdeu? mapa
perdeu = !encontra_jogador(mapa)
end
def encontra_jogador mapa
caracter_do_heroi = "H"
mapa.each_with_index do |linha_atual,linha|
coluna_do_heroi = linha_atual.index caracter_do_heroi
if coluna_do_heroi
jogador = Heroi.new
jogador.linha = linha
jogador.coluna = coluna_do_heroi
return jogador
end
end
nil
end