2017-02-22 16 views
0

Я пытаюсь настроить довольно простой бросок кубика и ответ в подсказке, и он не работает правильно. Я хотел, чтобы цикл продолжал просить, пока пользователь не вводит roll, Roll или ROLL.Пока заявление не работает над простым кодом

def roll() 
    x = rand(5) + 1 
    y = rand(5) + 1 
    z = rand(5) + 1 
    puts "You rolled #{x},#{y},#{z}" 
    if x == y && y == z 
    puts "TRIPS! Trip #{x}s" 
    elsif x == y || y == z || x == z 
    puts "Pair!" 
    else 
    if x > y && x > z 
     puts "#{x} high" 
    end 
    if y > x && y > z 
     puts "#{z} high" 
    end 
    if z > x && z > y 
     puts "#{z} high" 
    end 
    end 
end 

puts "Type 'roll' when you're ready." 
entry = gets.chomp 

until entry == roll || Roll || ROLL 
    puts "Type 'roll' when you're ready." 
    entry = gets.chomp 
end 

roll() 

ответ

0

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

Начните с создания вашего метода roll сосредоточены на одной очень простой вещи:

def roll(sides = 6, count = 3) 
    Array.new(count) { rand(sides) + 1 } 
end 

Обратите внимание, что rand(5) производит значения в диапазоне 0..4, он никогда не дает 5. Идея здесь состоит в том, чтобы вернуть массив произвольной длины, и, разоблачив аргументы со значениями по умолчанию, вы можете легко использовать этот метод для других ситуаций.

Затем переместить всю логику отображения в основной цикл:

loop do 
    puts "Type 'roll' when you're ready." 
    entry = gets.chomp 

    case (entry.downcase) 
    when 'roll' 
    rolls = roll 

    puts "You rolled #{rolls.join(', ')}" 

    case (rolls.uniq.length) 
    when 1 
     puts "TRIPS! Trip #{rolls[0]}s" 
    when 2 
     puts "Pair!" 
    else 
     puts "#{rolls.max} high" 
    end 

    break 
    when 'quit' 
    break 
    end 
end 

Использование матричной структуры вместо трех произвольных переменных помогает существенно при работе с ними в совокупности. Вы можете видеть, как такие вещи, как uniq и max, без усилий в этой ситуации.

2
# Remove these two lines and just use them in the while/until 
# puts "Type 'roll' when you're ready" 
# entry = gets.chomp 


entry = '' 
# Use String.downcase on entry because the user could type rOLL or RoLl 
while entry.downcase != 'roll' # or you can use until entry.downcase == 'roll' 
    puts "Type 'roll' when you're ready." 
    entry = gets.chomp 
end 

Вы сравниваете запись к значениям, которые не существуют. Вам нужно сравнить с строкой.

Roll по соглашению должен быть классом/моделью/объектом какого-либо вида. Например

class Roll 
    # create roll 
    def initialize() 
    end 
end 
roll = Roll.new 
# or for an existing class like Arrays 
array = Array.new 

ROLL по соглашению будет предварительно определена константа.

ROLL = 7 
# => 7 
ROLL = 4 
# => warning: already initialized constant ROLL 
Смежные вопросы