项目参考:
http://www.itcast.cn/
一、类的设计
游戏的显示面板:GamePanel类
方块:Shape类
void moveLeft(); //左移
void moveRight(); //右移
void moveDown(); //下移
void rotate(); //旋转(变形)
void drawMe(); //显示
特性:自己能定时下移
ShapeFactory类(图形工厂)
Shape getShape(); //生产出不同形状的图形
Ground类
void accept(Shape); //接受图形,把图形变成障碍物
void drawMe(); //显示障碍物
二、类之间的关系
图形定时下落,每下落一次都需要重新显示,图形移动和变形后,也需要重新显示。
![](https://i-blog.csdnimg.cn/blog_migrate/2a299ae1a1c0c60210643e7a26cca6c7.png)
三、部分方法实现思路
1、图形的表示与移动
(1)图形的表示:可以用一个4x4的方阵表示,每一个图形都可以有多种状态。
如下所示:
![](https://i-blog.csdnimg.cn/blog_migrate/f7e3aba8aef7f54d67ff1e1bf866b126.png)
(2)图形状态的表示:可以用一个二维数组进行表示。
![](https://i-blog.csdnimg.cn/blog_migrate/7de4d018bb708d6737747266b0588d7d.png)
数组表示如下:
{
{ 1,0,0,0, 1,1,1,0,
0,0,0,0, 0,0,0,0 },
{ 1,1,0,0, 1,0,0,0,
1,0,0,0, 0,0,0,0 },
{ 1,1,1,0, 0,0,1,0,
0,0,0,0, 0,0,0,0 },
{ 0,1,0,0, 0,1,0,0,
1,1,0,0, 0,0,0,0 }
}
{ 1,0,0,0, 1,1,1,0,
0,0,0,0, 0,0,0,0 },
{ 1,1,0,0, 1,0,0,0,
1,0,0,0, 0,0,0,0 },
{ 1,1,1,0, 0,0,1,0,
0,0,0,0, 0,0,0,0 },
{ 0,1,0,0, 0,1,0,0,
1,1,0,0, 0,0,0,0 }
}
(3)图形的移动:图形类里面要保存自己的位置信息,用left表示图形到左边界的距离,top表示图形到上边界的距离。
图形移动就是改变left和top的值。
![](https://i-blog.csdnimg.cn/blog_migrate/5af4c405917856e15dc62872501beefa.png)
向上移动:top-1;向上移动:top+1;向左移动:left-1;向右移动:left+1。
图形中的格子在显示区域中的位置为:
x坐标:left + 格子的x相对坐标
y坐标:top + 格子的y相对坐标
(相对坐标是格子在方阵中的坐标)
格子左上角这个点的像素坐标为:
x坐标为:left * 一个格子的宽度
y坐标为:top * 一个格子的高度
2、处理图形碰到游戏区边界的问题
按键后,如果下一步的动作会使图形超出边界或有的点与障碍物重叠,则不允许图形移动或变形。
对事件监听进行完善:
![](https://i-blog.csdnimg.cn/blog_migrate/58af5a4b38de678143fd9c6b38dfdac6.png)
3、消除满行
这一行没有空白,则这一行就是满行。
满的那行上面所有的行整体下移一行,就是消除这个满行。
4、判断游戏是否结束
如果有的障碍物超出了上边界(容器满了),就是游戏结束。
如果图形的初始位置为第一行,那么判断逻辑为:
如果第一行有障碍物,那么游戏结束。
四、效果展示
![](https://i-blog.csdnimg.cn/blog_migrate/c2c7f1dc3e2918f237c7a73653020049.png)
五、主要类代码
1、Shape.java
2、ShapeFactory.java
![](https://i-blog.csdnimg.cn/blog_migrate/4d5ed4208ee2b6376877ba97f095749a.png)
3、Ground.java
![](https://i-blog.csdnimg.cn/blog_migrate/17fc4803b3f7d0c4860420d58214cb24.png)