python - 3x3 noughts 和 crosss 并确定是否有赢家
问题描述
这是我大学的作业,问题是:
优胜者!
使用函数line_winner(line),现在我们可以实现winner函数了!函数获胜者(板)将检查每一行、每一列和对角线,以检查是否有玩家赢得了比赛。如果有获胜者(即函数 line_winner(line) 返回的不是 None),则函数 Winner(board) 也返回获胜者。如果尚未找到获胜者,则返回 None。
完整功能获胜者(董事会)。
例如:
Test Result
board = [['X', ' ', 'O'], [' ', 'O', ' '], ['X', ' ', ' ']]
print(winner(board))
None
board = [['X', ' ', 'O'], ['X', 'O', ' '], ['X', ' ', ' ']]
print(winner(board))
X
这是我想出的代码:
def winner(board):
"""noughts and crosses game and checks if a row or column or diagonal is a winner"""
row_ = []
for row_number in range(3):
row_.append(board[row_number])
column_ = []
for col_number in range(3):
column_.append(list(board[0][col_number] + board[1][col_number] + board[2][col_number]))
diagonal_0 = []
diagonal_1 = []
for selected_diagonal in range(2):
if selected_diagonal == 0:
diagonal_0.append(list(board[0][0] + board[1][1] + board[2][2]))
else:
diagonal_1.append(list(board[0][2] + board[1][1] + board[2][0]))
total = row_ + column_ + diagonal_0 + diagonal_1
res = None
for line in total:
if line[0] == line[1] == line[2]:
if line[0] == 'X':
res = 'X'
elif line[0] == 'O':
res = 'O'
elif line[0] == ' ':
res = None
return res
然而,它的 23 条语句很长,问题只允许 20 条。无论如何我可以缩短它吗?它还必须通过这些检查:
board = [['X', ' ', 'O'], [' ', 'O', ' '], ['X', ' ', ' ']]
print(winner(board))
None
board = [['X', ' ', 'O'], [' ', 'O', ' '], [' ', ' ', ' ']]
print(winner(board))
None
board = [['X', ' ', 'O'], ['X', 'X', ' '], ['X', ' ', 'X']]
print(winner(board))
X
board = [['O', ' ', 'O'], ['O', 'X', ' '], ['O', ' ', 'X']]
print(winner(board))
O
解决方案
快速简单的方法是,如果您知道 naughts 和 crosss 游戏将仅在 3x3 方格中进行,并且您永远不需要概括更大的方格,那么只有 8 个可能的获胜行。即 3 个水平、3 个垂直和 2 个对角线。棋盘给出了三个水平行(我假设棋盘描述了三行,尽管这并不重要),所以我们可以做的是添加额外的列和对角线,然后遍历它们并检查其中是否有任何一个是获胜的行。你可以很容易地概括这种方法,但如果你需要,我会留给你
def winner(board):
board.append([board[0][0], board[1][0], board[2][0]]) # vertical left
board.append([board[0][1], board[1][1], board[2][1]]) # vertical center
board.append([board[0][2], board[1][2], board[2][2]]) # vertical right
board.append([board[0][0], board[1][1], board[2][2]]) # diag bl to tr
board.append([board[0][2], board[1][1], board[2][0]]) # diag tl to be
for row in board:
if row[0] == row[1] == row[2] and row[0] != " ":
return row[0]
推荐阅读
- java - Deeplearning4j (DL4J) 低精度、召回率和 F1
- sql - SQL - 带重置的窗口计数
- c# - 为什么我的循环混合了第一个循环和最终循环的第一个输入
- c# - Google Maps Geocode API 以编程方式返回 NO_RESULTS,但在浏览器中返回具有相同 URL 的结果
- angular - 如何从 Ionic 3 中的 WordPress rest api 访问 JSON 值
- java - 没有合适的添加方法
- google-directions-api - Google 路线 OVER_QUERY_LIMIT
- java - 使用meka java的多标签分类
- azure-service-fabric - 在 Azure Service Fabric 中获取 System.PlatformNotSupportedException
- sql - 如何选择具有优先级第一个表的不同 UNION