我正在用 Ruby 構建一個井字游戲。為了確定是否有人贏得了比賽,我有一個二維陣列,check_array,包含您可以用來獲勝的所有可能集合。我想看看檢查陣列中的任何陣列是否都具有相同的元素。我的 javascript 大腦很難弄清楚如何在 Ruby 中執行此操作。沒有我的卷發來描繪塊,我很困惑。我理解這種語法:
if check_array.any? {|row|row.uniq.count == 1}
@winner = @whos_turn
winning
end
但是,如果我需要為我的 any 使用多于一行的邏輯呢?邏輯。它看起來像這樣嗎?
if check_array.any? do |row|
row.uniq.count == 1
<<some more code>>
end
@winner = @whos_turn
winning
end
uj5u.com熱心網友回復:
只需使用一個單獨的變數。
match = check_array.any? do |row|
row.uniq.count == 1
<<some more code>>
end
if match
@winner = @whos_turn
winning
end
或者,甚至更好,
def my_check(row)
row.uniq.count == 1
<<some more code>>
end
if check_array.any? { |x| my_check(x) }
@winner = @whos_turn
winning
end
我不知道建議的嵌套do .. end語法是否有效,但我不知道這一事實向我表明它不是很直觀,應該重構。
uj5u.com熱心網友回復:
不管你怎么做,你當然不必擔心代碼的效率。因此,我建議您專注于可讀且易于測驗的代碼,也許是以下幾行。
認為:
game = [[:X, :O, :X],
[:O, :X, :O],
[:O, :X, :X]]
def winner(game)
return :X if player_win?(game, :X)
return :O if player_win?(game, :O)
return :NO_WINNER
end
def player_win?(game, mark)
row_win?(game, mark) || col_win?(game, mark) || diag_win?(game, mark)
end
def row_win?(game, mark)
game.any? { |row| row == [mark, mark, mark] }
end
def col_win?(game, mark)
row_win?(game.transpose, mark)
end
def diag_win?(game, mark)
3.times.all? { |i| game[i][i] == mark } ||
3.times.all? { |i| game[i,2-i] == mark }
end
對于game如上定義,
winner(game)
#=> :X
game = [[:X, :O, :X],
[:O, :O, :O],
[:X, :X, :_]]
winner(game)
#=> :O
game = [[:X, :O, :X],
[:O, :O, :X],
[:X, :X, :O]]
winner(game)
#=> :NO_WINNER
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/368771.html
