2016-11-30 44 views
-3

我試圖在我的tic-tac-toe程序中編寫一個函數,檢查網格中一行中的所有三個空格是否標記爲'x's'或'o's'。 lst_1是行的所有可能組合的列表:檢查嵌套列表中的字符串

def conc(): 
    global lst 
    lst_1 = [[lst[0],lst[1],lst[2]],[lst[3],lst[4],lst[5]],[lst[6],lst[7],lst[8]],[lst[0],lst[3],lst[6]],[lst[1],lst[4],lst[7]], [lst[2],lst[5],lst[8]],[lst[0],lst[4],lst[8]],[lst[2],lst[4],lst[6]], [lst[0],lst[1],lst[2]],[lst[3],lst[4],lst[5]],[lst[0],lst[3],lst[6]],  [lst[1],lst[4],lst[7]],[lst[2],lst[5],lst[8]],[lst[0],lst[4],lst[8]], [lst[2],lst[4],lst[6]]] 
    triplet = [s for s in lst_1] 
    if all('o' == item for item in triplet): 
     print('Player 2 wins!') 
     reply() 
    elif all('x' == item for item in triplet): 
     print('Player 1 wins!') 
     reply() 
    else: 
     pass 

我認爲這將停止比賽,當有人管理連續拿到3,但它一直在持續。有任何想法嗎?

+0

我想你在'lst_1'裏面有一些額外的數據,這些東西都搞亂了。 – TigerhawkT3

+0

你的'all()'調用也缺少一些關鍵部分。 – TigerhawkT3

+0

您的縮進已關閉,這在Python中非常重要。你的變量'triplet'好像和'lst_1'一樣。你不會告訴我們'reply()'是什麼或者做了什麼。請參閱[如何創建最小,完整和可驗證示例](http://stackoverflow.com/help/mcve)。 –

回答

1

要簡單回答你的問題,你不是遍歷lst_1。我想你認爲你是通過你使用的triplet的聲明,但實際上只是將lst_1複製到triplet

我假設你實際上是在試着用lst_1來生成一個生成器,並將它分配給triplet,但是你意外地使用了列表理解而不是完全理解生成器的工作方式。閱讀更多關於發電機here

雖然生成器對於某些情況無可否認是有用的,但我不認爲他們實際上會簡化您的代碼。無論如何,您將需要一個循環,並且您必須檢查StopIteration異常,以確定發生器何時結束。

所以,我的建議只是使用for循環。

def conc(): 
    global lst 
    lst_1 = [[lst[0],lst[1],lst[2]],[lst[3],lst[4],lst[5]],[lst[6],lst[7],lst[8]],[lst[0],lst[3],lst[6]],[lst[1],lst[4],lst[7]], [lst[2],lst[5],lst[8]],[lst[0],lst[4],lst[8]],[lst[2],lst[4],lst[6]], [lst[0],lst[1],lst[2]],[lst[3],lst[4],lst[5]],[lst[0],lst[3],lst[6]],  [lst[1],lst[4],lst[7]],[lst[2],lst[5],lst[8]],[lst[0],lst[4],lst[8]], [lst[2],lst[4],lst[6]]] 
    for triplet in lst_1: 
     if all('o' == item for item in triplet): 
      print('Player 2 wins!') 
      reply() 
      break 
     elif all('x' == item for item in triplet): 
      print('Player 1 wins!') 
      reply() 
      break 

其他一些尼特: 添加else: passif-elif-else循環結束完全是多餘的。它不必在那裏。

此外,儘量避免全局變量。在Python中閱讀一下關於範圍的內容。它可能適用於簡單的程序,但如果你在任何複雜的情況下依賴它們,它會傷害到你。

+0

謝謝@Dodosaur。爲什麼全球職能不受歡迎? – Boris

+0

[這](http://stackoverflow.com/questions/19158339/why-are-global-variables-evil)答案比我更能雄辯地解釋它。 – Dodosaur

+0

對不起,我輸入並提交。基本的要點是它使代碼難以理解,因爲如果一個函數使用全局變量,那麼函數的作用域之外就有一些影響它的東西。 – Dodosaur

相關問題