0

当tictactoe游戏的其中一条线已满时,我想获得True:

teste5=('O','X','X',' ',' ',' ',' ',' ',' ')
teste6=('X','X','X',' ',' ',' ',' ',' ',' ')

def vencedor_linha(t):
    tl1=(t[0],t[1],t[2])
    tl2=(t[3],t[4],t[5])
    tl3=(t[6],t[7],t[8])
    tl=(tl1,tl2,tl3)
    if tl[0:][0:]=='X':
        return True
    elif tl[0:][0:]=='O':
        return True
    else:
        return False

所以vencedor_linha(teste5)->Truevencedor_linha(teste6)->False

问题是:它给了我vencedor_linha(teste5)-> False,因为我无法让if's 正常工作。

PS。我不能使用列表,所以不要费心告诉我。:p

4

2 回答 2

1

如果要检查 3 个不同的值是否相等,则需要使用 all() 或 3 个不同的 == 条件;检查切片是否等于一个值没有任何意义。

你想要这样的东西:

def vencedor_linha(t):
    tl1=(t[0],t[1],t[2])
    tl2=(t[3],t[4],t[5])
    tl3=(t[6],t[7],t[8])
    tl=(tl1,tl2,tl3)
    for row in tl:
        if all(x == 'X' for x in row) or all(x == 'O' for x in row):
            return True
    return False

(这会检查所有 3 行;我不清楚您的原始代码是否仅尝试检查第一行。)

于 2013-03-07T14:48:23.963 回答
0

一个使用 itertools 的衬垫,就像几乎所有用 iterables 做一些聪明的事情一样:

from itertools import groupby
def vencedor_linha(t):
    return any(reduce(lambda x,y:x if x==y and x in ['X','Y'] else False,
        (r[1] for r in row[1])) for row in groupby(enumerate(t),lambda (i,v):i/3))

基本上: enumerate(t) 返回一个迭代器,其中每个元素的形式为(t 中元素的索引,t 中的元素)

groupby(iterable, keyfunction) 返回一个迭代器,其中每个元素的形式为 (value, iterable 元素的迭代器,应用于该元素的 keyfunction 返回值)

reduce(function,iterable):将两个参数的函数从左到右累积应用于序列的项,从而将序列缩减为单个值。例如,reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) 计算 ((((1+2)+3)+4)+5)。(来自 python 文档)

如果可迭代的任何元素评估为 True,则 any(iterable) 返回 True,否则返回 False。

因此,我们使用 groupby 将您的元组分成几行,计算每行是否是同质的,并且只包含“X”或“Y”,如果这些行中的任何一个为 True,则返回 True。

于 2013-03-07T15:43:31.203 回答