-2
我試圖在紅寶石中實現Tic-Tac-Toe遊戲。我有笛卡爾座標(0 < x < = 3,0 < y < = 3)。如何檢查該行中的點?
x|x|x
- - -
x|x|x
- - -
x|x|x
在上面x
表的地方是在哪裏可以放置一個或x
符號o
。我怎樣才能檢查一些跡象的集合是否組成直線?
我試圖在紅寶石中實現Tic-Tac-Toe遊戲。我有笛卡爾座標(0 < x < = 3,0 < y < = 3)。如何檢查該行中的點?
x|x|x
- - -
x|x|x
- - -
x|x|x
在上面x
表的地方是在哪裏可以放置一個或x
符號o
。我怎樣才能檢查一些跡象的集合是否組成直線?
假設的結果看起來像這樣在紙上:
x o o
x o x
o x o
,你想知道是否有一個勝利者,如果是的話,誰贏了。該繪圖可以由陣列來表示:
toe = [[:x, :o, :o], [:x, :o, :x], [:o, :x, :o]]
(我可以使用字符串'x'
和'o'
,但使用的符號是更有效和節省擊鍵我也使用0
和1
或true
和false
,但有這樣做沒有任何優勢)
讓我們定義一個方法返回:x
如果x
勝:o
如果o
勝或:no_winner
如果沒有贏家:
def winner?(toe)
return :x if player_wins?(toe, :x)
return :o if player_wins?(toe, :o)
:no_winner
end
其中player_wins?(toe, p)
是返回true
或false
,取決於播放機p
(:x
或:o
)是否贏得的方法。要編寫該方法,我們可以使用以下幫助程序方法(您可以單獨測試)。
對於玩家p
是否有任何行優勝者?
def row_win?(toe, p)
toe.any? { |row| row.uniq == p }
end
是對玩家p
主對角線贏家?
def diag_win?(toe, p)
3.times.all? { |i| toe[i][i] == p }
end
是對玩家p
非對角線的贏家?
def off_diag_win?(toe, p)
3.times.all? { |i| toe[2-i][i] == p }
end
有了這些幫助,我們可以寫player_wins?
爲folows:
def player_wins?(toe, p)
row_win?(toe, p) ||
row_win?(toe.transpose, p) ||
diag_win?(toe, p) ||
off_diag_win?(toe, p)
end
讓我們試一下:
winner?(toe)
#=> :o
又如:
winner? [[:x, :o, :o], [:o, :o, :x], [:x, :x, :o]]
#=> :no_winner
定義「集合幾個標誌「。 – sawa
請注意,任何兩個職位將組織一條直線。沒有四個職位將組織一條直線。如果收集一個單一的符號,你會認爲這是一個直線組織一條直線,或未定義? – sawa