Python调试简单脚本

时间:2016-11-18 22:02:14

标签: python

因此,作为脚本的一部分,我正在编写tic tac toe,我有一个'win checker'作为输入:

  1. 表示职位的数字列表
  2. 谁开始游戏
  3. 这对我遇到的问题并不重要,但我认为一些背景可能有所帮助。这是代码:

    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
    

    我不明白为什么输出是真的,如果有人能解释我错过了哪些对我很有帮助

3 个答案:

答案 0 :(得分:3)

问题详情:

运算符仅适用于布尔值。它分布在 in 运算符上(还记得乘法的乘法分布规律吗?)。你的表达

1 and 2 and 3 in win_list1

变为

bool(1) and bool(2) and bool (3 in win_list1)
对于n = 0,

bool(n)为 False ,对于其他所有内容,为真

立即修复:

Alex Hall已经给了你那个

更好的修复(也许):

将您的选择数组重新编号为魔方:

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:
对于任何整数,

True 。百分号是模数运算符:除以mod并保留余数。简而言之,第二个总是如此。只需将其设为其他

另一个......

为什么不将 win_list 列为二维列表?使用win_list [0]和win_list [1],这样就可以将代码折叠起来了。你可以简单地拥有

player = bud % 2
win_list[player].append(position_list[bud])
if any(sum(itertools.combinations(win_list[player], 3)) == 15):
    ...

答案 1 :(得分:1)

if 1 and 5 and 9 in win_list2:

应该是:

if 1 in win_list2 and 5 in win_list2 and 9 in win_list2:

答案 2 :(得分:0)

在python中

>> 1 and 2 and 3 in win_list1

评估为

>> 3 in win_list1

这是真的