2015-10-16 26 views
-2

我試圖在紅寶石中實現Tic-Tac-Toe遊戲。我有笛卡爾座標(0 < x < = 3,0 < y < = 3)。如何檢查該行中的點?

x|x|x 
- - - 
x|x|x 
- - - 
x|x|x 

在上面x表的地方是在哪裏可以放置一個或x符號o。我怎樣才能檢查一些跡象的集合是否組成直線?

+1

定義「集合幾個標誌「。 – sawa

+0

請注意,任何兩個職位將組織一條直線。沒有四個職位將組織一條直線。如果收集一個單一的符號,你會認爲這是一個直線組織一條直線,或未定義? – sawa

回答

0

假設的結果看起來像這樣在紙上:

x o o 
x o x 
o x o 

,你想知道是否有一個勝利者,如果是的話,誰贏了。該繪圖可以由陣列來表示:

toe = [[:x, :o, :o], [:x, :o, :x], [:o, :x, :o]] 

(我可以使用字符串'x''o',但使用的符號是更有效和節省擊鍵我也使用01truefalse,但有這樣做沒有任何優勢)

讓我們定義一個方法返回: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)是返回truefalse,取決於播放機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