0

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

このコードをより適切に記述し、バグをなくす方法についてのアドバイスをいただければ幸いです。

4

1 に答える 1