这是一款井字游戏。我有一个包含九个字符串元素的数组 board
,以及一个包含来自 board
的位置组合的嵌套数组 WIN_COMBINATIONS
:
board = ["X", "X", "X", " ", " ", " ", " ", " ", " "]
WIN_COMBINATIONS = [
[0, 1, 2],
[0, 3, 6],
[0, 4, 8],
[3, 4, 5],
[6, 7, 8],
[6, 4, 2],
[1, 4, 7],
[2, 5, 8]
]
如何使用 board
中的组合选择全是 "X"
或全是 "O"
的数组组合 WIN_COMBINATIONS
?
例如 与上面的棋盘不同,其中 X 在右对角线上获胜。
board = ["X", "O", "X", "O", "X", "O", "X", "X", "O"]
# X | O | X
# ---+---+---
# O | X | O
# ---+---+---
# X | X | O
won?(board) #=> [2,4,6]
最佳答案
ndn's answer 的细微变化:
board = %w(X O X
O X O
X X O)
WIN_COMBINATIONS.select { |c| board.values_at(*c).join =~ /XXX|OOO/ }
#=> [[6, 4, 2]]
解释:
select
返回 block 返回true
的所有元素。values_at
返回指定索引处的值:board.values_at(*[0, 1, 2]) #=> ["X", "O", "X"]
*
将数组转换为参数列表,所以上面变成了values_at(0, 1, 2)
join
返回包含连接元素的字符串:["X", "O", "X"].join #=> "XOX"
=~
检查字符串是否与 regular expression 匹配/XXX|OOO/
,即XXX
或OOO
您可以将 select
替换为 find
如果您只想检索第一个获胜组合。
关于arrays - 检查一个数组中的所有字符串是否都在另一个数组中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34717897/