出于某种原因,这不是在集合上迭代。在那里投掷撬显示只有第一个索引被查看。 [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
答案 0 :(得分: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
答案 1 :(得分:4)
原因是你在第一次迭代时从你的方法返回 在迭代中,您总是在第一步之后返回。只需在迭代后输入return false语句即可。
答案 2 :(得分: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
}