Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

Solucionado
(ver solução)
12
respostas

Ruby não esta mostrando o erro quando coloco para rodar o programa

depois que o programa esta escrito e coloco para rodar o mesmo e der erro por digitar algo errado, o ruby não mostra qual tipo de erro e onde estou errando.

o prompt fecha quando da erro

12 respostas

posta o código inteiro pra gente? se for longo, pode ser no gist/github

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_wifh_index do |linha_atual, linha|
            coluna_do_heroi = linha_atual.index caracter_do_heroi
                if coluna_do_heroi != - 1
                    return [linha, coluna_do_heroi]
                end
        end
end

def joga(nome)
    mapa = le_mapa (1)

        while true
            desenha mapa
            direcao = pede_movimento    
            heroi = encontra_jogador mapa
            mapa[heroi[0]][heroi[1]] = " "
            case direcao
                when "W"
                    heroi[0] -= 1
                when "S"
                    heroi[0] += 1
                when "A"
                    heroi[1] -= 1
                when "D"
                    heroi[1] += 1
            end
            mapa[heroi[0]][heroi[1]] = "H"
        end
end

def inicia_fogefoge
    nome = da_boas_vindas
    joga nome
end

acho que o problema esta nessa linha

mapa.each_wifh_index do |linha_atual, linha|

Como você está rodando o seu script? Dando dois cliques nele ou chamando pela linha de comando?

chamando pela linha de comando no cmd

e quem chama o inicia_fogefoge? nao tem mais nenhum arquivo?

Flavio, nao era pra ele fechar a linha no cmd. Rola voce colocar alguns pauses/debugar pra descobrir a linha/erro?

Flavio,

Percebi que tem um typo no seu código.

Troque de each_wifh_index para each_with_index.

Abraço!

este é o erro !!

****undefined method `each_with_index' for nil:NilClass**
(repl):58:in `encontra_jogador'
(repl):71:in `joga'
(repl):82:in `inicia_fogefoge'
(repl):85:in `<main>

este é meu codigo ate o momento

def mapa1
puts "XXXXX"
puts "X H X"
puts "X X X"
puts "X X X" 
puts "X   X"
puts "  X  "
puts " XXX "
puts "  X  "
puts "X F X"
puts "XXXXX"
end

def da_boas_vindas
    puts "Bem vindo ao foge-foge"
    puts "Qual é seu nome"
    nome = gets.strip
    pula_linha6
    puts "Começaremos o jogo para você, #{nome}"
    nome
end

def pula_linha6
    puts "\n\n\n\n\n\n"
end

def pula_linha2
    puts "\n\n"
end

def desenha(mapa)
    pula_linha2
    puts mapa
end

def pede_movimento
    pula_linha2
    puts "Para onde deseja ir ?"
    movimento = gets.strip
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 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 != -1
            return [linha, coluna_do_heroi]
        end
    end
end

def joga(nome)
    mapa = mapa1
    while true
        desenha mapa
        direcao = pede_movimento
        heroi = encontra_jogador mapa
        mapa[heroi[0]][heroi[1]] = " "
        nova_posicao = calcula_nova_posicao heroi, direcao
        puts "Antes: #{heroi}"
        puts "Depois: #{nova_posicao}"
        mapa[nova_posicao[0]][nova_posicao[1]] = "H"
    end
end

def inicia_fogefoge
    nome = da_boas_vindas
    joga nome
end

inicia_fogefoge
solução!

Oi Flavio, está dando este erro pois o seu método mapa1 está retornando nulo.

Na verdade você deve chamar a função le_mapa ao invés deste método mapa1 que só possui a impressão e não retorna nada.

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

e no método joga chamar este método passando o parâmetro 1:

def joga(nome)
    mapa = le_mapa (1)
    # restante do código
end

Abraço!

Ola !

estou copilando o programa neste site: repl.it...

E não consigo ler um arquivo TXT com o programa rodando neste site que e online.

abraço!

oi Flavio. O repl.it não vai deixar acessar algumas coisas como leitura de arquivo. Chegando nesse ponto, é melhor você instalar o ruby mesmo na máquina.