Ruby 如何在包含5个元素的数组中查找4的序列&;修正输入错误

Ruby 如何在包含5个元素的数组中查找4的序列&;修正输入错误,ruby,arrays,Ruby,Arrays,我为Ruby小测验19制作了一个Yahtzee游戏。我已经启动并运行了游戏,但是有两个bug 当玩家选择使用一个>=3的骰子作为“小直”(4个骰子的序列)来“刮”(分数为零)时,该部分发生错误。下面是小直道的代码: 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) &

我为Ruby小测验19制作了一个Yahtzee游戏。我已经启动并运行了游戏,但是有两个bug

当玩家选择使用一个>=3的骰子作为“小直”(4个骰子的序列)来“刮”(分数为零)时,该部分发生错误。下面是小直道的代码:

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:nil的未定义方法
-'
来自Yahtzee_测试。rb:209:in
在sm_直线中的块'

第209行是“if语句”行

当玩家错误地输入了要保留的骰子时。我正试图找出一个更好的方法来询问玩家如何输入骰子以保持或捕捉错误,并让他们在当前系统中重新输入数字。这是代码“

def roll\u再次
放置“你想从这一卷中保留哪一个骰子?”?(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}
@掷骰=新掷骰+掷骰子
p@roll
@滚动计数+=1
放上“那是卷数{@roll\u count},你还有{3-@roll\u count}”
如果@roll_计数<3
再来一卷?
其他的
截面(@roll)
结束
结束

如果您对如何更好地编写此代码并使其无bug有任何建议,我们将不胜感激!

要检查5个骰子中是否有4个骰子,您可以替换:

@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)}
为此:

if has_straight(roll, 4)
并定义
具有以下特性:

def has_straight( roll, need )
  num = 1
  roll = roll.sort.uniq

  roll.each_with_index do |e, i|
    if i < roll.length-1 then
      if (roll[i+1] - roll[i]) > 1 then
        break if num >= need
        num = 1
      end

      num += 1
    end
  end

  num >= need
end
def有_直(滚动,需要)
num=1
roll=roll.sort.uniq
用索引do | e,i滚动每个|
如果我1,则
如果num>=需要,则中断
num=1
结束
num+=1
结束
结束
num>=需要
结束

可能有一个稍微聪明一点的Ruby ism可以做到这一点,但它修复了数组超出边界的问题。

发生了什么错误?是错误消息还是给出了错误的结果?您能具体说明发生了什么吗?我马上看到的一个问题是,如果您只有3或4个骰子,那么您的
(0..1)。任何?..
语句都将尝试在定义的值之外处理
@roll
数组。此外,如果一个小直道是4个骰子的序列,那么肯定会有3个骰子失败。我已经编辑了,所以错误被包括在内,谢谢。哪一行是209?请参阅我之前对可能的错误情况的评论。209是if语句行,这就是我的我回答说:)我得到了一个假卷“[2,2,3,4,5]”
def has_straight( roll, need )
  num = 1
  roll = roll.sort.uniq

  roll.each_with_index do |e, i|
    if i < roll.length-1 then
      if (roll[i+1] - roll[i]) > 1 then
        break if num >= need
        num = 1
      end

      num += 1
    end
  end

  num >= need
end