Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Posição anterior do meu herói não apaga

Olá, Quando mudo a posição do meu herói, a posição antiga não é substituída por " ". Ao invés disso, fico com dois "H" na tela. Assim o jogo não funciona mais corretamente.

Revisei meu código com o vídeo mas não encontrei aonde estou fazendo diferente. Abaixo meu código até agora.

Obrigado!

require_relative 'ui'

def ler_mapa(numero)
    arquivo = "mapa#{numero}.txt"
    texto = File.read arquivo
    mapa = texto.split "\n"
end

def encontrar_jogador(mapa)
    caractere_do_heroi = "H"
    mapa.each_with_index do |linha_atual, linha|
        coluna_do_heroi = linha_atual.index caractere_do_heroi
        if coluna_do_heroi
            return [linha, coluna_do_heroi]
        end
    end
    #não achei!
end

def calcular_nova_posicao(heroi, direcao)
    case direcao
        when "W"
            heroi[0] -= 1
        when "S"
            heroi[0] += 1
        when "A"
            heroi[1] -= 1
        when "D"
            heroi[1] += 1
    end
    heroi
end

def joga(nome)
    mapa = ler_mapa(1)

    while true
        desenhar(mapa)
        direcao = pedir_movimento
        heroi = encontrar_jogador(mapa)        
        nova_posicao = calcular_nova_posicao(heroi, direcao)

        if mapa[nova_posicao[0]] [nova_posicao[1]] == "X"
            next
        end

        mapa[heroi[0]] [heroi[1]] = " "
        mapa[nova_posicao[0]] [nova_posicao[1]] = "H"
    end
end

def inicia_fogefoge
    nome = dar_boas_vindas
    joga(nome)
end
4 respostas

Oi Cláudio, manda também o ui.rb pra gente dar uma olhada se pode ser algo nele?

Segue o ui.rb e também o mapa1.rb


XXXXX
X H X
X X X
X X X
X   X
  X
 XXX
  X  
X F X
XXXXX
def dar_boas_vindas
    puts "Bem vindo ao Foge-foge"
    puts "Qual é o seu nome?"
    nome = gets.strip
    puts "\n\n"
    puts "Começaremos o jogo para você, #{nome}."
    nome
end

def desenhar(mapa)
    puts mapa
end

def pedir_movimento
    puts "Para onde deseja ir?"
    movimento = gets.strip
end
solução!

Olá, consegui achar o erro. Esta no calcular_nova_posição.

def calcular_nova_posicao(heroi, direcao)
    heroi = heroi.dup
    case direcao
        when "W"
            heroi[0] -= 1
        when "S"
            heroi[0] += 1
        when "A"
            heroi[1] -= 1
        when "D"
            heroi[1] += 1
    end
    heroi
end

não tinha adicionado o "heroi = heroi.dup". Agora voltou a funcionar. Mas é estranho pois na vídeo-aula que é definida o calcular_nova_posição, o professor não escreve "heroi = heroi.dup". Aparece essa linha só no material final.

Estranho mesmo, queria saber porque no vídeo ele passa a referência do array como argumento pra o calcula_nova_posicao, e mesmo assim não precisa fazer o heroi.dup pra não altera-lo.