Solucionado (ver solução)
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.