Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 提高游戏代码中的循环效率_Python_Arrays_Numpy - Fatal编程技术网

Python 提高游戏代码中的循环效率

Python 提高游戏代码中的循环效率,python,arrays,numpy,Python,Arrays,Numpy,我正在编写一个连接4的游戏。游戏数组为(6,7),在玩家尚未移动的位置包含0。共有2名玩家(玩家1和玩家2)。目前,我是这样检查胜利的 def check_success(game_array): assert (np.shape(game_array)==(6,7)), 'Incorrect shape' for s_r in range(3): for s_c in range(4): board=game_array[s_r:s_r+

我正在编写一个连接4的游戏。游戏数组为(6,7),在玩家尚未移动的位置包含0。共有2名玩家(玩家1和玩家2)。目前,我是这样检查胜利的

def check_success(game_array):
    assert (np.shape(game_array)==(6,7)), 'Incorrect shape'
    for s_r in range(3):
        for s_c in range(4):
            board=game_array[s_r:s_r+4,s_c:s_c+4]*1
            D = np.einsum('ii->i', board)
            DP = D != 0
            if DP[0] and (D[0] == D).all():
                return True, D[0]
            L = DP & (D == board).all(0)
            I = L.argmax()
            if L[I]:
                return True, D[I]
            L = DP & (D == board.T).all(0)
            I = L.argmax()
            if L[I]:
                return True, D[I]
            D = np.einsum('ii->i', board[::-1])
            if D[0] and (D[0] == D).all():
                return True, D[0]
    return False, 0
有人能想出一种不使用for循环(或至少更少的迭代)的方法来处理这个问题吗?我查看了numpy.diff并创建了一个for循环,以7同时检查行/列(将迭代次数减少7/12)。但我无法提出实施方案。

解决方案基于和:


它提高了可读性,而不是效率。但是,效率对于
6 x 7
字段来说并不重要。

您对我的代码做了什么?!?;-)你的问题是:你只考虑增量检查,也就是说只包含最后一块的四分之一?哇,等等,这是很明显的。当然这会有很大帮助。此外,我最终希望将这个游戏扩展到多个维度和多个不同的玩家(如前一个问题所述),因此这种方法在可扩展性方面将是非常好的。我之所以追求效率,是因为我正试图设计最高效的引擎来选择移动。在该算法中,我有某些移动组合(全部用于暴力,一些用于某些修剪方法等),但该算法必须经常检查胜利。检查胜利的速度大大减慢了我的速度,不允许我使用任何有意义的深度算法(我,我自己,在comp中有40%的获胜率,我在这场比赛中很差劲)。好吧,在这种情况下,效率很重要。无论如何,我会留下答案:)
def check_success(field):
    rows = field.tolist()
    cols = field.T.tolist()
    diags = [field[::-1,:].diagonal(i)
        for i in range(-field.shape[0] + 1, field.shape[1])]
    diags.extend(field.diagonal(i)
        for i in range(field.shape[1] - 1, -field.shape[0], -1))

    lines = diags + cols + rows
    for line in lines:
        if "2, 2, 2, 2" in repr(line):
            return "2 wins"
        elif "1, 1, 1, 1" in repr(line):
            return "1 wins"
    return "no winner"