0

tictactoe ゲームの行の 1 つがいっぱいになったときに 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)->Trueそして vencedor_linha(teste6)->False

問題は、 vencedor_linha(teste5)->が得られることです。これは、 が正しく機能しFalseないためです。if

PS。私はリストを使用できないので、気にしないでください。:p

4

2 に答える 2

1

3 つの異なる値が何かに等しいことを確認したい場合は、all() または 3 つの異なる == 条件を使用する必要があります。スライスが 1 つの値に等しいかどうかを確認しても意味がありません。

次のようなものが必要です。

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

iterables で巧妙なことを行うほとんどすべてのように itertools を使用する 1 つのライナー:

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) は、各要素が (値、その要素に適用された keyfunction が値を返す iterable の要素に対する反復子) の形式である反復子を返します。

reduce(function,iterable): シーケンスを 1 つの値に減らすために、2 つの引数の関数をシーケンスの項目に左から右に累積的に適用します。たとえば、reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) は ((((1+2)+3)+4)+5) を計算します。(pythonドキュメントから)

any(iterable) は、 iterable のいずれかの要素が True と評価された場合に True を返し、それ以外の場合は False を返します。

したがって、タプルを groupby を使用して行に分割し、reduce を使用して各行が同種であり、'X' または 'Y' のみを含むかどうかを計算し、それらの行のいずれかが True である場合に True を返します。

于 2013-03-07T15:43:31.203 に答える