2017-02-28 11 views
0

初めてのプログラマーで、なぜ私のルビーコードが私が望む結果が得られないのか混乱しています。私は、異なる多面ダイスのローリングをシミュレートする簡単なプログラムを書いた。補間を伴う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}!" 

最初の6行は、各サイコロを定義し、1とサイコロの辺の数の間の乱数を出力します。次に、getメソッドで丸めたいサイコロを入力し、最後の行に結果を出力するようにユーザーに依頼します。

問題は、最後の行が実行されるときに、「あなたが(ユーザーがgetsメソッドで文字列として入力したもの)」を出してしまうことです)。例えば、ユーザがプロンプトでd8を入力すると、「あなたはd8をロールしました!」と表示されます。私が望む1と8の間の実際のランダムの代わりに。どのようにして実際の乱数を入れることができますか?

答えて

1

文字列を保存してから印刷するだけです。なぜ文字列がそれらのものの1つに変わると期待していますか? とにかく、あなたはあなたの現在のスクリプトの同じ構造を使用して出力を得るために

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」から入力されたテキストのみを返すことになっています。あなたは上記の変数で何もしていません。これを試してください:あなたは、which_diceではない変数名を文字列値をキャプチャしている

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

。これを回避する簡単な方法は、ランダム値をハッシュに入れ、文字列値を名前で参照することです。

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]}" 

さらに、エラー処理を改善するために使用することもできます。

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

は、d7をロールしようとするとエラーメッセージが表示されます。

+0

ここにパターンがあることに注目してください。 http://stackoverflow.com/a/42520285/525478を参照してください。 –

+0

わかりません。私は彼のコードを再設計しようとしていませんでした。私はStackOverflowを初めて使っているので、これが間違っているかもしれませんか? –

+0

しかし、Ursusほどエレガントではなく、あなたのコードを再設計しました... –

関連する問題