Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Dá erro quando se insere um número

Não estou conseguindo resolver o erro, a seguinte frase aparece: undefined method -' for nil:NilClass (repl):79:inblock in

' (repl):75:in each' (repl):75:in'
def boas_vindas
  puts "Bem vindo ao jogo!"
  puts "\n"
  puts "Digite seu nome para começar: "
  nome = gets.strip
  puts "\n\n\n\n\n\n"
  puts "Você está dentro do jogo #{nome}"
end

def pede_nivel
  puts "Em qual o nível você quer jogar?"
  dificuldade = gets.to_i
end

def sorteia_num_secreto(dificuldade)
  puts "\n\n"
  if dificuldade == 1
    maximo = 30
  else
    if dificuldade == 2
      maximo = 60
    else
      if dificuldade == 3
        maximo = 100
      else
        if dificuldade == 4
          maximo = 150
        else
          maximo = 200
        end
      end
    end
  end
  puts "Escolhendo um número entre 0 e #{maximo - 1}..."
  sorteado = rand(maximo)
  puts "Escolhido... Vamos adivinhar seu número..."
  puts "\n\n"
  sorteado.to_i
end

def pede_num(chutes, tentativa, limite_tentativa)
  puts "Tentativa #{tentativa} de #{limite_tentativa}"
  puts "Chutes até agora: #{chutes}"
  puts "Entre com o número:"
  chute = gets.strip
  chute.to_i
  puts "\n\n"
end

def verifica(numero_secreto, chute)
  acertou = numero_secreto == chute.to_i

  if acertou
    puts "ACERTOU!!!"
    return true
  end

  maior = numero_secreto > chute.to_i
  if maior
    puts "O número é maior!!!"
  else
    puts "O número é menor!!!"
  end
  false
end

boas_vindas
dificuldade = pede_nivel
num_secreto = sorteia_num_secreto dificuldade

pontos = 1000
limite_tentativa = 5
chutes = []

for tentativa in 1..limite_tentativa
  chute = pede_num chutes, tentativa, limite_tentativa
  chutes << chute

  pontos_perder = (chute - num_secreto).abs / 2.0
  pontos -= pontos_perder

  if verifica numero_secreto, chute
    break
  end
end

puts "Você ganhou #{pontos} pontos."
1 resposta
solução!

Olá, tudo bem?

Quando você ver esse erro não foca no erro no - mas sim no que está nil. A linha 79 do erro é esta:

pontos_perder = (chute - num_secreto).abs / 2.0

Como a conta de menos está sendo executada em cima da variável chute parece que ela está nil.

Você recebeu o valor do chute através do método pede_num. Olhando esse método dá pra contar que você está esperando que o retorno seja o número do chute. O problema é que a última linha do método está executando um retorno e essa última linha é um puts e o retorno do puts é nil por isso o número está vindo nulo.

Você pode alterar os métodos para algo como:

def pede_num(chutes, tentativa, limite_tentativa)
  puts "Tentativa #{tentativa} de #{limite_tentativa}"
  puts "Chutes até agora: #{chutes}"
  puts "Entre com o número:"
  chute = gets.strip
  puts "\n\n"
  chute.to_i #alterei a ordem das duas últimas linhas
end

Assim o retorno é o que você está esperando :)

Vi alguns outros problemas de nomenclatura que podem dar erros após essa correção mas os erros do Ruby devem te ajudar a resolver. Coisas como no final do for você chama numero_secreto mas a variável fora dos escopos dos métodos chama num_secreto.

Bons estudos :)

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