JAVA实战练习——俄罗斯方块(超简易版)

来源:互联网 发布:select ajax json 联动 编辑:程序博客网 时间:2024/04/30 02:29

此文章根据网络上的视频培训而来。目的只是用来学习和研究。
视频的网址如下
传送门

整体框架设计

整体采用MVC的框架设计模式,即将图形的控制C、图形视图V及图形模型M分离。这样做的好处是使得各个部分的功能和作用相对独立。

对象功能分析

此次程序的设计,主要包括如下几个对象:
Ground类,障碍物类,用于显示图形下落之后组成的形状。
Shape类,图形类,用于显示不同的方块,该类可以由shapeFactory生成。
GamePanel类,游戏面板类,用于显示Ground类和Shape类。

各类之间的关系

各类之间的关系如下图所示:
类关系图

各类中主要方法描述

GamePanel(游戏面板)
该类中有一个显示方法,显示的是障碍物和图形。由于显示,故需要继承JPanel类,来完成图形和障碍物的绘制工作。调用repaint即可实现图像的绘制。因为调用repaint方法,则必须要重回paintComponent方法。
GamePanel由于继承了JPanel,故需要在一个JFrame上才可以显示出来。
Shape类(图形类)
该类中应有左移右移下移的操作。同时该类中应该有定时下移的功能。定时下移,故需触发一个事件,用以通知控制器,下落完成,重新显示。因为有监听器,故需要添加一个注册监听器的方法。
Ground类(障碍物类)
该类中应该有接收的功能,用于接收新的图形,同时该类也应具有显示的功能。不仅如此,还应该具有具有判断图形是否到达边界或者障碍物的判断方法。另外,当满行时,应该具有自动消行的功能。
Control类
该类中应该具有处理按键事件功能,同时有一些必要的处理逻辑。
1, Controller里面实现两个控制:
a) 用户的按键事件的处理
b) 处理逻辑

用户的按键事件的处理
使用适配器模式。继承keyAdapter适配器。该适配器中包含一个keyProcessed方法:根据不同的keyCode,来处理不同的事件。
并且在处理用户逻辑完用户逻辑之后,需要重新绘制图形和障碍物,故此时需要调用gamePanel的显示方法来显示这些信息。
2, 图形定时下落的事件监听器
之所以有事件监听,是因为图形在定时下落后,也还是需要显示图形。而shape并不能直接操控gamePanel,故需要一个事件监听器来处理。Shape每下落一次,就触发一个事件,而处理该事件是由controller控制器来完成。处理方法是,接收到此事件后,就调用显示组件重新显示。

几个注意点

图形坐标表示

可以把整个显示面板看作是一个一个的小格子,而障碍物或者图形,只不过在适当的时候,出现在必要的位置上,如下图所示
图形和障碍物坐标表示
因此,我们可以使用一个4X4的表格来表示一个图形,如下图所示
这里写图片描述
图中黄色的位置即是图形。而如何区分这些黄色和无色区域呢?可以认为黄色是1,而无色为0.故上述图形可以转化为如下的标记。
这里写图片描述
因此,我们可以使用一个二维数组来实现这个L图形,并保存它的不同状态
这里写图片描述
因此,shape的属性中,应该还具有两个属性:body[][]和status。
其中body[][]表示某一类图形,它的所有可变型的状态;而status则是记录当前该图形是什么状态。
由于图形是通过图形工厂产生。故图形工厂中需要存放所有图形的信息,并能设置图形的种类和样子。

图形移动

所谓图形移动就是图形距离左边界和上边界的位置的改变。因此shape需要还需要两个属性:在整个gamePanel的坐标——top和left。Top是距离上边界的距离,而left则是距离左边界的距离。故下移就是top加1,左移就是left减1,右移就是right加1。如下图所示
这里写图片描述

图形的画法

所谓图形画法,主要关键点在于坐标的转换,即格子的坐标和像素坐标的转换。整体关系如下图表示
这里写图片描述
图中蓝色的区域即是我们需要填充的。
对于填充矩形来讲,需要知道矩形左上角那个位置的像素坐标及格子的宽和高。在4X4矩阵中,只有当格子为1时,我们才会填充这个矩形

图形碰到障碍物或者面板边界的判定

这里写图片描述
如图所示,即当图形中黄色的位置碰到障碍物或者边界时,即可认为是图形已经碰到上述两个位置了。此时,图形将不能下移或者右移。因此,图形在执行下一个动作时,应该需要询问是否可以继续动作。而询问的对象,则应该是Ground类。故Gound中应该具有判断图形是否能够移动的方法。
当图形自动下移时,也需要去判断是否需要能够移动。所以图形需要一个事件触发一个事件,通知控制器,判断其是否可以下落。
综上,需要提前预判下一个动作是否超出边界。如果超出了边界,此次就不能移动。

Ground的画法

所谓的图形画法,就是实现accept方法和drawMe方法。
其中accept()方法,是Ground接收图形的每一个点;而drawMe方法,则是用于将对应的位置显示出来。
需要指出的是,我们可以把整个GamePanel的大小作为一个空的Ground(还未被填充的)。

满行后消失的处理

消行,也是Ground类自己的方法。
满行:一整行都是障碍物,没有空白。
消行:即满行的上面所有的行一次下移。
另外,消行是在获取图形成障碍物之后进行。

游戏结束的标志

如果第一行有障碍物,则表示该游戏结束

代码下载地址

传送门

0 0
原创粉丝点击