Испытание на снос
Допустим, у меня есть ячейка-матрица и координаты 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)) медленнее, поскольку создается другое представление.