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

Ao definir nova posição do herói ele é duplicado

Estou na nona videoaula do curso Ruby III e estou com problemas com esse código:

require_relative "ui"

def le_mapa(numero)
    arquivo = "mapa#{numero}.txt"
    texto = File.read arquivo
    mapa = texto.split "\n"
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
            return [linha, coluna_do_heroi]
        end
    end
end

def calcula_nova_posicao(heroi, direcao)
    #heroi = heroi.clone

    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 = le_mapa 1

    while true
        desenha mapa
        direcao = pede_movimento
        heroi = encontra_jogador mapa
        nova_posicao = calcula_nova_posicao heroi, direcao

        if nova_posicao[0] < 0
            next
        end

        if nova_posicao[1] < 0
            next
        end

        if nova_posicao[0] >= mapa.size
            next
        end

        if nova_posicao[1] >= mapa[0].size
            next
        end

        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 = da_boas_vindas
    joga nome
end

Quando coloco um carácter para movimentar o personagem do jogo, ele fica duplicado. Parece que a função nova_posicao altera o valor da variável heroi, não entendendo o porque.

A única forma que consegui fazer o código funcionar foi adicionando essa linha na função nova_posicao :

heroi = heroi.clone

Só que na videoaula ele não precisou utilizar esse código para funcionar.

Estou em dúvida se tem algo errado no código ou se é alguma coisa com minha versão do ruby.

A versão do ruby é 2.0.0p481 rodando no windows.

2 respostas
solução!

Oi Jorge,

Você pode utilizar o método dup ao invés do método clone, que é o utilizado na aula pois copia só as informações do objeto e não mais informações como o clone faz.

Você precisa duplicar o valor para conseguir calcular a posição e depois apagar a antiga, tem que fazer a cópia sim.

Abraço!

Obrigado Joviane, verdade esse código estava no curso só que um pouco mais pra frente.

Agradeço pelo retorno