出于某种原因,这不是迭代集合。在那里投掷撬显示只有第一个索引被查看。 [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
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
原因是您在第一次迭代时从您的方法返回。 在迭代中,您总是在第一步之后返回。只需在迭代后输入return false语句即可。
还有三个解决方案以及测试代码相互检查它们:
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
}