Я программирую игру Connect 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).Но я не смог придумать реализацию.