2013-11-21 26 views
-1

我正在尝试写游戏。在下面的代码中,即使输入了一个有效的整数,它也会跳到底部else。为什么?Ruby if/elsif/else

puts 'You will be O\'s and I will be X\'s' 
puts 
puts '1,2,X' 
puts '4,5,6' 
puts '7,8,9' 
puts 
puts 'Your move...' 
puts 
moveOne = gets.chomp 
if moveOne == 5 
    puts = '1,2,X' 
    puts = '4,O,6' 
    puts = 'X,8,9' 
elsif moveOne == 1 
    puts = 'O,2,X' 
    puts = '4,5,6' 
    puts = 'X,8,9' 
elsif moveOne == 7 
    puts = 'X,2,X' 
    puts = '4,5,6' 
    puts = 'O,8,9' 
elsif moveOne == 9 
    puts = 'X,2,X' 
    puts = '4,5,6' 
    puts = '7,8,O' 
elsif moveOne == 2 
    puts = '1,O,X' 
    puts = '4,X,6' 
    puts = '7,8,9' 
elsif moveOne == 4 
    puts = '1,2,X' 
    puts = 'O,X,6' 
    puts = '7,8,9' 
elsif moveOne == 6 
    puts = '1,2,X' 
    puts = '4,X,O' 
    puts = '7,8,9' 
elsif moveOne == 8 
    puts = '1,2,X' 
    puts = '4,X,6' 
    puts = '7,O,9' 
else 
    puts'please enter a number!' 
end 
puts 
puts 'Your move again' 
+1

nick2653,最好让你的e xample代码尽可能简洁以说明您的问题。在这里,你需要的只是'如果moveOne == 5; puts ='1,2,X';其他;放入“请输入一个数字”;并询问为什么当你输入5时执行else子句。 –

回答

2

因为chomp给你一个字符串,而不是一个整数。

moveOne = gets.chomp.to_i 
+2

'gets'给你一个字符串,所以你可以简单地使用'.to_i'而不用chomp,因为它会自动处理换行符。 – vgoff

+0

谢谢Andy和vgoff!快速提问你vgoff我像你说的那样删除了chomp。让三条线彼此重复的语法是什么?我试过moveOne = gets.to_i if moveOne == 5 puts ='1,2,X' puts ='4,O,6' puts ='X,8,9' – nick2653

+0

@vgoff,you're对,这就是我的意思。 – AndyV

1

这是发生,因为gets.chomp返回一个字符串,不是整数。如果你这样做:

"a".to_i - > 0,你的程序可能会认为用户实际上已经进入了一个0

所以,首先,你要确保提供用户所输入的是一个数字字符,尽管它是字符串

这里是你能做什么:

1 - 创建一个将检查一个字符串是否是数字式的方法:

def is_a_number?(s) 
    s.to_s.match(/\A[+-]?\d+?(\.\d+)?\Z/) == nil ? false : true 
end 

2 - 如果是数字,如,只需将其转换为整数使用.to_i

所以,你的代码看起来像:

moveOne = gets.chomp 
if is_a_number?(moveOne) 
    number_entered = moveOne.to_i 
    if number_entered == 5 
    ... 
    elsif number_entered == 1 
    ... 
else 
    puts "enter a number..." 
end