检查tictactoe游戏胜利的最有效方法

时间:2016-02-22 19:23:37

标签: python performance

我做了两场TicTacToe比赛,我已经尝试了一些方法来检查阵列中的胜利。目前,我保留了以下内容。你能帮我找出效率最高的吗?

第一个:

def check_victory(self, board, mark):
    for i in board:
        if np.array_equal(i, [mark]*3):
            return True

    for i in range (0, 3):
        if (board[0][i] == board[1][i] == board[2][i] == mark):
            return True

    if (board [0][0] == board [1][1] == board [2][2] == mark) or (board [0][2] == board [1][1] == board [2][0] == mark):
        return True
    return False

第二个:

def check_victory(self, table):
    for j in range(3) :
        if (sum(table[j][i] for i in range(3)))**2 == 9 or (sum(table[i][j] for i in range(3)))**2 ==9:
            return -self.active_player

    if (sum(table[i][i] for i in range(3)))**2 == 9 or (sum(table[i][2-i] for i in range(3)))**2 == 9:
        return -self.active_player

    for i in range(3) :
        for j in range(3) :
            if table[i][j]==0 :
                return None
    return 0

2 个答案:

答案 0 :(得分:1)

使用计时功能。构建一系列8种可能的胜利,并运行循环以多次评估整个系列(足以使开销成本微不足道)。

另外,在第二种情况下你可以做得更好。而不是检查

如果x ** 2 == 9

尝试

如果abs(x)== 3

取幂,即使是乘法,也比让硬件操作反转负整数慢。

更好的是,不要检查整个电路板:相反,只检查涉及最近移动的2-4种组合。最重要的是,在第二步之后,只需保留一份获胜动作列表。当你能够制作其中一个时,就不需要检查了。

更容易做到这一点的一种方法是在内部将方块编号为3x3魔方:

8 3 4
1 5 9
6 7 2

现在,如果您玩了三个加起来为15的数字,那么你就赢了。

答案 1 :(得分:0)

我使用这个算法:

def algo(symbols, x, y):
    """Check if someone wins with this move
    0,0  0,1  0,2
    1,0  1,1  1,2
    2,0  2,1  2,2

    2 straight checks: [0][y] & [x][0]
    2 diagonal checks, if x = y or x = 2 - y
    """
    return (symbols[0 * 3 + y] == symbols[1 * 3 + y] == symbols[2 * 3 + y] or
            symbols[x * 3 + 0] == symbols[x * 3 + 1] == symbols[x * 3 + 2] or
            (x == y and symbols[0] == symbols[4] == symbols[8]) or
            (x == 2 - y and symbols[2] == symbols[4] == symbols[6]))

自动返回True或False