java俄罗斯方块开发文档.docx
- 文档编号:26398094
- 上传时间:2023-06-19
- 格式:DOCX
- 页数:29
- 大小:177.50KB
java俄罗斯方块开发文档.docx
《java俄罗斯方块开发文档.docx》由会员分享,可在线阅读,更多相关《java俄罗斯方块开发文档.docx(29页珍藏版)》请在冰豆网上搜索。
java俄罗斯方块开发文档
java俄罗斯方块开发文档
俄罗斯方块游戏
项目介绍
俄罗斯方块(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类,该类有向左移,向右移,下降,旋转,绘制自身等方法。
publicclassShape{
publicvoidmoveLeft(){
System.out.println("Shape'smoveLeft");
}
publicvoidmoveRight(){
System.out.println("Shape'smoveRight");
}
publicvoidmoveDown(){
System.out.println("Shape'smoveDown");
}
publicvoidrotate(){
System.out.println("Shape'srotate");
}
publicvoiddrawMe(Graphicsg){
System.out.println("Shape'sdrawMe");
}
}
(3)创建ShapeFactory类,该类负责产生各种方块。
publicclassShapeFactory{
publicShapegetShape(ShapeListenerlistener){
System.out.println("ShapeFactory'sgetShape");
returnShape();
}
}
(4)创建Ground类,该类将方块变成障碍物,以及将障碍物重绘。
publicclassGround{
publicvoidaccept(Shapeshape){
System.out.println("Ground'saccept");
}
publicvoiddrawMe(Graphicsg){
System.out.println("Ground'sdrawMe");
}
}
(5)创建GamePanel类,该类作为游戏界面,显示方块和障碍物,由于方块和障碍物会发生变化,因此需要方法对方块和障碍物进行重绘。
publicclassGamePanelextendsJPanel{
privateGroundground;
privateShapeshape;
publicvoiddisplay(Groundground,Shapeshape){
System.out.println("GamePanl'sdisplay");
this.ground=ground;
this.shape=shape;
this.repaint();
}
protectedvoidpaintComponent(Graphicsg){
if(shape!
=null&&ground!
=null){
shape.drawMe(g);
ground.drawMe(g);
}
}
publicGamePanel(){
this.setSize(300,300)
}
}
(6)创建Controller类,该类继承按键适配器,实现用户对方块的各种操作。
publicclassControllerextendsKeyAdapterimplementsShapeListener{
privateShapeshape;
privateShapeFactoryshapeFactory;
privateGamePanelgamePanel;
privateGroundground;
publicvoidkeyPressed(KeyEvente){
switch(e.getKeyCode()){
caseKeyEvent.VK_UP:
if(ground.isMoveable(shape,Shape.ROTATE))
shape.rotate();
break;
caseKeyEvent.VK_DOWN:
if(ground.isMoveable(shape,Shape.DOWN))
shape.moveDown();
break;
caseKeyEvent.VK_LEFT:
if(ground.isMoveable(shape,Shape.LEFT))
shape.moveLeft();
break;
caseKeyEvent.VK_RIGHT:
if(ground.isMoveable(shape,Shape.RIGHT))
shape.moveRight();
break;
}
gamePanel.display(ground,shape);
}
publicvoidnewGame(){
shape=shapeFactory.getShape(this);
}
publicController(ShapeFactoryshapeFactory,Groundground,GamePanelgamePanel){
this.shapeFactory=shapeFactory;
this.ground=ground;
this.gamePanel=gamePanel;
}
@Override
publicvoidshapeMoveDown(Shapeshape){
gamePanel.display(ground,shape);
}
@Override
publicsynchronizedbooleanisShapeMoveDownable(Shapeshape){
if(ground.isMoveable(shape,Shape.DOWN)){
returntrue;
}
ground.accept(this.shape);
if(!
ground.isFull()){
this.shape=shapeFactory.getShape(this);
}
returnfalse;
}
}
任务三
俄罗斯方块游戏中有七种不同形状的方块,每种方块还可以进行旋转变形产生不同的状态,这些都需要在程序中描述它们。
同时,方块的自动下落功能也需要实现
(1)定义图形及其不同状态
游戏中是不同形状的方块在游戏面板的不同位置移动,可以将游戏面板看为由20*10的小方格组成。
面板的原点坐标在左上角,水平向右为X轴正反向,垂直向下为Y轴正方向。
在下方的小方格代表障碍物,不同的小方格可以表示不同的方块以及它们的不同状态。
1)修改Shape类,添加方块的定义。
publicclassShape{
privateint[][]body;
privateintstatus;
publicvoidsetBody(int[][]body){
this.body=body;
}
publicvoidsetStatus(intstatus){
this.status=status;
}
}
2)修改ShapeFactory类,添加方块的状态。
publicclassShapeFactory{
privateintshapes[][][]=newint[][][]{
//I
{
{0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0},
{0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0},
{0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0},
{0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0}
},
//s
{
{0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0},
{1,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0},
{0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0},
{1,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0}
},
//z
{
{1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0},
{0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0},
{1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0},
{0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0}
},
//j
{
{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}
},
//o
{
{1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0},
{1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0},
{1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0},
{1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0}
},
//l
{
{1,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0},
{1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0},
{1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0},
{0,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0}
},
//t
{
{0,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0},
{0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0},
{1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0},
{0,1,0,0,0,1,1,0,0,1,0,0,0,0,0,0}
}
};
publicShapegetShape(ShapeListenerlistener){
System.out.println("ShapeFactory'sgetShape");
Shapeshape=newShape();
shape.addShapeListener(listener);
inttype=newRandom().nextInt(shapes.length);
shape.setBody(shapes[type]);
shape.setStatus(0);
returnshape;
}
}
(2)创建ShapeListener接口,该接口对方块自动下落方法进行定义。
publicinterfaceShapeListener{
voidshapeMoveDown(Shapeshape);
}
(3)修改Shape类,定义ShapeListener监听器,定义多线程,实现方块自动下降。
publicclassShape{
privateShapeListen{
privateclassShapeDriverimplementsRunnable{
@Override
publicvoidrun(){
while(listener.isShapeMoveDownable(Shape.this)){
moveDown();
listener.shapeMoveDown(Shape.this);
try{
Thread.sleep(1000);
}catch(Exceptione){
e.printStackTrace();
}
}
}
}
publicShape(){
newThread(newShapeDriver()).start();
}
publicvoidaddShapeListener(ShapeListenerl){
if(l!
=null){
this.listener=l;
}
}
}
(4)修改Controller类,实现ShapeListener接口。
publicclassControllerextendsKeyAdapterimplementsShapeListener{
@Override
publicvoidshapeMoveDown(Shapeshape){
gamePanel.display(ground,shape);
}
@Override
publicsynchronizedbooleanisShapeMoveDownable(Shapeshape){
booleanresult=ground.isMoveable(shape,Shape.DOWN);
returnfalse;
}
}
(5)修改ShapeFactory类,给方块添加ShapeListener监听器
publicclassShapeFactory{
publicShapegetShape(ShapeListenerlistener){
System.out.println("ShapeFactory'sgetShape");
Shapeshape=newShape();
shape.addShapeListener(listener);
returnshape;
}
}
(6)新建一个Test类,完成游戏中各个类的组装。
publicclassTest{
publicstaticvoidmain(String[]args){
ShapeFactoryshapeFactory=newShapeFactory();
Groundground=newGround();
GamePanelgamePanel=newGamePanel();
Controllercontroller=newController(shapeFactory,ground,gamePanel);
JFrameframe=newJFrame();
frame.setSize(gamePanel.getSize().width+10,gamePanel.getSize().height+10);
frame.add(gamePanel);
gamePanel.addKeyListener(controller);
frame.addKeyListener(controller);
frame.setVisible(true);
controller.newGame();
}
}
任务四
用户单击键盘上得方向键,可以控制方块左移,右移或向下移。
需要注意游戏的界面是有边界的,当图形到达游戏界面边界时,应不能继续移动。
图形类里面要保存自己的位置信息,
用left表示图形到左边界的距离,top表示图形到上边界的距离
图形移动就是改变left和top的值
1)创建Global类,存储项目中所需常亮
publicclassGlobal{
publicstaticfinalintCELL_SIZE=20;
publicstaticfinalintWIDTH=15;
publicstaticfinalintHEIGHT=15;
}
2)修改Shape类,完成方块绘制
publicclassShape{
publicvoiddrawMe(Graphicsg){
g.setColor(Color.GREEN);
for(intx=0;x<4;x++){
for(inty=0;y<4;y++){
if(getFlagByPoint(x,y)){
g.fill3DRect((left+x)*Global.CELL_SIZE,(top+y)*Global.CELL_SIZE,Global.CELL_SIZE,
Global.CELL_SIZE,true);
}
}
}
System.out.println("Shape'sdrawMe");
}
privatebooleangetFlagByPoint(intx,inty){
returnbody[status][y*4+x]==1;
}
}
3)修改GamePanel类,修改绘制方法
publicclassGamePanelextendsJPanel{
protectedvoidpaintComponent(Graphicsg){
g.setColor(newColor(0x0c));
g.fillRect(0,0,300,300);
if
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- java 俄罗斯方块 开发 文档