Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 这有什么原因吗?isn';工作不正常吗?_Ruby_Tic Tac Toe - Fatal编程技术网

Ruby 这有什么原因吗?isn';工作不正常吗?

Ruby 这有什么原因吗?isn';工作不正常吗?,ruby,tic-tac-toe,Ruby,Tic Tac Toe,所以,我试图让这段代码运行,其中WIN_combines是一个嵌套数组,其中包含数组板上tic-tac-toe的获胜组合。我想我可以使用.all?方法返回最先得分的组合,但由于某些原因,它一直失败,如下所示: 需要一个可以转换为带有“#to_ary”的数组的集合 或“到” 完全被难住了!!任何帮助都将不胜感激。您的代码有两个主要问题: def won? WIN_COMBINATIONS.each do |wins| if wins.all?{|win_nu

所以,我试图让这段代码运行,其中
WIN_combines
是一个嵌套数组,其中包含数组板上tic-tac-toe的获胜组合。我想我可以使用
.all?
方法返回最先得分的组合,但由于某些原因,它一直失败,如下所示:

需要一个可以转换为带有“#to_ary”的数组的集合 或“到”


完全被难住了!!任何帮助都将不胜感激。

您的代码有两个主要问题:

def won?
        WIN_COMBINATIONS.each do |wins|
            if wins.all?{|win_nums| @board[win_nums] = "X"}
                wins
            elsif wins.all?{|win_nums| @board[win_nums] = "O"}
                wins
            end
        end
        false
    end
  • 您使用
    @board[win\u nums]=…
    ,这是分配–您需要
    =
    ,即比较
  • 您只返回
    false
    ,因此即使满足条件,也不会返回相应的
    wins
    组合
  • 要修复代码,请执行以下操作:

    def won?
            WIN_COMBINATIONS.each do |wins|
                if wins.all?{|win_nums| @board[win_nums] = "X"}
                    wins
                elsif wins.all?{|win_nums| @board[win_nums] = "O"}
                    wins
                end
            end
            false
        end
    
    与分别从
    @board
    获取
    wins
    中的每个值不同,您可以使用一次获取所有3个值:

    def won?
      WIN_COMBINATIONS.each do |wins|
        if wins.all? { |win_nums| @board[win_nums] == "X" }
          return wins
        elsif wins.all? { |win_nums| @board[win_nums] == "O" }
          return wins
        end
      end
      false
    end
    
    如果您想知道splash操作符
    *
    –它将
    wins
    数组转换为参数列表,以便
    value_at(*[0,1,2])
    变成
    value_at(0,1,2)

    通过将
    值u at
    的结果存储在变量中,我们可以从上述代码中删除一些重复项。我们还可以使用
    |
    组合这两个条件:

    def won?
      WIN_COMBINATIONS.each do |wins|
        if @board.values_at(*wins).all?('X')
          return wins
        elsif @board.values_at(*wins).all?('O')
          return wins
        end
      end
      false
    end
    
    最后,还有一个为我们处理
    返回逻辑的方法:

    def won?
      WIN_COMBINATIONS.each do |wins|
        values = @board.values_at(*wins) 
        return wins if values.all?('X') || values.all?('O')
      end
      false
    end
    

    请注意,
    find
    返回
    nil
    而不是
    false
    以表示“不匹配”,但由于两者都是假的,所以这不应该是问题。

    您想要
    任何?
    而不是
    所有?
    ?请编辑以显示
    赢的组合
    (或者是
    赢的组合
    )。嘿,你确定你想要@board[win\u nums]=“X”而不是@board[win\u nums]=“X”,这是所有人的文档吗?也许这也有帮助:你可能还想要
    返回wins
    ,而不仅仅是
    wins
    ——否则你的方法将始终返回
    false
    。另一个选项是
    win\u组合。查找{…}
    查找与您的条件匹配的第一个组合。请尝试以下操作:
    def-won?;WIN\u组合。任何?{{WIN |['X','O']。包括?(WIN.map{{cell |@board[cell]}.uniq)};end
    “持续失败”不是一个足够精确的错误描述,我们无法帮助您。什么不起作用?它如何起作用?您的代码有什么问题?您是否收到错误消息?错误消息是什么?您得到的结果是否不是您期望的结果?您期望的结果是什么?为什么,您得到的结果是什么,以及如何处理两种不同?你观察到的行为不是期望的行为吗?期望的行为是什么,为什么,观察到的行为是什么,它们有什么不同?感谢你花时间教育我Stefan,这真的很有帮助!