2016-03-06 123 views
1

對於一個學校項目,我正在使用AI在Python中進行TicTacToe遊戲。現在我有點卡住了。所以我用這個代碼來檢查,如果有一個贏家:檢查三分之二是否等於

playField = [['.','.','.'],['.','.','.'],['.','.','.']] 
def checkWinner(L): 
    return ((playField[0][0] == L and playField[0][1] == L and playField[0][2] == L) or #Line 1 horizontal 
     (playField[1][0] == L and playField[1][1] == L and playField[1][2] == L) or #Line 2 horizontal 
     (playField[2][0] == L and playField[2][1] == L and playField[2][2] == L) or #Line 3 horizontal 
     (playField[0][0] == L and playField[1][0] == L and playField[2][0] == L) or #Colomn a vertical 
     (playField[0][1] == L and playField[1][1] == L and playField[2][2] == L) or #Colomn b vertical 
     (playField[0][2] == L and playField[1][2] == L and playField[2][2] == L) or #Colomn c vertical 
     (playField[0][0] == L and playField[1][1] == L and playField[2][2] == L) or #Diagonal left-top to right-bot 
     (playField[0][2] == L and playField[1][1] == L and playField[2][0] == L)) #Diagonal right-top to left-bot 

這是偉大的工作,但我的AI我要檢查,如果要不是他還有兩個行或「敵人」有兩個在一排。所以基本上我想檢查三個中的兩個是否等於'L',並且我不知道如何重寫該函數,或者使用另一種方法檢查三個中的兩個是否等於'L'。

幫助將是巨大的!

問候,吉榮

+0

請發佈一個最小化,完整,可驗證的示例[MCVE](http://stackoverflow.com/help/mcve) – MarkyPython

+0

編寫一個'check_row'函數,接收三個值並檢查三個中的兩個。然後爲8行中的每一行調用它。 – interjay

回答

1

給出一個列表foo = ['A', 'B', 'L', 'L'],你可以用foo.count('L')檢查的「L的數量。

+0

這將工作,如果每個posibble'三連勝'將是一個分開的名單,但基本上我必須檢查列表內的指標與彼此。這可能嗎? – Jeroen

+0

在這種情況下,我想你可以使用例如'[field [i] [0] for range in(3)]'列0來構造包含列的列表,並且調用'.count()' 。 – BingsF

2

板的行是

[playField[i] for i in range(3)] 

板的列是

[[playField[i][j] for i in range(3)] for j in range(3)] 

對角線是

[playField[i][i] for i in range(3)] 

[playField[2-i][i] for i in range(3)] (thanks, @volcano!) 

所以,你現在正在處理三列表(或三列表的列表)。


假設你有一個清單,如

a = [10, 20, 10] 

然後

sum(e == 10 for e in a) 

返回的項目數等於10;如果這個數字是2,那麼

sorted(enumerate(a), key=lambda (_, e): e == 10)[0][0] 

將給出(單個)項目的索引那不是10.


我覺得那些都是你需要的積木。

+0

另外_ [playField [2-i] [i]爲範圍(3)中的i] _ - 爲另一個對角線。 – volcano

+0

@volcano謝謝 - 絕對正確,錯過了那一個。 –

+0

感謝這有助於很多,所以我可以找到多少次'L'在第一次使用,但是什麼是返回不等於'L'的索引的好方法。例如: X。X 。 。 。 。 。 。 應該返回[0] [1]。 – Jeroen

相關問題