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

Erro no meu código da aula 5

Bem vindo ao jogo da adivinhação!
Qual é o seu nome?
Rafael
Começaremos o jogo para você, Rafael
Escolhendo um número secreto entre 0 e 200...
Escolhido...  que tal adivinhar hoje nosso número secreto?


Tentativa 1 de 5
Chutes até agora: []
Entre com o número?
3
Sera que acertou? Você chutou 3
maior_ou_menor.rb:55:in `block in <main>': undefined method `-' for "3":String (NoMethodError)
Did you mean?  -@
        from maior_ou_menor.rb:51:in `each'
        from maior_ou_menor.rb:51:in `<main>'

Meu código está gerando este erro quando incluir as funções matemáticas de calculo de pontos. Meu código aparentemente está igual ao da aula.

8 respostas

Oi Rafael, posta o código aqui pra gente ver o que pode estar gerando esse erro? o arquivo é o maior_ou_menor.rb

def da_boas_vindas
    puts "Bem vindo ao jogo da adivinhação!"
    puts "Qual é o seu nome?"
    nome = gets.strip
    puts "Começaremos o jogo para você, #{nome}"
end

def sorteia_numero_secreto
    puts "Escolhendo um número secreto entre 0 e 200..."
    sorteado = 175
    puts "Escolhido...  que tal adivinhar hoje nosso número secreto?"
    sorteado
end

def pede_um_numero(chutes, tentativa, limite_de_tentativas)
    puts "\n\n"
    puts "Tentativa #{tentativa} de #{limite_de_tentativas}"
    puts "Chutes até agora: " + chutes.to_s
    puts "Entre com o número?"
    chute = gets.strip
    puts "Sera que acertou? Você chutou #{chute}"
    chute
end

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

    if acertou
        puts "Você ganhou, acertou o chute!"
        puts "Jogo finalizado."
        return true
    end

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

da_boas_vindas
numero_secreto = sorteia_numero_secreto

pontos_ate_agora = 1000
limite_de_tentativas = 5
chutes = []

for tentativa in 1..limite_de_tentativas
    chute = pede_um_numero(chutes, tentativa, limite_de_tentativas)
    chutes << chute

    pontos_a_perder = (chute - numero_secreto) / 2
    pontos_ate_agora -= pontos_a_perder

    if verifica_se_acertou(numero_secreto, chute)
        break
    end
end
puts "Você ganhou #{pontos_ate_agora} pontos."
def da_boas_vindas
    puts "Bem vindo ao jogo da adivinhação!"
    puts "Qual é o seu nome?"
    nome = gets.strip
    puts "Começaremos o jogo para você, #{nome}"
end

def sorteia_numero_secreto
    puts "Escolhendo um número secreto entre 0 e 200..."
    sorteado = 175
    puts "Escolhido...  que tal adivinhar hoje nosso número secreto?"
    sorteado
end

def pede_um_numero(chutes, tentativa, limite_de_tentativas)
    puts "\n\n"
    puts "Tentativa #{tentativa} de #{limite_de_tentativas}"
    puts "Chutes até agora: " + chutes.to_s
    puts "Entre com o número?"
    chute = gets.strip
    puts "Sera que acertou? Você chutou #{chute}"
    chute
end

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

    if acertou
        puts "Você ganhou, acertou o chute!"
        puts "Jogo finalizado."
        return true
    end

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

da_boas_vindas
numero_secreto = sorteia_numero_secreto

pontos_ate_agora = 1000
limite_de_tentativas = 5
chutes = []

for tentativa in 1..limite_de_tentativas
    chute = pede_um_numero(chutes, tentativa, limite_de_tentativas)
    chutes << chute

    pontos_a_perder = (chute - numero_secreto) / 2
    pontos_ate_agora -= pontos_a_perder

    if verifica_se_acertou(numero_secreto, chute)
        break
    end
end
puts "Você ganhou #{pontos_ate_agora} pontos."
solução!

Oi Rafael, tudo bem? O problema está na hora que você vai calcular os pontos a perder. Perceba que em todo lugar que você vai usar a variável chute, você usa o método to_i para transformar a string em número, mas nesse ponto você esqueceu.

pontos_a_perder = (chute - numero_secreto) / 2

Corrigindo...

pontos_a_perder = (chute.to_i - numero_secreto) / 2

Há Wanderson, muito bom cara, passou despercebido mesmo! Obrigado pela ajuda!

Oi Rafael, lembra sempre de marcar o tópico como solucionado no post que resolveu seu problema, tá bem? Assim a gente sabe que o problema foi realmente resolvido e facilita pra outras pessoas encontrarem a solução.

Pode deixar, Obrigado.

Olá, você esqueceu de realizar a conversão do texto recebido na função pede_um_numero para inteiro:

chute.to_i