python中的列表理解无法正确评估

时间:2018-09-19 01:37:14

标签: python arrays python-3.x

我是python的初学者,正在尝试自学。我有一个井字游戏,现在我已经工作了一段时间,但我无法使它检测到纽带。我正在使用一个列表来存储值并使用列表理解来检测平局/获胜。问题是程序无法正确评估。在应返回True时返回False。

这是我检测领带的功能:

def tied():
        nonlocal tie
        if all([x in ['X', 'O'] for x in o_gb[0]] + [x in ['X', 'O']
              for x in o_gb[1]] + [x in ['X', 'O'] for x in o_gb[2]]):
        tie = True

即使列表中有X或O,它始终返回False列表。

这是我所有的代码:

    import numpy as np

    def ticTacToe():
        x_win = False
        o_win = False
        tie = False
        o_gb = [['_'for x in range(3)]for y in range(3)]
               gb = np.array(o_gb).T

        def win():
            nonlocal x_win, o_win
            if (all(x in ['X'] for x in gb[0]) or all(x in ['X']for x in 
               gb[1])or all(x in ['X'] for x in gb[2])):
                x_win = True
            if (all(x in ['O'] for x in gb[0]) or all(x in ['O'] for x in 
               gb[1])or all(x in ['O'] for x in gb[2])):
                o_win = True

        def win2():
            nonlocal x_win, o_win
            if (all(x in ['X'] for x in gb[:, 0]) or all(x in ['X']for x in 
               gb[:, 1]) or all(x in ['X'] for x in gb[:, 2])):
                x_win = True
            if (all(x in ['O'] for x in gb[:, 0]) or all(x in ['O']for x in 
               gb[:, 1]) or all(x in ['O'] for x in gb[:, 2])):
                o_win = True

        def win3():
            nonlocal x_win, o_win
            if (all(x in ['X'] for x in np.diag(gb)) or all(x in ['X'] for x 
               in np.diag(np.fliplr(gb)))):
                x_win = True
            if (all(x in ['O'] for x in np.diag(gb)) or all(x in ['O'] for x 
               in np.diag(np.fliplr(gb)))):
                o_win = True

        def tied():
            nonlocal tie
            if all([x in ['X', 'O'] for x in o_gb[0]] + [x in ['X', 'O']for 
               x in o_gb[1]] + [x in ['X', 'O'] for x in o_gb[2]]):
                tie = True
        while 1:
            print(gb)
            xm = input('X\'s move(x,y): ').split(',')
            xm = [int(i) for i in xm]
            if gb[xm[0]-1, xm[1]-1] not in ['X', 'O']:
                gb[xm[0]-1, xm[1]-1] = 'X'
            else:
                 print('You can\'t move there, now you lose a turn!')
            win()
            win2()
            win3()
            tied()
            print(gb)
            if o_win or x_win or tie:
                break
            om = input('O\'s move(x,y): ').split(',')
            om = [int(i) for i in om]
            if gb[om[0]-1, om[1]-1] not in ['X', 'O']:
                gb[om[0]-1, om[1]-1] = 'O'
            else:
                print('You can\'t move there, now you lose a turn!')
            win()
            win2()
            win3()
            tied()
            if o_win or x_win or tie:
                break
            if x_win:
                print('X wins!')
            elif o_win:
                print(gb)
                print('O wins!')
            else:
                if o_win:
                    print(gb)
                print('Tie!')
            while 1:
                done = input('Again?(y/n)')
                if done in ['y']:
                    ticTacToe()
            else:
                break

任何帮助将不胜感激,谢谢!

1 个答案:

答案 0 :(得分:1)

all检查所有内容,您需要any(并简化代码):

def tied():
    nonlocal tie
    if any(x in 'XO' for i in o_gb[:3] for x in i):
        tie = True

然后在所有功能中将其简化