Olá Pedro,
Acabei de ter o mesmo problema e ao invés de reescrever fui caçar qual era o problema, não me conformei em não entender.
No momento que começamos a trabalhar com a classe Heroi e instanciamos ela na função encontra_jogador temos a seguinte alteração:
if coluna_do_heroi
jogador = Heroi.new
jogador.linha = linha
jogador.coluna = coluna_do_heroi
return jogador
Até então, não precisávamos utilizar obrigatoriamente a palavra return para devolver o resultado à variável que chamou a função, mas se você retirar o erro irá aparecer.
Descobri isso colocando "puts heroi" dentro da função joga, seguem resultados:
joga com "puts"
def joga(nome)
mapa = le_mapa 2
while true
desenha mapa
direcao = pede_movimento
heroi = encontra_jogador mapa
puts heroi
nova_posicao = heroi.calcula_nova_posicao direcao
if !posicao_valida? mapa,nova_posicao.to_array
next
end
heroi.remove_do mapa
nova_posicao.coloca_no mapa
mapa = move_fantasmas mapa
if jogador_perdeu?(mapa)
game_over
break
end
end
end
Resultado com return:
Para onde deseja ir
D
Heroi:0x00000002b32de0
Resultado sem return:
Para onde deseja ir
D
Pode perceber que sem o return o puts nao retorna nada, ou seja nulo! que nem o erro informa.
Espero ter ajudado!