2016-12-29 57 views
0

基本上,我正在創建一個遊戲:Connect 4.我希望AI能夠在水平和垂直方向上檢查用戶是否每次移動都會贏。實際情況是,它一次只能執行一次支票,因爲無論如何都不能一次執行兩次。是否可以遍歷存儲在元組中的函數列表?

所以,我創建了2個檢查函數。一個用於水平檢查,一個用於垂直檢查。即:

假設玩家計數器'X'和AI計數器'O'

def horizonal_check(): 
    if 'XXX'= True: 
     AI='XXXO' 

的,如果我在實際遊戲中的語句是更復雜,這一點,但在本質上,這是它檢查然後允許AI把自己的櫃檯放在適當的地方,阻止我獲勝。

def vertical_check(): 
    if 'XXX' = True: 
     AI = 'XXXO' 

這實現了相同的策略與上述功能,但唯一的區別是,它檢查的3個計數器中的行,而不是水平組合的垂直組合。

所以我真正想要做的就是將這2個檢查函數存儲在一個元組中,然後使用for循環遍歷每個元組。這確保一次只運行一個檢查。這裏是我的循環:

Checks = (horizontal_check(), vertical_check()) # Checks stored in a tuple 

for c in Checks: 
    return c 

我想這個通過在同一時間在一個元組每一個人支票迴路循環。但它似乎並不奏效。人工智能什麼也不做

+1

你不應該調用的元組中的功能,但是當你把它弄出來:'C()' – trincot

+0

它給了我一個錯誤,當我這樣做:類型錯誤:「NoneType」對象不是可調用 –

回答

3

當前創建包含您的兩個函數調用,NoneNone返回值的元組,而不是函數本身。

添加的功能:

Checks = (horizontal_check, vertical_check) # Checks stored in a tuple 

,然後打電話給他們:

for c in Checks: 
    c() 

此外,我懷疑這是一個無足輕重的例子,但仍:

  • 你函數名不匹配。
  • 'XXX' = True是不允許的(至少在if),應該是'XXX' == True
  • return in for loop:這是一個禁忌。
+0

當我這樣做時,它給了我這個錯誤:TypeError:'NoneType'對象不可調用 –

+0

不要使用'Checks =(horizo​​ntal_check(),vertical_check())';你正在調用函數。使用'Checks =(horizo​​ntal_check,vertical_check)'(*沒有括號 - 即調用*) –

+1

@PercyShey你會得到這個錯誤,因爲在Checks中你調用的是函數而不是引用它們。你的函數沒有有效的回調函數,所以當你調用它們時,它們會返回一個'None-Type'對象。你的for循環基本上循環了兩個'None-Type'對象的元組。 – maviz

0

其很難說,但我猜你分別需要這個

Checks = (horizontal_check, vertical_check) # do not call the function here... 

return any(c() for c in Checks) #call it as you loop through ... 
+0

我想它表明了球員的勝利舉動......所以任何獲勝的舉動都應該短路並通知AI這種遊戲狀態會導致損失......至少這是我的解釋 –

相關問題