python - 我怎样才能在这个游戏中使用更少的 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"
解决方案
对于 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 循环的数量。
推荐阅读
- .net - 如何尽快获得 Outlook DistributionList 的成员?
- sharepoint - 使用加载项使用用户输入文本修改网站集中的 JS 文件
- android - 软键盘将编辑文本隐藏在其后面
- reactjs - ReactJS:验证不适用于使用 Formik 多步表单的 Yup
- excel - 用户窗体中的图表没有一种方法有效
- gradle - 重构 gradle 任务“类型:复制”中的重复代码
- webpack - 使功能可用于谷歌应用程序脚本,来自 webpack 模块
- powershell - Powershell 脚本未从 Office 365 (MsolService) 获取所需的所有信息
- php - PHP Form 没有将数据发布到数据库
- java - 了解 Hotspot 中 PrintRelocations 的输出