1.17 俄罗斯方块游戏
1.17 俄罗斯方块游戏
基本问题:
1 如何设计各种数据结构来表示游戏中的各种元素,如每一个可活动的积木块,在底层堆积的积木等
- 首先用一个二维数组\(area[M][N]\)来表示\(M*N\)的游戏区域,其中,数组中值为0表示没有积木块,1表示有积木块
- 积木块也用数组表示,但是由于积木块的尺寸不同,并且旋转后的尺寸也有可能发生变化,如果为不同的积木设计不同尺寸的数组,则可能造成程序管理的混乱,因此采用统一尺寸的数组来容纳所有的可能的积木块,\(4*4\)的数组可以满足要求
- 积木块一共7种,每一种积木块4个方向\(BlocksSets[7][4][4][4]\)表示7中积木块的4个旋转方向的形状
- 旋转之后积木的形状\(rotatedBlock = BlockSets[n][m%4]\),\(m\)为旋转的次数
- 如何判断方块的水平移动范围,我们记录木块左上角相对于游戏区域的唯一,并且要考虑积木块有可能无法占满\(4*4\)的数组
2 现在已经知道了底层积木的状态,然后在游戏区域上方出现了一个新的积木块,如何运用刚才设计的数据结构来判断新的积木要如何移位和旋转,才能有效率的消除底部累计的积木?
采用积分制进行量化,具体来讲就是如果这种摆放达到了某要求就增加一定的分数,反之扣除。
3 有些版本有一个预览窗口,从预览窗口可以看到下一个积木块是什么样子,如果有了这个新的参数,我们如何改进程序,才能够有效额消除底部累积的积木?
穷举法依然适用,但是估计要经历剪枝减少时间的复杂度
Saying Less Doing More