簡體   English   中英

嵌套列表中的嵌套循環

[英]Nested loops in nested lists

我正在嘗試在python中構建一個簡單的井字游戲,以檢查是否有獲勝。我正在使用嵌套循環在嵌套列表中搜索匹配項。 由於某種原因,我的代碼將只搜索第一個嵌套列表,而不搜索我期望的其余列表。

board = [ 'O', 'X', ' ', 'O', ' ', 'X', 'O', 'X', 'X' ]
wins = [[0,1,2],[3,4,5],[6,7,8],[0,3,6],[1,4,7],[2,5,8],[0,4,8],[2,4,6]]

def checkWin(player):
    win = False
    for test in wins:
        print (test)
        count = 0
        for squares in test:
            if board[squares] == player:
                count = count + 1
            if count == 3:
                win = True
        return win

if __name__ == '__main__':
    print ("\nChecking board for X win ...\n")
    if checkWin("X"): 
        print ("Game over, X wins!")

    print ("\nChecking board for O win ...\n")
    if checkWin("O"):
        print ("Game over, O wins")

基於提供O獲勝的董事會,這是我得到的輸出:

Checking board for X win ...

[0, 1, 2]

Checking board for O win ...

[0, 1, 2]

有誰知道為什么會這樣嗎?

無論這三個正方形是否匹配,您都將從第一個嵌套列表測試中返回。 相反,只有在win為true時才返回:

def checkWin(player):
    win = False
    for test in wins:
        count = 0
        for squares in test:
            if board[squares] == player:
                count = count + 1
            if count == 3:
                win = True
        if win:
            return True
    return False

如果win為false,則上面的內容繼續到下一個嵌套列表,以進行下一個測試。

更好的是,在count設置為3時返回即可,因為您知道在該階段找到了一個匹配項:

def checkWin(player):
    for test in wins:
        count = 0
        for squares in test:
            if board[squares] == player:
                count = count + 1
            if count == 3:
                return True
    return False

您可以使用all()函數來代替計數:

def checkWin(player):
    for test in wins:
        if all(board[square] == player for square in test):
            return True
    return False

生成器表達式中的測試之一失敗后, all()盡早返回False

最終版本添加了any()可以在一行中完成測試:

def checkWin(player):
    return any(all(board[square] == player for square in test)
               for test in wins)

演示:

>>> board = [ 'O', 'X', ' ', 'O', ' ', 'X', 'O', 'X', 'X' ]
>>> wins = [[0,1,2],[3,4,5],[6,7,8],[0,3,6],[1,4,7],[2,5,8],[0,4,8],[2,4,6]]
>>> def checkWin(player):
...     return any(all(board[square] == player for square in test)
...                for test in wins)
... 
>>> checkWin('X')
False
>>> checkWin('O')
True

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM