2013-11-21 29 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