游戏描述:
俄罗斯方块分为多个形状,每次在屏幕的上方的中间随机出现一个形状,然后这个形状以一定的速度向下落。
下落过程中,可以使用键盘下左右控制方块的移动,按上设为改变方块的形状,当下落在屏幕的底或者碰到屏幕上已经堆积的方块时停下,以它自身的形状加入到屏幕上已堆积的方块 中。
堆积的方块中,若有其中有一行被所有方块填满,则这一行被消除。
当堆积的方块中其中有一列,超过屏幕顶端,则Game Over。
冲突检测:
1、 移动的冲突检测。
1) 当方块分别在最左边、最右边、最下面时,方块不能向左、右、下方移动。
2) 当方块左、右、下方有堆积的方块时,方块不能向左、右、下方移动。
2、 变换的冲突检测。
1) 当方块变换后的状态中存在一个坐标,使得这个坐标越界(超出上下左右边界),那么不能变换(该程序采用恢复到变换前的状态)。
2) 当方块变换后的状态中存在一个坐标,使得这个坐标和已堆积的方块的坐标重合,那么不能变换。
判断停下:
1、方块中存在一个坐标在屏幕的底时,则方块停下,加入已堆积的方块中。
2、方块中存在一个坐标的纵坐标加+1和已经堆积方块中的一个坐标重合,则方块停下,加入已堆积的方块中。
方块停下后,初始化新的方块。
判断消行:
当方块停下来的时候,从方块最小纵坐标到最大纵坐标扫描已堆积的方块,若在堆积的方块中这一行已填满,则消除改行所有的方块,且将该行上面的方块向下移动一行。
不足之处:
1、每次初始化方块时,都是new的一个新Shape的对象,这样太耗费空间了,可否只用new一个对象,然后再下一次的时候初始化Shape对象时,直接改变Shape指向的子类。一开始我想的是第一次初始化方块时,直接new 出来。在以后初始化方块时(若shape不为空),先向上转换为Shape类型,然后再强转为Shape的其他子类,这样显然不行。单例模式?用了子类怎么办?
2、在各种冲突检测中,时间复杂度太高。
游戏相关图片:
完整代码见附件。