我正在尝试在我的tic-tac-toe程序中编写一个函数,该程序检查网格中一行中的所有三个空格是否都标记为'x'或'o'。 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 :(得分: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: pass
添加到if-elif-else
循环的末尾是完全无关紧要的。它不一定在那里。
另外,尽量避免全局变量。在Python中阅读一些关于范围的内容。它可能适用于简单的程序,但是当你遇到任何远程复杂的东西时它依赖它们会对你造成伤害。