最近,我在一家不错的公司面试,被要求用高效的数据结构设计俄罗斯方块游戏。我回答了每个形状的二维数组,但面试官正在寻找更好的答案。然后,他让我也设计 Ludo。
对这两个问题有任何意见吗?
一个不错的选择是列出每件从原点开始的三对偏移量(第四个偏移量是{0.0}
)。这将让您对形状进行如下编码:
I {0,1} {0,2} {0,3}
J {0,1} {1,1} {2,1}
L {0,1} {-1,1} {-2,1}
O {0,1} {1,1} {1,0}
S {-1,0} {-1,1} {-2,1}
T {-1,1} {0,1} {1,1}
Z {1,0} {1,1} {2,1}
有了这些列表,您就可以绘制形状,检查“玻璃”以获取相应形状的可用空间,应用旋转,然后将其放置在玻璃内的最终静止位置。与大多数操作需要两个嵌套循环的 2D 结构不同,这种结构可以让您使用单个循环进行测试,如果您展开其琐碎的四个步骤,甚至可以不使用循环。
我不知道如何做 Ludo,但俄罗斯方块首先想到的是使用位掩码。
您可以制作一个足够大的“超级形状”以包含俄罗斯方块中的所有形状,然后打开掩码中的位以制作“形状”。
这样每个形状都可以是相同的对象类型。当它们“着陆”时,您可以打开代表电路板的更大位掩码中的位。当正确的位组都在“制作一条线”时,您可以处理该事件。