Ruby Quiz #19 用に Yahtzee ゲームを作成しました。ゲームを起動して実行していますが、2 つのバグがあります。
プレーヤーが、そのセクションを「スクラッチ」する (0 としてスコアを付ける) ために「スモール ストレート」(4 つのサイコロのシーケンス) として 3 つ以上のロールを使用することを選択すると、エラーが発生します。スモール ストレートのコードは次のとおりです。
def sm_straight
@roll = @roll.sort.uniq
if (0..1).any? {|x| (@roll[x+3] - @roll[x+2] == 1) && (@roll[x+2] - @roll[x+1] == 1) && (@roll[x+1] - @roll[x] == 1)}
@scorecard["sm. straight"] = 30
else
puts "Your roll is not a sm. straight! Please select another section or type scratch to score 0 for this section."
scratch = gets.chomp
if scratch == "scratch"
@scorecard["sm. straight"] = "scratch"
elsif @scorecard.has_key?(scratch)
@turn -= 1
section_to_score(scratch)
else
sm_straight
end
end
end
これはエラーです:
NoMethodError: sm_straight の未定義のメソッド
-' for nil:NilClass from Yahtzee_test.rb:209:in
ブロック'
行 209 は「if ステートメント」行です。
プレーヤーが保持するサイコロを誤って入力したとき。サイコロを入力してエラーを保持またはキャッチし、現在のシステムで数字を再入力する方法をプレーヤーに尋ねるより良い方法を見つけようとしています。これがコードです」
def roll_again
puts "Which dice would you like to keep from this roll? (1, 2, 3, 4, 5)"
dice_to_keep = gets.chomp.split(',').map {|x| (x.to_i) - 1}.map {|x| @roll[x]}
new_roll = Array.new(5 - dice_to_keep.size) {rand(6) + 1}
@roll = new_roll + dice_to_keep
p @roll
@roll_count += 1
puts "That was roll number #{@roll_count}, you have #{3-@roll_count} remaining."
if @roll_count < 3
more_rolls?
else
section(@roll)
end
end
このコードをより適切に記述し、バグをなくす方法についてのアドバイスをいただければ幸いです。