代码之家  ›  专栏  ›  技术社区  ›  Joyal Mathew

python中的列表理解不正确

  •  0
  • Joyal Mathew  · 技术社区  · 6 年前

    我是巨蟒的初学者,正在努力自学。我有一个井字游戏,我已经工作一段时间了,但我不能让它检测到领带。我使用一个列表来存储值和列表理解,以检测关系/胜利。问题是程序评估不正确。当它应该返回真时,它返回假。

    这是我检测领带的功能:

    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。

    以下是我的全部代码:

        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 回复  |  直到 6 年前
        1
  •  1
  •   U13-Forward    6 年前

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

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

    然后在所有函数中像这样简化它