因此,作为脚本的一部分,我正在编写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
我不明白为什么输出是真的,如果有人能解释我错过了哪些对我很有帮助
答案 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
这是真的