与numpy的colission测试

时间:2015-07-14 13:11:31

标签: python numpy tetris

假设我有一个单元矩阵并且坐标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加快速度吗?

1 个答案:

答案 0 :(得分: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))较慢。