Повышение эффективности цикла в игровом коде - PullRequest
0 голосов
/ 25 июня 2018

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

1 Ответ

0 голосов
/ 25 июня 2018

Решение, основанное на решениях Checkio - Xs and Os и , которые отвечают :

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"

Улучшает читаемость, а не эффективность.Однако эффективность не имеет решающего значения для поля 6 x 7.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...