首页 > 解决方案 > 我如何在更大的列表中搜索列表而不考虑顺序?

问题描述

这是我第一次尝试井字游戏的副本。我有三周的经验。只要选择按时间顺序进行,我的代码就可以工作,但如果不按顺序进行,将无法识别获胜者。我可以就如何在更大的列表中找到一个列表(无论顺序如何)提供一些反馈。此外,该程序对我来说似乎效率不高。有什么建议么?

var_board = ['1__','2__','3__','4__','5__','6__','7__','8__','9__']
x_list = []
o_list = []

def board():
    print(var_board[0] + var_board[1] + var_board[2])
    print(var_board[3] + var_board[4] + var_board[5])
    print(var_board[6] + var_board[7] + var_board[8])

##Check to see horizontal win
def horizontal():
    if(set([0,1,2]).issubset(set(x_list))):
        print("***We have a winner***")
    elif (set([3,4,5]).issubset(set(x_list))):
        print("***We have a winner***")
    elif (set([6,7,8]).issubset(set(x_list))):
        print("***We have a winner***")
    else:
        quit


##Check to see vertical win
def vertical():
    if(set([0,3,6]).issubset(set(x_list))):
        print("***We have a winner***")
    elif (set([1,4,7]).issubset(set(x_list))):
        print("***We have a winner***")
    elif (set([2,5,8]).issubset(set(x_list))):
        print("***We have a winner***")
    else:
        quit


##Check to see diagonal win
def diagonal():
    if(set([2,4,6]).issubset(set(x_list))):
        print("***We have a winner***")
    elif (set([0,4,8]).issubset(set(x_list))):
        print("***We have a winner***")
    else:
        quit

##Game play
board()

while True:
## "X" winning positions   
    position = int(input("To make your move, choose a number 1-9: "))-1
    var_board[position] = "X  "
    x_list.append(int(position))
    print("X list: ",x_list)
    board()
    horizontal()

##"O" winning positions    
    position = int(input("To make your move, choose a number 1-9: "))-1
    var_board[position] = "O  "
    o_list.append(int(position))
    print("O list: ",o_list)
    board()
    horizontal()

标签: python-3.x

解决方案


你似乎有一个o_list永远无法获胜的问题?我会将您的检查条件更改为。

horizontal_wins = [ set([0, 1, 2]), set([3, 4, 5]), set([6, 7, 8]) ]
def horizontal(plays):
    return any( row.issubset(plays) for row in horizontal_wins ):

我认为这是一种改进,因为它接受 play 作为参数,而不是全局变量。这意味着它可以同时适用于 x_plays 和 o_plays。

horizontal(x_list) #checks if x won.
horizontal(o_list) #checks if y won.

另一个改进,它只创建一次水平集。在这个程序中,集合是如此之小,它没有任何区别。

最后的改进,它返回结果。它不打印任何东西或决定游戏,它只是告诉调用者条件已经满足。这样做的原因是为了在主游戏循环中保持控制。

while True:
    ## "X" winning positions   
    position = int(input("To make your move, choose a number 1-9: "))-1
    var_board[position] = "X  "
    x_list.append(int(position))
    print("X list: ",x_list)
    board()
    x_wins = horizontal(x_list)
    if x_wins:
        print("x won!")
        break # end game.
    ##"O" winning positions    
    position = int(input("To make your move, choose a number 1-9: "))-1
    var_board[position] = "O  "
    o_list.append(int(position))
    print("O list: ",o_list)
    board()
    o_wins = horizontal(o_list)
    if o_wins:
        print("o wins!")
        break

推荐阅读