.each 不遍历嵌套数组

.each not iterating over nested arrays

出于某种原因,这不是遍历集合。在那里扔一个撬表明只有第一个索引正在被查看。 [0,1,2]我确定我只是累了而且有点小,但我在这里画了一个黑色,

WIN_COMBINATIONS = [
  [0, 1, 2],
  [3, 4, 5],
  [6, 7, 8],
  [0, 3, 6],
  [1, 4, 7],
  [2, 5, 8],
  [0, 4, 8],
  [2, 4, 6]
]

def won?(board)
  WIN_COMBINATIONS.each do |combo|
    if board[combo[0]] != " " && board[combo[0]] == board[combo[1]] && board[combo[0]] == board[combo[2]]
      return combo
    else
      return false
    end
  end
end

原因是您 return 在第一次迭代时使用了您的方法。
在你的迭代中,你总是在第一步之后 return 。只需在迭代后放置 return false 语句即可。

def won?(board)
  WIN_COMBINATIONS.any? do |combo|
    board[combo[0]] != " " &&
      board[combo[0]] == board[combo[1]] &&
      board[combo[0]] == board[combo[2]]
  end
end

或者,更简洁 Array#values_at:

def won?(board)
  WIN_COMBINATIONS.any? do |combo|
    [%w|X| * 3, %w|O| * 3].include? board.values_at(*combo)
  end
end

另外三个解决方案以及相互检查它们的测试代码:

def won1?(board)
  WIN_COMBINATIONS.any? do |i, j, k|
    board[i] != " " && board[i] == board[j] && board[i] == board[k]
  end
end

def won2?(board)
  WIN_COMBINATIONS.any? do |combo|
    a, b = board.values_at(*combo).minmax; a != " " && a == b
  end
end

def won3?(board)
  WIN_COMBINATIONS.any? do |combo|
    [["X"], ["O"]].member?(board.values_at(*combo).uniq)
  end
end

WIN_COMBINATIONS = [
  [0, 1, 2],
  [3, 4, 5],
  [6, 7, 8],
  [0, 3, 6],
  [1, 4, 7],
  [2, 5, 8],
  [0, 4, 8],
  [2, 4, 6]
]

a = ["O", "X", " "]
a.product(*([a] * 8)).each { |board|
  w1 = won1?(board)
  w2 = won2?(board)
  w3 = won3?(board)
  p [w1, w2, w3, board] if w2 != w1 || w3 != w1
}