Python 提高游戏代码中的循环效率
我正在编写一个连接4的游戏。游戏数组为(6,7),在玩家尚未移动的位置包含0。共有2名玩家(玩家1和玩家2)。目前,我是这样检查胜利的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+
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"