语句不能处理简单代码

我正在尝试在提示中设置一个非常简单的骰子滚动和响应,但它无法正常工作。 我希望循环继续询问,直到用户输入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() 

下面是一个示例,说明如何以更Ruby的方式实现它,使其更具可扩展性。

首先让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 

使用数组结构而不是三个任意变量有助于在聚合时使用它们。 你可以看到uniqmax这样的东西在这种情况下是如何轻松的。

 # 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 

您正在将条目与不存在的值进行比较。 你需要比较一个字符串。

按惯例滚动应该是某种类/模型/对象。 例如

 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