Я попытался переписать «оператор if / else» в следующем фрагменте кода, заменив его оператором «case», и я смертельно застрял в нем на несколько часов - что мне не хватает?

puts "Welcome to 'Guess My Number!'"
print "What is your name?"
input = gets
name = input.chomp

puts "Welcome, #{name.upcase!}!"
puts "I've got a random number between 1 and 100!"
puts "Can you guess it?"
target = rand(100) + 1 

num_guesses = 0
guessed_it = false
until num_guesses == 10 || guessed_it
    remaining_guesses = 10 - num_guesses
    puts "You've got #{remaining_guesses.to_s} guesses left!"
    print "Make a guess, put down a number: "
    guess = gets.chomp.to_i
    num_guesses = num_guesses + 1
end

puts case verification
    when guess < target 
        then "Ooops. Your guess was LOW."
    when guess > target
        then "Ooops. Your guess was HIGH."
    when guess < -1 
        then puts "Oooops. You have entered a number lower that 1!"
    when guess > 100
        then puts "Oooops. You have entered a number higher than 100!"
    when guess =~ /^([w])/
        then puts "Ooops. Looks like you have entered a non numeric 
value!"
    when guess == String
        then puts "Oooops! Looks like you have entered a non numeric 
value"

    when guess == target 
        then puts "Good job, #{name}!"  
             puts "You guessed my number in #{num_guesses} guesses!"
             guessed_it = true
end

unless guessed_it
    puts "Sorry, you didn't get my number. My number was #{target}."
end

«Оператор case» использовался для замены и улучшения логики следующего оператора if else:

if guess < target
    puts "Ooops. Your guess was LOW."
 elsif guess > target
  puts "Ooops. Your guess was HIGH."
 elsif guess == target 
  puts "Good job, #{name}!" 
  puts "You guessed my number in #{num_guesses} guesses!"
  guessed_it = true
 end
1
guitarfreak 16 Июл 2017 в 16:42
1. В опубликованном коде нет оператора if / else 2. Пожалуйста, опубликуйте, что происходит, и вы ожидаете, что произойдет
 – 
Nils Landt
16 Июл 2017 в 17:13
Есть что-то простое, чего я не понимаю ??
 – 
guitarfreak
16 Июл 2017 в 17:13
Я добавил оператор if / else, который изначально использовался в сообщение темы
 – 
guitarfreak
16 Июл 2017 в 17:19
Блок просто не работает. Я ожидаю, что блок поможет пользователю оставаться в рамках условий игрового процесса, помогая ему угадывать число и избегать случайных ошибок, таких как нажатие символов, фраз или чего-либо, не имеющего отношения к теме.
 – 
guitarfreak
16 Июл 2017 в 17:33

3 ответа

Ваша проблема в том, что вы используете форму case с необязательным условием, но вы используете предложения when, как если бы вы использовали безусловный case.

puts case
     when guess < target 
       "Ooops. Your guess was LOW."

Должно сработать.

Дальнейшее объяснение: при использовании case без условия выполняется самая ранняя ветвь when с истинным выражением. Это то, что вам здесь нужно.

Но вы использовали case с verification. В этом случае все ветви сравниваются с verification, и выполняется первая ветвь, в которой verification === branch condition истинно. Поскольку в вашем примере я предполагаю, что verification всегда равно nil, а все условия ваших веток всегда равны true или false, ни одна ветвь никогда не будет выполнена.

2
Nils Landt 16 Июл 2017 в 17:48
Правильный ответ. Удалил мой.
 – 
ferit
16 Июл 2017 в 17:35
К сожалению, нет - блок все еще неактивен. Внутри самого блока действительно есть некоторые ошибки, так как я впервые в жизни использую сопоставление. Но дело в том, что я даже не дохожу до блока, а это значит, что что-то не так с кодом перед
 – 
guitarfreak
16 Июл 2017 в 17:39
Я вижу на экране только последствия цикла до тех пор, пока блок case неактивен.
 – 
guitarfreak
16 Июл 2017 в 17:46
Мне кажется, что блок until должен заканчиваться после оператора case, а не до него.
 – 
Nils Landt
16 Июл 2017 в 17:49
Ммм, я рассматривал следующую точку зрения: блок case использует переменную guess, которая объявлена ​​внутри цикла until. Кроме того, логика состоит в том, что оператор case выполняется в цикле до тех пор, пока не будет, по крайней мере, так я это вижу. Было бы здорово узнать, где я ошибаюсь.
 – 
guitarfreak
16 Июл 2017 в 18:42

Вы можете использовать инструкцию case так:

class String
  def green;"\e[32m#{self}\e[0m";end
  def yellow;"\e[33m#{self}\e[0m";end
  def cyan;"\e[36m#{self}\e[0m";end
  def bg_blue;"\e[44m#{self}\e[0m";end
  def bold;"\e[1m#{self}\e[22m";end
  def underline;"\e[4m#{self}\e[24m";end
  def border(num);"\n#{'-' * num}\n#{self}\n#{'-' * num}\n";end
end

puts;puts "Welcome to 'Guess My Number!'".bold.bg_blue;puts
print 'What is your name? '.green
name = gets.chomp
puts "\nWelcome, #{name.upcase!}!\n".cyan.underline
puts "I've got a random number between 1 and 100!\nCan you guess it?".border(44)
target = rand(100) + 1

num_guesses = 0
guessed_it = false
until num_guesses == 10 || guessed_it
  remaining_guesses = 10 - num_guesses
  puts "\nYou've got #{remaining_guesses} guesses left!\n"
  puts;print 'Make a guess, put down a number: '
  guess = gets.chomp
  case guess.to_i
  when (1...target)
    puts 'Ooops. Your guess was LOW'.yellow.border(26)
  when (target + 1..100)
    puts 'Ooops. Your guess was HIGH'.yellow.border(26)
  when target
    puts; puts; puts
    puts "Good job, #{name}!".bold.green
    puts 'You guessed my number in ' + "#{num_guesses} guesses!".cyan
    puts; puts; puts
    guessed_it = true
  else
    puts "Oooops. You didn't enter a number from 1 to 100".yellow.border(47); puts
  end

  num_guesses += 1
end

unless guessed_it
  puts;puts;puts "Sorry, you didn't get my number. My number was #{target}.".yellow;puts
end
0
Dan Kreiger 16 Июл 2017 в 18:10
Спасибо, Дэн! В вашем ответе есть много интересных новых моментов, однако, по крайней мере, для меня здесь сработало следующее решение:
 – 
guitarfreak
16 Июл 2017 в 18:45

Всем большое спасибо! С вашей неоценимой помощью мне удалось вернуть душевное терпение и удовлетворение от этой небольшой задачи :) Моя ошибка в том, что я нарушил правила здравого смысла, пытаясь запустить несколько фрагментов кода в неправильной последовательности. Я переместил оператор case внутрь цикла until, и теперь все, что мне нужно сделать, это исправить ошибки, в частности, операторы when / then. Оно работает :)

    until num_guesses == 10 || guessed_it
    remaining_guesses = 10 - num_guesses
    puts "You've got #{remaining_guesses.to_s} guesses left!"
    print "Make a guess, put down a number: "
    guess = gets.chomp.to_i
    num_guesses = num_guesses + 1

        puts case 
        when guess < target 
            then "Ooops. Your guess was LOW."
        when guess > target
            then "Ooops. Your guess was HIGH."
        when guess < -1 
            then puts "Oooops. You have entered a number lower that 1!"
        when guess > 100
            then puts "Oooops. You have entered a number higher than 100!"
        when guess =~ /^([w])/
            then puts "Ooops. Looks like you have entered a non numeric value!"
        when guess == String
            then puts "Oooops! Looks like you have entered a non numeric value"

        when guess == target 
            then puts "Good job, #{name}!"  
                 puts "You guessed my number in #{num_guesses} guesses!"
        guessed_it = true
    end
end

unless guessed_it
    puts "Sorry, you didn't get my number. My number was #{target}."
end
0
guitarfreak 16 Июл 2017 в 19:27