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

Herói duplicando - Ruby III

O meu H ( herói ) não está se movimentando e sim duplicando e não sei como resolver isso. Quem puder me ajudar agradeço.

UI

def da_boas_vindas
    puts "Bem-Vindo ao Run."
    puts "Insira um nick:"
    nome = gets.strip
    if nome == "Juan"
        puts "Iniciando o jogo para você, #{nome}-senpai."
        puts "\n"
    else
        puts "Iniciando o jogo para você, #{nome}."
        puts "\n"
    end
    nome
end

def desenha (mapa)
    puts mapa
end

def pede_movimento
    puts "\n"
    puts "Para onde deseja ir?"
    movimento = gets.strip
    movimento
end

Business Logic

require_relative 'UI'

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

def encontra_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
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
    ultrapassou_linhas = posicao[0] < 0 || posicao[0] >= linhas 
    ultrapassou_colunas = posicao[1] < 0 || posicao[1] >= colunas

    if ultrapassou_linhas || ultrapassou_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 started_run
    nome = da_boas_vindas
    joga nome
end

mapa1

XXXXX
X H X
X X X
X X X
X   X
  X  
 XXX
  X  
X F X
XXXXX
2 respostas
solução!

Oi Luiz, fiz um teste com o seu arquivo e percebi que está faltando o dup do heroi no calcula_nova_posicao. Veja como deve ficar:

def calcula_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

Adicione a linha de código heroi = heroi.dup logo no começo, aí vai dar certo.

Obrigado! o/