Испытание на снос

Допустим, у меня есть ячейка-матрица и координаты x, y которые обозначают верхнюю левую ячейку Tetronimo и матрица B соответствующий колодцу тетриса:

T = [[2,2,2],
     [2,0,0],
     [0,0,0]]

y,x = (1,0)

B = [[0,0,0,0,0],
     [0,0,0,0,0],
     [1,0,0,0,0],]

В настоящее время я использую простое сравнение, чтобы найти столкновение:

def testCollision(x,y, T, B):
    for dx in xrange(3):
        for dy in xrange(3):
            if T[dy][dx] == 0:
                continue
            else:
                if B[y+dy][x + dx] != 0:
                    return False
    return True

Могу ли я ускорить это с использованием NumPy?

1 ответ

Решение

Если я не ошибаюсь, что-то такого рода должно работать

return (B[x:x+3,y:y+3] * T).sum() == 0

Вы должны проверить это на правильность; в любом случае это будет алгоритмически оптимально, в рамках парадигмы NumPy. Однако обратите внимание, что операции с такими маленькими массивами также не очень эффективны. Все еще намного лучше чем итерация стиля C, но издержки абстракции массива будут заметны. То есть, поскольку производительность - это проблема в первую очередь, когда речь идет о тетрисе.;)

return (B[x:,y:][:3,:3] * T).sum() == 0

Кстати, я думаю, что это более чистая и удобочитаемая индексация для операций такого типа; хотя незначительно (O(1)) медленнее, поскольку создается другое представление.

Другие вопросы по тегам