puts "Task 5-4: Guess the number (0..16) \n"
myNumber = rand(0..16)
puts myNumber
puts "I guess the nunber from 0 to 16. Guess it. Put your version."
puts "Shot 1:"
UserAnsver = gets.to_i
if UserAnsver == myNumber
abort "You are WINNER!"
else
TemperatureDeviation = myNumber - UserAnsver # определяем больше или меньше
if TemperatureDeviation > 0
Side = "LESS"
else
Side = "MORE"
end
if TemperatureDeviation.abs > 3 # определяем отклонение
Temperature = "(cold)"
else
Temperature = "(warm)"
end
end
puts Side + " " + Temperature
puts "Shot 2:"
UserAnsver = gets.to_i
if UserAnsver == myNumber
abort "You are WINNER!"
else
TemperatureDeviation = myNumber - UserAnsver # определяем больше или меньше
if TemperatureDeviation > 0
Side = "LESS"
else
Side = "MORE"
end
if TemperatureDeviation.abs > 3
Temperature = "(cold)"
else
Temperature = "(warm)"
end
end
puts Side + " " + Temperature
puts "Shot 3:"
UserAnsver = gets.to_i
if UserAnsver == myNumber
abort "You are WINNER!"
else
TemperatureDeviation = myNumber - UserAnsver # определяем больше или меньше
if TemperatureDeviation > 0
Side = "LESS"
else
Side = "MORE"
end
if TemperatureDeviation.abs > 3
Temperature = "(cold)"
else
Temperature = "(warm)"
end
end
puts Side + " " + Temperature
puts "You do not have guessed. try again"
В результате получаю вот такое в консоли:
Я понимаю, Что можно в каждом блоке назвать все переменные уникально и тогда этих ошибок не будет... но может есть какой-то более простой способ, например обнулить? Или я вообще не в том направлении думаю ?
PS Простите мой кривой английский, я его тоже только учу.
if TemperatureDeviation.abs > 3 # определяем отклонение
Temperature ||= "(cold)"
else
Temperature ||= "(warm)"
end
puts Side + " " + Temperature
Если вот так записать, то не ругается... нагуглил на каком то форуме, но что эта запись означает, так и не понял... Продолжает ругаться на переопределение UserAnsver
UserAnsver ||= gets.to_i
не запрашивает ввод у пользователя
Здесь корень ошибки в том, что в Руби с большой буквы начинаются названия констант.
Константы это переменные, которые объявляются один раз и больше не должны меняться. Руби очень гибкий и позволяет их менять, но ругается :)
Подробнее про это есть тут http://rubylearning.com/satishtalim/ruby_constants.html
Это свойственно многим языкам. Вообще повсеместная практика — названия переменных начинать с маленькой буквы.
так_принято_в_руби
аТакПринятовJava # это называется CamelCase
Коротко этот оператор значит Присвоить переменной значение только если переменная еще пуста (т. е. nil или false)
variable ||= 'Value'
По аналогии с += это можно представить как
variable = variable || 'Value'
Это не совсем правильная интерпретация, но она наглядна. При вычислении правой части если variable
возвращает неложное значение (т. е. по понятиям руби не false и не nil), то это значение и берется как результат. Если ложное, то результатом берется следующий аргумент 'Value'
.
Более строгое и подробное объяснение работы этого оператора http://www.rubyinside.com/what-rubys-double-pipe-or-equals-really-does-5488.html