Python调试简单脚本

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_

因此,作为我为玩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_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和基本日。