2016-11-18 67 views
-1

因此,作为一个剧本我写玩井字游戏的一部分,我有一个“双赢检查”,这作为它的输入:的Python调试简单的脚本

  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 

我不明白为什么输出为True,如果有人能解释我缺少什么这将是对我很大的帮助

+0

请参阅在http://stackoverflow.com/help/mcve准则 - 围绕代码一个很好的问题将包含** **最小的,完整的,可核查的例子 - 这意味着尽可能小的代码量将会产生相同的问题。在这种情况下,这可能只是一条包含单个“if”条件的行,您认为该条件不应该返回True,但实际上却是这样做的。 –

回答

3

详细的问题:

操作符只布尔值。它确实而不是分配在算子(还记得加法的分配规律吗?)。你表达

1 and 2 and 3 in win_list1 

成为

bool(1) and bool(2) and bool (3 in win_list1) 

布尔(n)是对于n = 0,其他一切


立即修复:

亚历克斯·霍尔已经给了你,

更好的修复(也许):

重新编号,您的选择,阵列是一个幻方:

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: 

任何整数。百分号是模数运算符:除以mod并保留余数。总之,第二个总是如此。只要让它成为其他

另一个...

为什么不把win_list 2-d列表?使用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): 
    ... 
+0

哇,这个答案真的很有帮助,谢谢。在阅读之前,我已经注意到了bud%1错误,但是magic square上的内容以及布尔值的工作方式非常有用。 – mrnovice

+0

你很受欢迎。这就是为什么存在 - 互相支持。魔术方块戏是我在大学中选择的一个,回到我的FORTRAN!V和BASIC时代。 – Prune

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: 
0

在蟒蛇

>> 1 and 2 and 3 in win_list1 

被评估为

>> 3 in win_list1 

这是真的

+0

更明确地说,它被评估为bool(1)和bool(2)和bool(3在win_list1中)。由于前两个是** True **,所以这会降低到第三个值。 – Prune