'X' || 'O'
просто говорит X или O. И поскольку любая строка правдива, она всегда возвращает X. Поэтому в любом месте, где вы сказали [('X' || 'O')]
, вы действительно просто сказали ['X']
.
Из-за этого вы всегда проверяете, является ли вся строка из 3 всей X.
Я не совсем понимаю, как вы пытаетесь это проверить, но я чувствую,как будто вам лучше запустить функцию дважды, сначала вручив X, а затем вручив O, если он не нашел X в качестве победителя, в отличие от попытки проверить оба сразу.
В качестве альтернативы вы могли бывместо этого сделайте так, чтобы функция возвращала 'X', 'O' или nil, и тогда вы могли бы запустить ее только один раз.Возвращенная строка будет тем, кто выиграл, и если она равна нулю, никто не выиграл.Я также рекомендовал бы сделать цикл для этого.Мне легче читать.
Вот как я бы решил эту проблему.
ROWS = [
[1,2,3],
[4,5,6],
[7,8,9],
[1,4,7],
[2,5,8],
[3,6,9],
[1,5,9],
[7,5,3],
]
def find_winner(board)
ROWS.each do |row|
# subtract 1 because the ROWS is 1-indexed (like a phone dial) but arrays are 0-indexed
row_values = row.map { |v| board[v - 1] }
return('X') if row_values.all?('X')
return('O') if row_values.all?('O')
end
return(nil)
end
test1 = [
'X', 'X', 'X',
'O', 'X', 'O',
'O', 'O', '',
]
puts "Winner of test1: #{find_winner(test1).inspect}"
"X"
test2 = [
'X', '', 'X',
'X', 'O', 'O',
'X', 'O', 'X',
]
puts "Winner of test2: #{find_winner(test2).inspect}"
"X"
test3 = [
'O', 'X', 'X',
'O', 'X', 'O',
'O', 'O', '',
]
puts "Winner of test3: #{find_winner(test3).inspect}"
"O"
test4 = [
'O', 'X', 'O',
'X', 'O', 'X',
'O', 'O', 'X',
]
puts "Winner of test4: #{find_winner(test4).inspect}"
"O"
test5 = [
'O', 'X', 'O',
'O', 'X', 'O',
'X', 'O', 'X',
]
puts "Winner of test5: #{find_winner(test5).inspect}"
nil