java俄罗斯方块开发文档
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
俄罗斯方块游戏
项目介绍
俄罗斯方块(Tetris, 俄文:Тетрис)是一款风靡全球的电视游戏机和掌上游戏机游戏,它由俄罗斯人阿列克谢•帕基特诺夫发明,故得此名。
俄罗斯方块的基本规则是移动、旋转和摆放游戏自动输出的各种方块,使之排列成完整的一行或多行并且消除得分。
由于上手简单、老少皆宜,从而家喻户晓,风靡世界。
本项目将需要使用Java语言完成一个俄罗斯方块的游戏开发。
任务一
需求分析
游戏场景是一个用于摆放正方形的平面虚拟场地,其标准大小为:行宽为10,列高为20,以每个小正方形为单位。
一组由4个小型正方形组成的规则图形,共有7种,分别为I、L、J、O、S、T、Z 这7个字母形状来命名。其具体形状如图。
I:一次最多消除四层
J:最多消除三层,或消除两层
L:最多消除三层,或消除两层
O:消除一至两层
Z:最多两层,容易造成孔洞
T:最多两层
游戏规则
(1)部分游戏有单格方块,可以穿透固定的方块到达最下层空位。其他的改版中出现更多特别的造型。
方块会从区域上方开始缓慢继续落下。
(2)玩家可以做的操作有:以90度为单位旋转方块,以格子为单位左右移动方块,让方块加速落下。
(3)方块移到区域最下方或是着地到其他方块上无法移动时,就会固定在该处,而新的方块出现在区域上方开始落下。
(4)当区域中某一列横向格子全部由方块填满,则该列会消失并成为玩家的得分。同时删除的列数越多,得分指数上升。
(5)当固定的方块堆到区域最上方而无法消除层数时,则游戏结束。
(6)一般来说,游戏还会提示下一个要落下的方块,熟练的玩家会计算到下一个方块,评估要如何进行。由于游戏能不断进行下去对商业用游戏不太理想,所以一般还会随着游戏的进行而加速提高难度。
(7)通过设计者预先设置的随机发生器不断地输出单个方块到场地顶部,以一定的规则进行移动、旋转、下落和摆放,锁定并填充到场地中。每次摆放如果将场地的一行或多行完全填满,则组成这些行的所有小正方形将被消除,并且以此来换取一定的积分或者其他形式的奖励。而未被消除的方块会一直累积,并对后来的方块摆放造成各种影响。
(8)如果未被消除的方块堆放的高度超过场地所规定的最大高度(并不一定是20或者玩家所能见到的高度),则游戏结束。
建立对象模型
根据需求分析,游戏需要一个虚拟场地,场地由多个小方格组成,一般是高度大于宽度。该场地主要作用是显示方块所在的位置,设置GamePanel类。该类中有display()方法显示方块。七种不同类型的方块使用Shape类表示,方块可以完成显示、自动落下、向左移、向右移、向下移、旋转等动作,使用drawMe()方法、autoDown()方法、moveLeft()、moveRight()方法、moveDown()方法、rotate()方法表示。
根据DAO模式,产生不同方块的工作交给工厂类ShapeFactory类,由它来产生不同的方法,该方法命名为getShape()方法。
方块落下后会变成障碍物,设置障碍物类Ground,它可以将方块变成障碍物,使用accept()方法,然后将其显示出来,使用drawMe()方法。
这样确定的类有四个,这四个类是相对独立的。方块工厂ShapeFactory类产生Shape类的对象。
游戏面板GamePanel类可以接受用户的按键控制方块的各种动作,需要处理按键事件的代码。根据MVC模式的设计思想,需要将处理逻辑的代码独立出来。因此可以将按键事件的处理代码和处理逻辑的代码合为中央控制器类Controller类,该游戏的模型关系如图
划分功能模块
根据游戏的需求,将功能分为方块产生与自动下落、方块的移动与显示、障碍物的生成与消除以及游戏结束等几部分。
方块产生与自动下落模块主要完成七种不同方块及方块旋转90度后的状态表示,使用工厂类创建方块,产生后能够自动下落。
方块的移动与显示模块主要完成方块的左移、向右移、向下移、旋转、显示等功能。
障碍物的生成与消除模块主要完成下落的方块变成障碍物并显示,将障碍物填满一行后消除。
任务二
(1)遵循MVC模式,创建com.teteris.test包,com.teteris.view包,com.teteris.entities包,com.teteris.controller包。
(2)创建Shape类,该类有向左移,向右移,下降,旋转,绘制自身等方法。
public class Shape {
public void moveLeft() {
System.out.println("Shape's moveLeft");
}
public void moveRight() {
System.out.println("Shape's moveRight");
}
public void moveDown() {
System.out.println("Shape's moveDown");
}
public void rotate() {
System.out.println("Shape's rotate");
}
public void drawMe(Graphics g) {
System.out.println("Shape's drawMe");
}
}
(3)创建ShapeFactory类,该类负责产生各种方块。
public class ShapeFactory {
public Shape getShape(ShapeListener listener) {
System.out.println("ShapeFactory's getShape");
return Shape();
}
}
(4)创建Ground类,该类将方块变成障碍物,以及将障碍物重绘。
public class Ground {
public void accept(Shape shape) {
System.out.println("Ground's accept");
}
public void drawMe(Graphics g) {
System.out.println("Ground's drawMe");
}
}
(5)创建GamePanel类,该类作为游戏界面,显示方块和障碍物,由于方块和障碍物会发生变化,因此需要方法对方块和障碍物进行重绘。
public class GamePanel extends JPanel {
private Ground ground;
private Shape shape;
public void display(Ground ground, Shape shape) {