俄罗斯方块.docx
《俄罗斯方块.docx》由会员分享,可在线阅读,更多相关《俄罗斯方块.docx(35页珍藏版)》请在冰点文库上搜索。
![俄罗斯方块.docx](https://file1.bingdoc.com/fileroot1/2023-5/6/5789140a-9f3e-4627-8f8c-5cb62ac89a2b/5789140a-9f3e-4627-8f8c-5cb62ac89a2b1.gif)
俄罗斯方块
河南城建学院
《JAVA基础》课程设计
设计说明书
课程名称:
《JAVA基础》课程设计
设计题目:
俄罗斯方块
指导教师:
陈红军崔雪冰
班级:
学号:
学生姓名:
同组人员:
计算机科学与工程学院
2015年1月9日
目录
第1章选题2
1.1题目背景2
1.2系统实现的具体分工3
1.2.1选题3
1.2.2团队分工3
1.3开发环境3
第2章设计内容3
2.1实现功能3
2.2概要设计(涉及类的框图)5
2.3界面设计6
第3章系统实现11
3.1涉及知识点11
3.2系统运行(主要运行界面抓图)12
3.3源程序清单(关键代码)12
第4章测试与实验结果22
第5章结束语23
参考文献24
第1章选题
1.1题目背景
本题目将设计一个俄罗斯方块。
它是一款风靡全球的电视游戏机游戏和掌上游戏机游戏,由俄罗斯人阿列克谢.帕基特诺夫发明,由此得名。
俄罗斯方块的基本规则是移动、旋转和摆放游戏自动输出的各种方块,使之排列成完整的一行或多行并且消除满行得分。
由于上手简单、老少皆宜,从而家喻户晓,风靡世界。
其主要运用的设计方法有:
(1)游戏主方法的设计
在主方法中首先为ERS_Block建立一个对象ers且将游戏的界面命名为“俄罗斯方块游戏”,然后为框架添加了一个窗口事件类WindowListener监听器。
(2)游戏信息窗体的设计
在本游戏右边信息窗口中设计了分数、级数2个标签和对应的2个文本框以及开始游戏、提高等级、降低等级、游戏暂停和退出游戏五个命令按钮。
(3)方块形状与画方块的设计
在Block这个类首先定义一个二维数组pattern[][]存储方块的不同形状,并用16进制表示其中一共包含了7种不同的形状的方块图形,分别是‘一’字形,“Z”字形,反“Z”字形,“L”字形,反“L”字形,田字形以及“T”字形,每种形状的方块可以以90度为单位发生翻转形成反向的方块图形。
(4)满行删除方法的设计
设计成功的俄罗斯方块游戏,必须要达到在方块满行的实现消去满行的功能,在这里利用设计的deleteFullLine()方法来实现此功能,并在此同时实现分数的增加。
(5)方块翻转的设计
在Block类中定义一个无返回值的方法leftTurn()实现方块的翻转,在leftTurn()方法体中使用if条件判断,在条件当中调用判断是否正确的方法assertValid(),在此方法中包含了四个参数分别为方块类型,方块的翻转状态以及方块的横坐标和纵坐标。
(6)方块移动的设计
在此功能中实现产生的每个的方块的移动的方法分为左移、右移和下落三种方法,在leftMov()方法体中使用if条件判断,在条件当中调用判断是否正确的方法assertValid(),在此方法中包含了四个参数分别为方块类型,方块的翻转状态以及方块的横坐标和纵坐标。
(7)实现按钮功能方法的设计
按钮功能的方法的实现首先定义一个方法actionPerformed(),在方法体内定义一个switch分支结构选择执行相应的功能,用case进行选择。
1.2系统实现的具体分工
1.2.1选题
在个人电脑日益普及的今天,一些有趣的桌面游戏已经成为人们在使用计算机进行工作或学习之余休闲娱乐的首选,而俄罗斯方块游戏是人们最熟悉的小游戏之一,它以其趣味性强,易上手等诸多特点得到了大众的认可,因此开发此游戏软件可满足人们的一些娱乐需求。
此俄罗斯方块游戏可以为用户提供一个可在普通个人电脑上运行的,界面美观的,易于控制的俄罗斯方块游戏。
1.2.2团队分工
表1.1项目分工一览表
角色
姓名
承担的具体任务
组长
刘盼杰
游戏区操作的实现,显示操作结果以及部分游戏算法的编写
组员
贾佳佳
游戏结束的结果,方块的构造与变形,以及部分算法的编写
组员
庞婷婷
游戏界面的设计,游戏控制按钮功能实现,文档编写等
1.3开发环境
编程工具:
JDK+ECLIPSE(+MySQL)
计算机:
PC
操作系统:
MicrosoftWindows7.0
第2章设计内容
2.1实现功能
(1)显示游戏的方块形状
游戏玩家打开游戏界面,点击开始游戏,便会在游戏整个界面的左面依次显示不同
形状的方块。
图一:
俄罗斯方块类型图
(2)显示方块的移动
游戏玩家可根据自己的想法,来改变游戏界面上方出现的方块的位置,使其达到满行消除的结果
图二:
俄罗斯方块状态图
2.2概要设计(涉及类的框图)
2.3界面设计
(1)游戏整体界面
在游戏整体界面窗口中包含了游戏画布界面和功能区两个模块。
图三:
俄罗斯方块游戏主界面图
(2)游戏说明界面
在游戏开始之前,游戏玩家可以先看一下游戏说明,以防止在玩的过程中按错键造成游戏得分较低的后果,对游戏有更深层次的了解。
如图所示:
图四:
游戏说明界面图
(3)提高等级后的界面
提高游戏等级在游戏等级文本框中显示相应的等级数,游戏玩家可以通过提高等级按钮改变游戏的等级,当游戏的等级发生相应的改变时,给玩家的变化是游戏方块下落的速度也会发生相应的变化,等级提高便是游戏方块的下落速度变快,如图所示:
图五:
提高等级界面
(4)降低等级后的界面
降低等级在游戏中显示相应的等级数,原理和提高游戏等级一样,等级降低会使游戏中方块的下落速度变慢。
如图所示:
图六:
降级等级界面
(5)游戏运行界面
在游戏运行过程中,游戏画布的顶端会随机产生不确定的不同形状的方块图片,并且自动下落,在下落的过程中,可以通过玩家的操作改变方块的形状,直到达到玩家所预想的形状,直到方块下落到游戏画布的底端,方块停止下落,如果有方块满行,则会进行自动删除操作,并且分数自动进行增加且在分数显示文本框中显示玩家在游戏过程中获得的游戏分数。
如图所示:
图七:
游戏运行界面
(6)游戏结束界面
当玩家在游戏过程中使未删除的方块行数达到画布的最顶端时,俄罗斯方块游戏便结束了,玩家点击开始游戏按钮可以重新开始游戏。
如图所示:
图八:
游戏结束界面
(7)退出游戏界面
当玩家退出游戏时可直接点击退出游戏键,或者不小心点到该键,可进行相应的选择,决定是否退出该游戏界面。
如图所示:
图九:
退出游戏界面
第3章系统实现
3.1涉及知识点
绘制面板、创建标签、文本框、以及异常处理、事件监听器、以及GameCanvas、Commad、Block、MyTimer、WinListener类。
3.2系统运行(主要运行界面抓图)
图十:
俄罗斯方块主界面
3.3源程序清单(关键代码)
packageexample;
importjava.awt.*;
importjava.awt.event.*;
importjavax.swing.*;
//俄罗斯方块类
publicclassERS_BlockextendsJFrame{
publicstaticbooleanisPlay=false;//表明该模板未播放的一种状态
publicstaticintlevel=1,score=0;
publicstaticTextFieldscoreField,levelField;//定义消息对象
publicstaticMyTimertimer;//定时器
GameCanvasgameScr;//提供了游戏的借口,能直接得到键盘的物理状态
publicstaticvoidmain(String[]argus){
ERS_Blockers=newERS_Block("俄罗斯方块游戏V1.0Author:
Vincent");
WindowListenerwin_listener=newWinListener();//监听器
ers.addWindowListener(win_listener);
JOptionPane.showMessageDialog(ers,"游戏说明:
\n1:
方向键控制俄罗斯方块移动的方向."+
"\n2:
空格键控制俄罗斯方块的类型装换."+
"\n3:
单击'开始游戏'游戏开始."+
"\n4:
单击'游戏暂停'暂停游戏,再次单击该键则继续游戏."+
"\n5:
单击'提高等级或降低等级'可以设置难度等级."+
"\n6:
单击'退出游戏'则游戏结束.");
}
//俄罗斯方块类的构造方法
ERS_Block(Stringtitle){
super(title);//调用父类得构造方法
setSize(700,490);//设置框架的尺寸
setLayout(newGridLayout(1,2));//设置框架的布局流
gameScr=newGameCanvas();
gameScr.addKeyListener(gameScr);//为该对象注册键盘点击监听器
timer=newMyTimer(gameScr);
timer.setDaemon(true);//虚拟光驱
timer.start();
timer.suspend();//暂停,延缓
add(gameScr);
PanelrightScr=newPanel();//Panel是最简单的容器类
rightScr.setLayout(newGridLayout(2,1,0,30));
rightScr.setSize(120,500);
add(rightScr);
rightScr.setBackground(Color.white);
//右边信息窗体的布局
MyPanelinfoScr=newMyPanel();
infoScr.setLayout(newGridLayout(4,1,0,5));
infoScr.setSize(120,300);
rightScr.add(infoScr);
infoScr.setBackground(Color.white);
//定义标签和初始值
Labelscorep=newLabel("分数:
",Label.LEFT);
Labellevelp=newLabel("级数:
",Label.LEFT);
scoreField=newTextField();
levelField=newTextField();
scoreField.setEditable(false);
levelField.setEditable(false);
infoScr.add(scorep);
infoScr.add(scoreField);
infoScr.add(levelp);
infoScr.add(levelField);
scorep.setSize(newDimension(20,60));//Dimension类封装单个对象中组件的宽度和高度(精确到整数)。
该类与组件的某个属性关联。
scoreField.setSize(newDimension(20,60));
levelp.setSize(newDimension(20,60));
levelField.setSize(newDimension(20,60));
scoreField.setText("0");
levelField.setText("1");
//右边控制按钮窗体的布局
MyPanelcontrolScr=newMyPanel();
controlScr.setLayout(newGridLayout(5,1,0,5));
rightScr.add(controlScr);
controlScr.setBackground(Color.white);
//定义按钮play
Buttonplay_b=newButton("开始游戏");
play_b.setSize(newDimension(100,200));
play_b.addActionListener(newCommand(Command.button_play,gameScr));
//定义按钮LevelUP
Buttonlevel_up_b=newButton("提高级数");
level_up_b.setSize(newDimension(50,200));
level_up_b.addActionListener(newCommand(Command.button_levelup,gameScr));
//定义按钮LevelDown
Buttonlevel_down_b=newButton("降低级数");
level_down_b.setSize(newDimension(50,200));
level_down_b.addActionListener(newCommand(Command.button_leveldown,gameScr));
//定义按钮LevelPause
Buttonpause_b=newButton("游戏暂停");
pause_b.setSize(newDimension(50,200));
pause_b.addActionListener(newCommand(Command.button_pause,gameScr));
//定义按钮Quit
Buttonquit_b=newButton("退出游戏");
quit_b.setSize(newDimension(50,200));
quit_b.addActionListener(newCommand(Command.button_quit,gameScr));
controlScr.add(play_b);
controlScr.add(level_up_b);
controlScr.add(level_down_b);
controlScr.add(pause_b);
controlScr.add(quit_b);
setVisible(true);
gameScr.requestFocus();
}
}
//重写MyPanel类,使Panel的四周留空间
classMyPanelextendsJPanel{
publicInsetsgetInsets(){
returnnewInsets(30,50,30,50);
}
}//(庞婷婷)
//游戏画布类
classGameCanvasextendsCanvasimplementsKeyListener{
finalintunitSize=30;//小方块边长
introwNum;//正方格的行数
intcolumnNum;//正方格的列数
intmaxAllowRowNum;//允许有多少行未削
intblockInitRow;//新出现块的起始行坐标
intblockInitCol;//新出现块的起始列坐标
int[][]scrArr;//屏幕数组
Blockb;//对方块的引用
//画布类的构造方法
GameCanvas(){
rowNum=15;
columnNum=10;
maxAllowRowNum=rowNum-2;
b=newBlock(this);
blockInitRow=rowNum-1;
blockInitCol=columnNum/2-2;
scrArr=newint[32][32];
}
//初始化屏幕,并将屏幕数组清零的方法
voidinitScr(){
for(inti=0;ifor(intj=0;jscrArr[i][j]=0;
b.reset();//调用随机函数
repaint();//重新画方块
}
//重新刷新画布方法
publicvoidpaint(Graphicsg){
for(inti=0;ifor(intj=0;jdrawUnit(i,j,scrArr[i][j]);
}
//画方块的方法
publicvoiddrawUnit(introw,intcol,inttype){//实现方块的颜色
scrArr[row][col]=type;
Graphicsg=getGraphics();
switch(type){//表示画方块的方法
case0:
g.setColor(Color.lightGray);
break;//以背景为颜色画方块
case1:
g.setColor(Color.blue);
break;//画正在下落的方块
case2:
g.setColor(Color.magenta);
break;//画已经落下的方块
}
g.fill3DRect(col*unitSize,getSize().height-(row+1)*unitSize,unitSize,unitSize,true);
g.dispose();//取消画笔
}
publicBlockgetBlock(){
returnb;//返回block实例的引用
}
//返回屏幕数组中(row,col)位置的属性值
publicintgetScrArrXY(introw,intcol){
if(row<0||row>=rowNum||col<0||col>=columnNum)
return(-1);//防止越界
else
return(scrArr[row][col]);
}
//调用函数,实现方块的横坐标和纵坐标
//返回新块的初始行坐标方法
publicintgetInitRow(){
return(blockInitRow);//返回新块的初始行坐标
}
//返回新块的初始列坐标方法
publicintgetInitCol(){
return(blockInitCol);//返回新块的初始列坐标
}
//满行删除方法
voiddeleteFullLine(){
intfull_line_num=0;
intk=0;
for(inti=0;ibooleanisfull=true;
L1:
for(intj=0;jif(scrArr[i][j]==0){//此列无方块存在
k++;//自加1
isfull=false;
breakL1;
}
if(isfull)
full_line_num++;//行数累加变量进行自加表示删除了一行方块
if(k!
=0&&k-1!
=i&&!
isfull)//方块未满行
for(intj=0;jif(scrArr[i][j]==0)
drawUnit(k-1,j,0);//以背景为颜色画方块
else
drawUnit(k-1,j,2);//画已经落下的方块
scrArr[k-1][j]=scrArr[i][j];
}
}
for(inti=k-1;ifor(intj=0;jdrawUnit(i,j,0);
scrArr[i][j]=0;
}
}
ERS_Block.score+=10*full_line_num;
ERS_Block.scoreField.setText(""+ERS_Block.score);//显示分数
}
//判断游戏是否结束方法
booleanisGameOver(){
for(intcol=0;colif(scrArr[maxAllowRowNum][col]!
=0)
returntrue;
}
returnfalse;
}
publicvoidkeyTyped(KeyEvente){
}
publicvoidkeyReleased(KeyEvente){
}
//处理键盘输入的方法
publicvoidkeyPressed(KeyEvente){
if(!
ERS_Block.isPlay)
return;
switch(e.getKeyCode()){
caseKeyEvent.VK_DOWN:
b.fallDown();break;
caseKeyEvent.VK_LEFT:
b.leftMove();break;
caseKeyEvent.VK_RIGHT:
b.rightMove();break;
caseKeyEvent.VK_SPACE:
b.leftTurn();break;
}
}
}
//处理控制类
classCommandimplementsActionListener{
staticfinalintbutton_play=1;//给按钮分配编号
staticfinalintbutton_levelup=2;
staticfinalintbutton_leveldown=3;
staticfinalintbutton_quit=4;
staticfinalintbutton_pause=5;
staticbooleanpause_resume=true;
intcurButton;//当前按钮
GameCanvasscr;
//控制按钮类的构造方法