【问题标题】:Checking if a a list exists in another list of lists检查一个列表是否存在于另一个列表列表中
【发布时间】:2020-07-06 21:36:33
【问题描述】:

我正在开发一个井字游戏应用程序,我目前正在尝试弄清楚如何让计算机知道用户赢了。

我的方法是将用户采取的每个位置附加到“x_moves”列表中,并与“win_if”列表进行检查,以查看 x_moves 列表是否包含任何顺序的组合。

win_if = (
["top_l", "top_m", "top_r"],
["mid_l", "mid_m", "mid_r"], 
["bot_l", "bot_m", "bot_r"],
["top_l", "mid_l", "bot_l"], 
["top_m", "mid_m", "bot_m"], 
["top_r", "mid_r", "bot_r"],
["top_l", "mid_m", "bot_r"], 
["top_r", "mid_m", "bot_l"]
)

x_moves = ["top_m", "mid_r", "mid_m", "bot_m"]

我尝试过使用“in”,但这不起作用,因为 x_moves 列表需要按非常特殊的顺序排列。

【问题讨论】:

    标签: python list multidimensional-array


    【解决方案1】:

    您可以在win_if 中获取每个内部列表,并检查用户是否在内部移动。如果计数大于2(或等于3),则表示有赢家。像这样的:

    win_if = (
        ["top_l", "top_m", "top_r"],
        ["mid_l", "mid_m", "mid_r"],
        ["bot_l", "bot_m", "bot_r"],
        ["top_l", "mid_l", "bot_l"],
        ["top_m", "mid_m", "bot_m"],
        ["top_r", "mid_r", "bot_r"],
        ["top_l", "mid_m", "bot_r"],
        ["top_r", "mid_m", "bot_l"]
    )
    
    x_moves = ["top_m", "mid_r", "mid_m", "bot_m"]
    
    for inner in win_if:
        count = 0
        for each in x_moves:
            if each in inner:
                count += 1
        if count > 2:
            print("winner")
            break
    

    【讨论】:

    • 谢谢,这是一个很棒的解决方案
    • 不客气,我很高兴它有用。只是小笔记;我在找到获胜者后编辑并添加了break,以免浪费时间和资源。
    【解决方案2】:

    我认为您可以编写一个简单的函数,例如:

    编辑:您可以使用sets 来实现您的结果。

    def is_winner(test):
        win_if = [
            {"top_l", "top_m", "top_r"},
            {"mid_l", "mid_m", "mid_r"}, 
            {"bot_l", "bot_m", "bot_r"},
            {"top_l", "mid_l", "bot_l"}, 
            {"top_m", "mid_m", "bot_m"}, 
            {"top_r", "mid_r", "bot_r"},
            {"top_l", "mid_m", "bot_r"}, 
            {"top_r", "mid_m", "bot_l"}
        ]
    
        for win_possibility in win_if:
    
            if set(test) == win_possibility:
                return True
        return False
    

    有意义吗?

    【讨论】:

    • 感谢您的建议。这里的问题是 x_moves 列表的顺序不一定与 win_if 中的列表相同。所以如果我输入"print(is_winner(["top_l", "top_m", "mid_l", "top_r"]))",就不算中奖
    • 无需道歉,感谢您的宝贵时间。谢谢你:)
    • 我已经编辑了答案。也许它现在适合你
    【解决方案3】:

    更好的方法是将棋盘表示为像这样的 2D 矩阵

    board = [[1, 2, 3], ['o', 'o', 'o'], [7, 8, 9]]
    player_1 = 'x'
    player_2 = 'o'
    winner = None
    
    # checks rows
    def check_rows(board):
        for i in range(3):
            if board[i].count(board[i][0]) == len(board[i]):
                if board[i][0] == player_1:
                    return 'player_1'
                elif board[i][0] == player_2:
                    return 'player_2'
        return None
    
    column = [[board[i][j] for i in range(3)] for j in range(3)]
    diagonal_1 = [board[i][j] for i, j in enumerate(range(3))]
    diagonal_2 = [board[i][j] for i, j in enumerate(range(2, -1, -1))]
    winner = check_rows(board) or check_rows(column) or check_rows(diagonal_1) or check_rows(diagonal_2)
    print(winner)
    

    这将返回 None,如果在这种状态下没有赢家,它非常紧凑,并且只对行、列和对角线使用一个函数。

    board[i].count(board[i][0]) == len(board[i]) 检查矩阵中一行中的所有 3 个项目是否相等,这意味着两个玩家中的一个赢了,所以我们通过检查行中的第一项来检查哪一个赢了(因为他们'无论如何都相等)并返回一个字符串中获胜的玩家。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-11
      • 2022-01-06
      • 2013-12-12
      • 2021-01-04
      • 2012-10-08
      • 1970-01-01
      • 2023-03-22
      相关资源
      最近更新 更多