2016-10-03 28 views
1

我在Ruby中製作了Tic-Tac-Toe遊戲。下面的方法檢查垂直列中的勝者。如何使一般方法檢查Tic-Tac-Toe中的獲勝者

我該怎麼做才能使這種方法適用於不同尺寸的板子,比如4x4,6x6?

def vertical_check(array) 

    result = nil 

    if (array[0][0] == "X" && array[1][0] == "X" && array[2][0] == "X") || 
    (array[0][1] == "X" && array[1][1] == "X" && array[2][1] == "X") || 
    (array[0][2] == "X" && array[1][2] == "X" && array[2][2] == "X") 

    result = "X" 

    elsif (array[0][0] == "O" && array[1][0] == "O" && array[2][0] == "O") || 
    (array[0][1] == "O" && array[1][1] == "O" && array[2][1] == "O") || 
    (array[0][2] == "O" && array[1][2] == "O" && array[2][2] == "O") 

    result = "O" 
    else 
    result = nil 
    end 
    return result 
end 

下面是一個失敗的嘗試:

def vertical_check_x(array) 

    result = nil 

    index = 0 
    index2 = 0 

    until result != nil || index == array.length 

    while array[index][index2] == "X" 
     index += 1 
    end 

    if index == array.length 
     result = "X" 
    else 
     result = nil 
     index = array.length 
    end 

    index2 += 1 
    end 

    return result 
end 

def vertical_check_o(array) 

    result = nil 

    index = 0 
    index2 = 0 
    until result != nil || index == array.length 

    while array[index][index2] == "O" 
     index += 1 
    end 

    if index -1 == array.length 
     result = "O" 
    else 
     result = nil 
     index = array.length 
    end 

    index2 += 1 
    end 

    return result 
end 

def vertical_check(array) 

    result = vertical_check_x(array) 

    if result == nil 
    result = vertical_check_o(array) 
    end 

    return result 
end 
+0

你注意到數組下標的模式嗎? – code11

+0

http://stackoverflow.com/questions/18548265/testing-tic-tac-toe-win-condition – zaingz

+0

您的代碼格式化需要幫助。請儘量爲可讀性設置問題格式。它不僅幫助我們回答你,而且幫助那些未來尋找類似解決方案的人,這是SO的主要目標。 –

回答

4

要快速找到給定數組贏家,計數獨特元素的數量,確認只有一個獨特的元素,如果只是XO

def winner arr 
    return arr[0] if arr.uniq.length == 1 && ['X', 'O'].include?(arr[0]) 
    nil 
end 

接下來的問題是選擇的行,列和對角線爲nxn陣列。

行很簡單:

rows = arr.map {|row| row} 

列如下 - 你選擇與每一行相同的索引元素:

cols = n.times.collect {|i| arr.map {|row| row[i]}} 

下一步是對角線。有兩個對角線,一個從最左角開始,另一個從最右側開始。

最左邊對角線具有序列:

(0, 0) -> (1, 1) -> (2, 2) .... 

看到這個模式?

diag = n.times.collect {|i| arr[i][i]} 

最右邊對角線具有圖案是這樣的(一個3×3):

(0, 2) -> (1, 1) -> (2, 0) 

對於一個4x4的,是這樣的:

(0, 3) -> (1, 2) -> (2, 1) -> (3, 0) 

所以,對於一個模式nxn是:

(0, n-1-0) -> (1, n-1-1) -> (2, n-1-2) -> ... (i, n-1-i) ... -> (n-1, 0) 

所以:現在

diag = n.times.collect {|i| arr[i][n - 1 - i]} 

,你可以這樣做:

w = rows.map {|r| winner r}.compact[0] 

爲每個陣列來獲得冠軍。