Выше нижней игра в Рубине


Я закончила Руби главу в семь языков за семь недель. Он пытается заставить вас знакомы с основными концепциями нескольких языках довольно быстро. Я послушно сделала все упражнения, но, скорее всего, они могут быть улучшены, чтобы быть более ярко-как. Я выложу мои примеры кода по одному, так что я могу применить вещи, усвоенные в предыдущих вопросах на последующие вопросы.

День 1

Напишите программу, которая выбирает случайное число. Дайте игроку угадать количество, сообщая игроку, если догадка слишком низкое или слишком высокое.

range = (0..10)
to_guess = range.min + rand(range.max - range.min)
guessed = false

while !guessed
    puts "Guess a number, between #{range.min} and #{range.max}"
    guess = gets
    int = guess.to_i
    if int == to_guess
        puts 'Correct!'
        guessed = true
    else
        puts int > to_guess ? 'Lower' : 'Higher'
    end     
end

После замечания по sepp2k:

class Range
  def size
    self.end - self.begin
  end
end

range = 0..10
to_guess = range.begin + rand(range.size)
guessed = false

until guessed
  puts "Guess a number, between #{range.begin} and #{range.end}"
  guess = gets
  int = guess.to_i
  if int == to_guess
    puts 'Correct!'
    guessed = true
  else
    puts int > to_guess ? 'Lower' : 'Higher'
  end       
end


1549
7
задан 27 апреля 2011 в 08:04 Источник Поделиться
Комментарии
2 ответа

Несколько незначительных вещей:

Прежде всего конвенции в мир Ruby использовать 2 пробела для отступов, а не 4. Это действительно не имеет большого значения, но это, как правило, проще использовать конвенций стиль, который каждый использует, если у вас есть причины этого не делать.

range = (0..10)

Вы на самом деле не нужны здесь в скобках. Скобки не являются частью синтаксиса для диапазона - причина, по которой вы обычно колеблется завернутый в скобках, что вы не можете вызывать методы на диапазоны без них (потому что 0..10.фу будет переводчик как 0..(10.фу)).

to_guess = range.min + rand(range.max - range.min)

Вы должны использовать начала и конца или первый и последний вместо мин и Макс. В Ruby 1.8.7 мин и Макс унаследовали от перечисляемую и будет перебирать весь ассортимент для того, чтобы найти минимум/максимум, что делает их о(n). Только в 1.9 (в 1.9.2, по крайней мере) они переопределены для работы в О(1) времени. начала и окончания работы за O(1) времени на все версий Ruby.

Я также считаю, положить это в свой собственный метод, как это кажется, он может пригодиться еще не раз.

while !guessed

Я бы написал, что как пока не догадались , как это говорится немного добрее ко мне.

7
ответ дан 27 апреля 2011 в 11:04 Источник Поделиться

Одна вещь, я заметил, что у вас есть одноразовые переменной, думаю, между ними получает и Инт. Вы можете сократить некоторые из этих, просто используя угадал = получает.to_i и если угадать == to_guess.

Кроме того, вы могли бы использовать перерыв вместо догадались переменной и в то время как/пока условие:

loop do
# ...
if guess == to_guess
puts 'Correct!'
break
end
puts int > to_guess ? 'Lower' : 'Higher'
end

Но это больше вопрос предпочтений, так как оба метода имеют свои достоинства.

4
ответ дан 14 мая 2011 в 10:05 Источник Поделиться