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

"index ... out of string"

Implementei a movimentação do herói. Ela funcionou. Porém, após algumas movimentações o programa "quebra" em tempo de execução e me trás a seguinte mensagem:

Para onde deseja ir?
D
XXXXX
X               H
X X X
X X X
X   X
  X
 XXX
  X  
X F X
XXXXX  
Para onde deseja ir?
S
/Users/lucastostes/Dropbox/Programação/Aulas de Ruby/Jogo fogefoge/fogefoge.rb:34:in `[]=': index 16 out of string (IndexError)
    from /Users/lucastostes/Dropbox/Programação/Aulas de Ruby/Jogo fogefoge/fogefoge.rb:34:in `jogo'
    from /Users/lucastostes/Dropbox/Programação/Aulas de Ruby/Jogo fogefoge/fogefoge.rb:44:in `inicia_fogefoge'
    from main.rb:3:in `<main>'

Segue o meu código:

ui.rb

def da_boas_vindas
    puts "Seja bem vindo ao jogo do Foge Foge"
    puts "Qual o seu nome?"
    nome = gets.strip
    puts "\n"
    puts "Começaremos o jogo para você #{nome}."
    nome
end

def desenha_o_mapa(mapa)
    puts mapa 
end

def pega_movimento
    puts "Para onde deseja ir?"
    movimento = gets.strip
    return movimento
end

def calcula_nova_posicao(posicao_do_heroi, direcao)
        case direcao
            when "W"
                posicao_do_heroi[0] -= 1
            when "S"
                posicao_do_heroi[0] += 1
            when "A"
                posicao_do_heroi[1] -=1
            when "D"
                posicao_do_heroi[1] +=1
        end

        return posicao_do_heroi


end

foge foge.rb

require_relative 'ui'

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

def encontra_jogador(mapa)
    caracter_do_heroi = "H"

    mapa.each_with_index do |linha_atual, linha|
        linha_atual = mapa[linha]
        coluna_do_heroi = linha_atual.index(caracter_do_heroi)
        if coluna_do_heroi
            return [linha, coluna_do_heroi]
        end


    end

end

def jogo(nome)
    mapa = le_mapa(1)

    while true
        desenha_o_mapa(mapa)
        direcao = pega_movimento
        posicao_do_heroi = encontra_jogador(mapa)
        mapa[posicao_do_heroi[0]][posicao_do_heroi[1]] = " "
        nova_posicao = calcula_nova_posicao(posicao_do_heroi, direcao)
        mapa[nova_posicao[0]][nova_posicao[1]] = "H"



    end

end

def inicia_fogefoge
    nome = da_boas_vindas
    jogo(nome)
end

main.rb

require_relative 'fogefoge'

inicia_fogefoge
2 respostas
solução!

Lucas, tudo bem? Já tive problemas como este e como você já comentou, após algumas movimentações. O que pode ser isso?

Lembra de como é o mapa? São caracteres de X e espaços em branco que representam onde o Heroi pode andar. O que pode estar contecendo no seu caso é que em determinadas posições do mapa, ao tentar movimentar o heroi, o codigo do jogo encontra uma posição que não existe (porque não é X nem espaço em branco), provocando o erro.

verifique isso no seu arquivo de mapa e teste novamente. Posso ter sido complicado na resposta, conseguiu entender? Fui claro?

Opa. Foi claro sim. Problema resolvido. Foi um erro do tipo "index out of bound" (aprendi isso com este erro) ou, no caso, "index out of string". É como se eu estivesse tentando acessar uma posição que não existe na minha array. Valeu!