4
respostas

Erro de undefined method for nil:Nilclass

Na função 'calcula_nova_posicao' esta dando o erro de method undefined, na linha 53 "heroi[0] += movimento[0]". QUal o motivo?

ui.rb

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

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

def desenha(mapa)
    puts mapa

end

fogefoge.rb

require_relative 'ui'

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

def joga(nome)
    mapa = le_mapa(2)

    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"

        move_fantasmas mapa
    end

end

def inicia_fogefoge
    nome = da_boas_vindas
    joga nome
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
            return[linha, coluna_do_heroi]
        end
    end            
    #não achei
end

def calcula_nova_posicao(heroi, direcao)
    heroi = heroi.dup
    movimentos = {
        "W" => [-1, 0],
        "S" => [1, 0],
        "A" => [0, -1],
        "D" => [0, 1]
    }
    movimento = movimentos[direcao]
    heroi[0] += movimento[0]
    heroi[1] += movimento[1]
    heroi
end

def posicao_valida?(mapa, posicao)
    linhas = mapa.size
    colunas = mapa[0].size

    estourou_linha = posicao[0] < 0 || posicao [0] >= linhas
    estourou_coluna = posicao[1] < 0 || posicao[1] >= colunas

    if estourou_linha || estourou_coluna
        return false
    end

    valor_local = mapa[posicao[0]][posicao[1]]
    if valor_local == "X" || valor_local == "F" 
        return false
    end

    true
end

def move_fantasma(mapa, linha, coluna)
    posicao = [linha][coluna + 1]
    if posicao_valida? mapa, posicao
        mapa[linha][coluna] = " "
        mapa[linha][coluna] = "F"
    end
end

def move_fantasmas(mapa)
    caracter_do_fantasma = "F"
    mapa.each_with_index do |linha_atual, linha|
        linha_atual.chars.each_with_index do |caracter_atual, coluna|
            eh_fantasma = caracter_atual == caracter_do_fantasma
            if eh_fantasma
                move_fantasma mapa, linha, coluna
            end
        end
    end
end

main.rb

require_relative 'fogefoge'

inicia_fogefoge
4 respostas

Opa, como o código é muito grande, vamos tentar de uma forma que você tente achar o erro.. o problema é que no ponto do erro, você está trabalhando com uma variável que está apontando para nulo(nil). O próximo passo é que você coloque uns "puts" para ir debugando e ver onde é que você ta perdendo essa referência.

Pode explicar melhor?

essa é linha 53:

heroi[0]

O héroi na posição zero está nulo.. agora você precisa debugar o código para entender o motivo. Coloca uns puts pelo código para ir verificando o comportamento do programa.

Felipe, provavelmente na hora de testar, vc esta digitando as teclas "WSDA" em minúsculo. Pelo que percebi o seu método "pede_movimento" ainda não esta tratando essa entrada de dados... da uma checada nesse método.

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