1
resposta

Duplicando o Herói e não está funcionando a direção "S"

Boa tarde, Quando digito a direção "S" o Herói não se movimenta. Já as demais direções quando digito, o Herói se duplica para a direção que solicito. Meu código está assim:

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
            return [linha, coluna_do_heroi]
        end
    end
    # não achei!
end

def calcula_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 posicao_valida? mapa, posicao
    linhas = mapa.size
    colunas = mapa[0].size
    estourou_linhas = posicao[0] < 0 || posicao[0] >= linhas
    estourou_colunas = posicao[1] < 0 || posicao[1] >= colunas

    if estourou_linhas || estourou_colunas
        return false
    end
    if mapa [posicao[0]][posicao[1]] == "X"
        return false
    end    
    true
end

def joga nome
    mapa = le_mapa 1

    while true
        desenha mapa
        direcao = pede_movimento
        heroi = encontra_jogador mapa
        nova_posicao = calcula_nova_posicao heroi, direcao
        if !posicao_valida? mapa, nova_posicao
            next
        end
        mapa[heroi[0]][heroi[1]] = " "
        mapa[nova_posicao[0]][nova_posicao[1]] = "H"
    end
end


def inicia_fogefoge
    nome = da_boas_vindas
    joga nome
end
1 resposta

Boa tarde Evandro,

Desculpas pela demora, mas caso ainda tenha dúvida e para ajudar alguém que pesquise esse problema no futuro segue a solução.

O que está faltando é duplicar o heroi antes de fazer o movimento, isso é feito na função calcula_nova_posicao:

def calcula_nova_posicao heroi, direcao
    heroi = heroi.dup
    # restante da função

Se isso não for feito o heroi vai ser movimentado antes da hora. Existe uma explicação melhor na atividade 14, um pouco mais a frente nessa mesma aula. A explicação está na seção Passagem por referência ou valor?