使用 numpy 进行碰撞测试

Colission testing with numpy

假设我有一个单元格矩阵和坐标 xy 表示 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 加快速度吗?

如果我没记错的话,这种形式的东西应该可以工作

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

你应该测试它的正确性;在任何情况下,在 numpy 范例中,它在算法上都是最优的。但是请注意,对诸如此类的小型数组的操作也不是非常有效。仍然比 C 风格的迭代好很多,但是数组抽象的开销会很明显。也就是说,就俄罗斯方块而言,性能首先是一个问题。 ;)

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

顺便说一句,我认为对于这类操作,这是更清晰、更易读的索引;尽管由于构建了另一个视图而略微 (O(1)) 变慢。