首页 > 解决方案 > 我怎样才能在这个游戏中使用更少的 for 循环,并且使用更少的 line eof 代码变得更加有效和动态?

问题描述

def tic_tac_toe(board):

    mess = []   
    organize = []     
    winner = []   
    n = len(board)

我可以在没有这么多 for 循环的情况下做到这一点吗?

    for i in range(len(board)):
        for j in range(len(board[i])):
            mess.append(board[j][i]) 
     #appending all vertical items


    for i in range(len(board)):
        for j in range(len(board[i])):
            mess.append(board[i][j]) 
    #appending all horizontal items


    for i in range(len(board)):
        for j in range(len(board[i])):
            i = j
            mess.append(board[i][j])
        break

    #appending items that have the same i and j index (i==0 j==0,i==1 j==1,i==2 j ==2) or better say all items in these position (\)


    for i in range(len(board)):
        for j in range(len(board[i])):
            if j - i == 2 or i - j == 2 or (i == 1 and j == 1):
                mess.append(board[i][j])  
    #appending items in these indexes : (i ==0 j ==2 , i == 1 j == 1, i ==2 j == 0) items in these position (/) 



    organize = [mess[k: k + n] for k in range(0, len(mess), n)] # creating nested list of all possible moves


    winner = ["X" if organize[i].count("X") == 3 else "O" if organize[i].count("O") == 3 else "Draw" for i in range(len(organize))] # "X" if 3 "X"s in organize[i]. "O" if 3 "O"s in organize[i] and "Draw" otherwise .

而这决定了赢家。如果获胜者列表中有一个“X”,则获胜者是“X”。与 "O" 相同。但是如果获胜者列表中的所有元素都是“平局”,那么游戏就是平局。

强文本

    if "X" in winner:
        return "X"
    elif "O" in winner:
        return "O"
    elif winner.count("Draw") == 8 :
        return "Draw"  

   

print(tic_tac_toe([
    ["X", "X", "O"],
    ["O", "O", "X"],
    ["X", "X", "O"]
])) # ➞ "Draw"

标签: pythonfunctionfor-loopnested-liststic-tac-toe

解决方案


对于 for 循环,您可以轻松编写 1 个循环而不是 2 个:

代替:

for i in range(len(board)):
    for j in range(len(board[i])):
        mess.append(board[j][i])

你可以写:

for i, j in enumerate(board):
    mess.append(board[j][i])

并且肯定这适用于其他 for 循环。

但是,您也可以编写一个函数来减少 for 循环的数量。


推荐阅读