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类自己的方法。
满行:一整行都是障碍物,没有空白。
消行:即满行的上面所有的行一次下移。
另外,消行是在获取图形成障碍物之后进行。
游戏结束的标志
如果第一行有障碍物,则表示该游戏结束
代码下载地址
传送门
- JAVA实战练习——俄罗斯方块(超简易版)
- Java简易俄罗斯方块
- JAVA 超简易版五子棋
- 俄罗斯方块——Java版
- 俄罗斯方块——Java版
- C语言俄罗斯方块(简易版)
- CCF编程练习:俄罗斯方块(Java)
- 简易俄罗斯方块
- 简易俄罗斯方块
- 实战——简易计算器
- J2ME实战:蓝牙联网俄罗斯方块(2)——系统总体设计
- J2ME实战:蓝牙联网俄罗斯方块(3)—方块生成与坐标控制模块
- qt实战(1)——简易文本浏览程序
- Java版的俄罗斯方块
- Java版俄罗斯方块
- 俄罗斯方块java版
- JAVA版俄罗斯方块学习
- 俄罗斯方块Java版
- 4、freemarker常用指令
- 5、Jsp 核心标签库
- 河南第八届省赛(Interference Signal)(简单模拟,有很多注意的)
- JavaWeb学习总结(一)——JavaWeb开发入门
- Apache服务器的配置具体操作—— Apache比较强大,所以要配置Apache作为本地web服务器
- JAVA实战练习——俄罗斯方块(超简易版)
- 6、freemarker自定义指令
- securityoverridehacking challenge 解题思路汇总——Realistic
- LAMP学习笔记-Mysql概念及命令整理
- tools:context
- 这样投简历,命中率会提高许多!
- java内存管理机制
- 手机开发web?native?hybrid?
- LeetCode-Word Pattern