Python调试简单脚本
因此,作为我为玩tic-tac-toe而编写的脚本的一部分,我有一个“win checker”,它将以下内容作为输入:Python调试简单脚本,python,Python,因此,作为我为玩tic-tac-toe而编写的脚本的一部分,我有一个“win checker”,它将以下内容作为输入: 表示位置的数字列表 比赛是谁开始的 这对我遇到的问题并不重要,但我认为一些背景知识可能会有所帮助。代码如下: import matplotlib.pyplot as plt import math import numpy as np import random import pdb def win_checker(position_list, turn2): win_
import matplotlib.pyplot as plt
import math
import numpy as np
import random
import pdb
def win_checker(position_list, turn2):
win_list1 = []
win_list2 = []
for bud in xrange(len(position_list)):
if bud % 2 == 0:
win_list1.append(position_list[bud])
print win_list1
if 1 and 2 and 3 in win_list1:
return True
if 4 and 5 and 6 in win_list1:
return True
if 7 and 8 and 9 in win_list1:
return True
if 1 and 4 and 7 in win_list1:
return True
if 2 and 5 and 8 in win_list1:
return True
if 3 and 6 and 9 in win_list1:
return True
if 1 and 5 and 9 in win_list1:
return True
if 3 and 5 and 7 in win_list1:
return True
elif bud % 1 == 0:
win_list2.append(position_list[bud])
print win_list2
if 1 and 2 and 3 in win_list2:
return True
if 4 and 5 and 6 in win_list2:
return True
if 7 and 8 and 9 in win_list2:
return True
if 1 and 4 and 7 in win_list2:
return True
if 2 and 5 and 8 in win_list2:
return True
if 3 and 6 and 9 in win_list2:
return True
if 1 and 5 and 9 in win_list2:
return True
if 3 and 5 and 7 in win_list2:
return True
else:
return False
然后,当我为某个位置尝试脚本时:
win_checker([5,1,3,2], 1)
[5]
[1]
[5, 3]
Out[57]: True
我不明白为什么这个结果是真的,如果有人能解释我遗漏了什么,那对我会很有帮助
if 1 and 5 and 9 in win_list2:
应该是:
if 1 in win_list2 and 5 in win_list2 and 9 in win_list2:
用python
>> 1 and 2 and 3 in win_list1
被评估为
>> 3 in win_list1
这是正确的问题的详细信息: 和运算符仅适用于布尔值。它不分布在运算符中的上(还记得乘法与加法的分布定律吗?)。你的表情
1 and 2 and 3 in win_list1
变成
bool(1) and bool(2) and bool (3 in win_list1)
bool(n)对于n=0为False,对于其他所有项为True
即时修复: 亚历克斯·霍尔已经给你了 更好的修复(可能): 将您的选择数组重新编号为幻方:
6 7 2
1 5 9
8 3 4
现在,你所要做的就是检查你是否有一个15的总和用于三个选择的位置的任意组合。您可以使用
itertools.combinations(win_list1, 3)
这将使您的检查从18行减少到1行(或者2-4行,如果您喜欢可读性的话)
额外发行: 你对巴德的逻辑有点奇怪。我确实理解车次上的奇数/偶数检查:
if bud % 2 == 0:
但是第二个,
elif bud % 1 == 0:
对于任何整数均为真。百分号是模运算符:除以模并保留余数。简言之,第二个总是正确的。只要把它变成一个其他
另一个…
为什么不制作一个二维列表?使用win_列表[0]和win_列表[1],可以将它们的代码折叠在一起。你只需要
player = bud % 2
win_list[player].append(position_list[bud])
if any(sum(itertools.combinations(win_list[player], 3)) == 15):
...
更具体地说,它在win_列表1中被评估为bool(1)、bool(2)和bool(3)。由于前两个都是真的,这就减少到了第三个值。请参见中的指导原则——一个关于代码的好问题将包含一个最小的、完整的、可验证的示例——这意味着产生相同问题的代码量尽可能少。在这种情况下,可能只有一行带有单个
if
条件,您认为该条件不应该返回True,但事实上确实返回了True。哇,这个答案非常有用,谢谢。在阅读之前,我已经注意到bud%1错误,但是有关幻方和布尔值的工作原理的内容非常有用。非常欢迎您。这就是为什么如此存在——相互支持。魔方把戏是我在大学里学会的,用我的FORTRAN语言!V和基本日。