2017-02-28 73 views
0

第一次程序員,我很困惑,爲什麼我的ruby代碼沒有給出我想要的結果。我寫了一個簡單的程序來模擬滾動不同的多面骰子。涉及插值的Ruby代碼沒有給出我想要的結果

d4 = rand (1..4) 
d6 = rand (1..6) 
d8 = rand (1..8) 
d12 = rand (1..12) 
d20 = rand (1..20) 
percent = rand (1..100) 

puts "Which dice would you like to roll?" 
which_dice = gets.chomp 

puts "You rolled a #{which_dice}!" 

前六行定義每個骰子輸出1和骰子邊的數量之間的隨機數。然後我要求用戶用gets方法輸入他們想要的骰子,然後將結果與最後一行一起輸出。

問題是,當最後一行被執行時,它會顯示「你把一個(用戶用gets方法輸入的字符串作爲一個字符串輸入)!」。例如,當用戶在提示時輸入d8時,它會放入「你滾動了d8!」而不是我想要的1到8之間的實際隨機數。我怎麼能擁有它,所以它把一個實際的隨機數?

回答

1

您只需存儲一個字符串然後打印它。你爲什麼期望這個字符串變成其中一個d-something? 無論如何,你可以不喜歡

puts "Which dice would you like to roll?" 
which_dice = gets.chomp.to_i 
if [4, 6, 8, 12, 20, 100].include? which_dice 
    number = rand(1..which_dice) 
    puts "You rolled a #{number}!" 
else 
    puts "This dice doesn't exist dude" 
end 
0

簡答使用當前的腳本的相同的結構,讓您的輸出。

puts "You rolled a #{instance_eval(which_dice)}" 

但是,有一個更好的方法可以通過使用不同的數據結構來實現。

+0

小心使用這種方法,雖然 - https://stackoverflow.com/questions/5349624/how-to-call-methods-dynamically-based-on-their-name/26284769#26284769 –

+0

當然@BradWerth !但正如所說的,「有更好的方法來實現它」。我避免做出假設,只想解決它。實際上,從安全角度來看,我認爲這是最糟糕的解決方案,但我可以說,這種解決方案是唯一提出的解決方案,能夠在不改變剩餘代碼的情況下產生理想的結果。另外,作者沒有告訴我們這個代碼運行的環境。也許他只是試圖解決學校問題,解決在線練習或在輸入被控制的環境中運行(可能不是由人類輸入) – Codextremist

+0

我只是希望OP瞭解評估用戶 - 提供輸入... –

0

所以,快速和骯髒的反應是,你目前只從'gets.chomp'返回用戶輸入的文本。你對上面的變量沒有做任何事情。試試這個:

d4 = rand (1..4) 
d6 = rand (1..6) 
d8 = rand (1..8) 
d12 = rand (1..12) 
d20 = rand (1..20) 
percent = rand (1..100) 

puts "Which dice would you like to roll?" 
which_dice = gets.chomp 

case 
    when which_dice == 'd4' 
    amount = d4 
    when which_dice == 'd6' 
    amount = d6 
    when which_dice == 'd8' 
    amount = d8 
    when which_dice == 'd12' 
    amount = d12 
    when which_dice == 'd20' 
    amount = d20 
    when which_dice == 'percent' 
    amount = percent 
end 

puts "You rolled a #{amount}!" 
+0

注意這裏發展的模式?請參閱http://stackoverflow.com/a/42520285/525478 –

1

您在which_dice獲取一個字符串值,一個變量名。解決這個問題的一個簡單方法是將隨機值放在散列中,然後使用字符串值按名稱引用它們。

dice = { 
    "d4" => rand(1..4), 
    "d6" => rand(1..6), 
    "d8" => rand(1..8), 
    "d10" => rand(1..10), 
    "d12" => rand(1..12), 
    "d20" => rand(1..20) 
} 

puts "which dice would you like to roll?" 
which_dice = gets.chomp 

puts "You rolled a #{dice[which_dice]}" 

您也可以使用它來獲得更好的錯誤處理。如果他們試圖推出一個D7

which_dice = dice[gets.chomp] || "non-existent die." 
puts "You rolled a #{which_dice}" 

會顯示錯誤信息。

+0

注意在這裏開發的模式?請參閱http://stackoverflow.com/a/42520285/525478 –

+0

不確定我關注。我並沒有試圖重新設計他的代碼,只是回答他問的問題。我是新來的StackOverflow,所以我可能會接近這個錯誤? –

+0

但是你重新設計他的代碼,只是不如Ursus那麼優雅...... –

相關問題