。不会迭代嵌套数组

问题描述 投票:0回答:3

出于某种原因,这不是迭代集合。在那里投掷撬显示只有第一个索引被查看。 [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
ruby each
3个回答
5
投票
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

4
投票

原因是您在第一次迭代时从您的方法返回。 在迭代中,您总是在第一步之后返回。只需在迭代后输入return false语句即可。


1
投票

还有三个解决方案以及测试代码相互检查它们:

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
}
© www.soinside.com 2019 - 2024. All rights reserved.