Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Solucionado (ver solução)

código nao esta funcionando

Meu código nao esta funcionado. Já revisei ele todo e nao encontro o erro. Na execução, o "H" só executa o movimento "S" na primeira vez e "atravessa a parede"

o q esta errado?

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        
    # nao achei
end

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    

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
solução

Olá Carolina,

Tem um detalhe trocado na lógica que testa se a posíção é válida, mais exatamente nesse código dentro dojogar:

if posicao_valida? mapa, nova_posicao
    next    
end

Aqui queremos testar se a posição NÃO é válida, assim temos que inverter o retorno de posicao_valida? com o !

Então é só adicionar o ! nesse if:

if !posicao_valida? mapa, nova_posicao
    next    
end

Espero ter ajudado, qualquer dúvida é só falar!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software