2016-11-30 82 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