首页 > 解决方案 > 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

标签: python

解决方案


快速简单的方法是,如果您知道 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]

推荐阅读