While em ruby

Alguém me ajuda nesse código de ruby, por gavor.
Comecei a estudar ruby hoje, fiz esse mini-jogo pra aprender algumas coisas e decidi colocar uma pergunta no final, pra saber se o usuário quer jogar novamente ou não. O problema é que mesmo se o usuário digitar “fim” o loop do while não termina. Segue o código:

res = “start”

while res != "fim"
num_pc = Random.rand(99) + 1

print "Advinhe o número que eu estou pensando, entre 1 e 100: "
num_user = gets.to_i

cont = 1
while num_pc != num_user
if num_pc > num_user
puts "Eu pensei num número maior."
else
puts "Eu pensei num número menor."
end
cont += 1
print "Tente novamente: "
num_user = gets.to_i
end

if num_pc == num_user
case cont
when 1
desempenho = "SENSACIONAL"
when 2…4
desempenho = "ótimo"
when 5…9
desempenho = "bom"
when 10…14
desempenho = "regular"
when 15…19
desempenho = "ruim"
else
desempenho = "péssimo"
end
puts "\nParabéns, você acertou!"
case cont
when 1
puts "Você tentou #{cont} vez."
else
puts "Você tentou #{cont} vezes."
end
puts "Seu desempenho foi #{desempenho}."
end
puts "\nDigite qualer caractere para jogar novamente.\nDigite “fim” para finalizar."
print "-> "
res = gets.downcase
end
puts “Obrigado por jogar!”

Fiz o mesmo jogo em Java (minha linguagem natal kk) e funcionou perfeitamente, não sei o que tem de errado aqui :confused:

1 curtida

Boa noite amigo.

Sei que já faz muito tempo mas eu só vi agora…kkkkkkkkkkkkkk. O problema do seu código é que o ruby conta o enter depois do “fim” então a verificação não funciona, tem que ser “fim\n”…kkkkkkkkkkkkk.

class Rb1

  res = "start"

  while res != "fim\n"
    num_pc = Random.rand(99) + 1

    print "Advinhe o número que eu estou pensando, entre 1 e 100: "
    num_user = gets.to_i

    cont = 1
    while num_pc != num_user
      if num_pc > num_user
        puts "Eu pensei num número maior."
      else
        puts "Eu pensei num número menor."
      end
      cont += 1
      print "Tente novamente: "
      num_user = gets.to_i
    end

    if num_pc == num_user
      case cont
      when 1
        desempenho = "SENSACIONAL"
      when 2...4
        desempenho = "ótimo"
      when 5...9
        desempenho = "bom"
      when 10...14
        desempenho = "regular"
      when 15...19
        desempenho = "ruim"
      else
        desempenho = "péssimo"
      end
      puts "\nParabéns, você acertou!"
      case cont
      when 1
        puts "Você tentou #{cont} vez."
      else
        puts "Você tentou #{cont} vezes."
      end
      puts "Seu desempenho foi #{desempenho}."
    end
    puts "\nDigite qualer caractere para jogar novamente.\nDigite “fim” para finalizar."
    print "-> "
    res = gets.to_s.downcase
  end
  puts "Obrigado por jogar!"

end

Espero que ainda sirva para alguém…:metal::sunglasses::metal:

1 curtida

Embora o while vai filtrar o caso em que num_user e num_pc sejam iguais acharia melhor deixar claro no else, colocando um segundo if ou iniciando com um unless.
Você poderia usar:
   if num_pc > num_user
       puts "Eu pensei num número maior."
   elsif num_pc < num_use
       puts "Eu pensei num número menor."
   end
end
ou
unless num_pc == num_user
   if num_pc > num_user
       puts "Eu pensei num número maior."
   else
       puts "Eu pensei num número menor."
   end
end

Ele pode colocar também

while chomp(res) != "fim"
   …
   res = gets.downcase
end

ou

while res != "fim"
   …
   res = chomp(gets.to_s.dowcase)
end
Aliás é necessário usar o método .to_s após um gets? Não é redundante? Não seria melhor res = chomp(gets.downcase)