俄罗斯方块JAVA课程设计实验报告毕业设计论文.docx
《俄罗斯方块JAVA课程设计实验报告毕业设计论文.docx》由会员分享,可在线阅读,更多相关《俄罗斯方块JAVA课程设计实验报告毕业设计论文.docx(15页珍藏版)》请在冰豆网上搜索。
俄罗斯方块JAVA课程设计实验报告毕业设计论文
目录
一.引言3
1.1运行环境3
二.需求分析4
2.1开发背景4
2.2设计目的4
2.3功能需求4
三.概要设计4
3.1设计思想4
3.2系统架构5
四.详细设计5
4.1事件处理5
4.2界面设计6
4.3游戏画布类6
4.4方块类8
4.5消行并统计分数13
五.使用说明14
5.1游戏开始运行14
5.2填满一行即消行得分15
5.3列被填满,则游戏自动结束16
六.课程设计总结与体会16
七.参考文献17
一.引言
1.1运行环境
操作系统:
MicrosoftWindowsXP
程序语言:
Java
开发工具:
JCreatorLE4.50
二.需求分析
2.1开发背景
Java是现在全球最时髦的开发工具之一,它拥有一套庞大且完善的类库,内置了其他语言需要靠库甚至是操作系统才能支持的功能。
Java的产生与流行是Internet发展的客观要求。
如今越来越多的应用程序是Java开发的,用Java开发的应用程序可在任何计算平台安全运行。
Java作为一个分布式的,面向对象的程序设计方法,可以让位于任何地方的任何计算机使用网络上的应用程序。
可以说Java是一个万能的开发平台,用Java编程成为一种趋势。
2.2设计目的
通过本次课程设计了解和掌握JDK开发环境以及JCreator等集成开发环境,巩固所学的Java知识及编程机制。
了解Java程序开发流程,学会构思比较复杂的课程设计思想;能合理的利用本学期所掌握的多线程、类、GUI等知识编写一个较为复杂的Java应用软件。
掌握面向对象成学设计的有关概念和开发方法,锻炼团队合作开发精神。
2.3功能需求
本课程设计的目标是设计一个名为《俄罗斯方块》的游戏软件,实现其界面的初始化,程序运行,退出,和相应数据处理。
能实现游戏的基本功能,类似下移、左移、右移、翻转、得分累加等,并在规定时间内达到课题所需要实现的功能及要求。
三.概要设计
3.1设计思想
1)使用JPanel框架,并添加按钮、文本框等对象,用布局管理器定义各个对象的分布。
2)设计一个二维数组来表示方块,默认为不显示。
3)设计一个设计定时线程来控制方块的下落速度。
4)设计七种形状的方块,每种形状定义四种形态来实现方块变换
5)每个方块落到底后判断是否消沉。
3.2系统架构
四.详细设计
4.1事件处理
用actionPerformed()方法实现选择不同类型方块以及控制方块变化功能的实现,用keyPressed()方法实现用键盘控制方块变化功能的实现,在FinalElsBlock.java类中实现事件的监听。
4.2界面设计
游戏基本界面图
4.3游戏画布类
LeftShowCanvas类继承Canvas类,实现方块在画布上的显示,主要代码如下:
packagegame3;
importjava.awt.*;
importjava.awt.event.*;
importjavax.swing.*;
importjavax.swing.event.*;
classLeftShowCanvasextendsCanva
{
intmaxrows,maxcols;//画布最大行数,列数
intunitSize;//单元格的大小,小正方格
int[][]unitState;//每个小方格的状态0、1、2表示
RightPanelrp;
intscore;
publicLeftShowCanvas(RightPanelrp)
{
this.rp=rp;
score=Integer.valueOf(rp.jtf.getText());
maxrows=20;
maxcols=10;
unitSize=20;
unitState=newint[maxrows][maxcols];
initCanvas();
}
publicvoidinitCanvas()//初始化,画布方格
{
for(inti=0;ifor(intj=0;junitState[i][j]=0;
}
publicvoidpaint(Graphicsg)
{
for(inti=0;i{
for(intj=0;jdrawUnit(i,j,unitState[i][j]);//画方格
if(i==3)
{
g.setColor(Color.RED);
g.drawLine(0,(i+1)*(unitSize+1)-1,maxcols
*(unitSize+1)-1,(i+1)*(unitSize+1)-1);
}}}
publicvoiddrawUnit(introw,intcol,inttag)//画方格
{
unitState[row][col]=tag;//记录状态
Graphicsg=getGraphics();
switch(tag)
{
case0:
//初始黑色
g.setColor(Color.BLACK);
break;
case1:
//方格黑色
g.setColor(Color.RED);
break;
case2:
g.setColor(Color.BLUE);
break;
}
g.fillRect(col*(unitSize+1),row*(unitSize+1),unitSize,
unitSize);
}}
4.4方块类
方块类,定义了七种形状的方块,每种形状有四种状态,实现用键盘控制方块的的左移,右移,下移以及翻转。
具体代码如下:
packagegame3;
importjava.awt.*;
importjava.awt.event.*;
importjavax.swing.*;
importjavax.swing.event.*;
classBlockimplementsRunnable//方块类
{
staticfinalinttype=7,state=4;
staticfinalint[][]patten={//16进制代表每种方块
{0x0f00,0x4444,0x0f00,0x4444},//长条
{0x6600,0x6600,0x6600,0x6600},//正方块
{0x04e0,0x0464,0x00e4,0x04c4},//三角
{0x08e0,0x0644,0x00e2,0x044c},//弯折一下,1、3,1左
{0x02e0,0x0446,0x00e8,0x0c44},//弯折一下,1、3,1右
{0x0462,0x006c,0x0462,0x006c},//弯折两下,1、2、1,1左上;1右下
{0x0264,0x00c6,0x0264,0x00c6}//弯折两下,1、2、1,1右上;1左下
};
privateintblockType=-1;//方块类型,7种,大小范围0-6
privateintblockState;//方块状态,4种,大小范围0-3
privateintrow,col;//方块所在的行数,列数
privateintoldRow,oldCol;//记录方块变化前所在的行数,列数
privateintoldType=-1,oldState;//记录方块变化前的类型和状态
privateintisfall=1;//标记若画,画成什么颜色的,
//1表示可以下落,画为红色;0表示不可下落,画为蓝色
privatebooleanend=false;//结束标记,为true时表示结束
LeftShowCanvaslsc;
publicBlock(LeftShowCanvaslsc)
{
this.lsc=lsc;
row=0;
col=3;
oldRow=row;
oldCol=col;
}
publicvoidreInit()//一个方块无法下落后,重新初始化
{
blockType=-1;
isfall=1;
}
publicvoidreInitRowCol()//初始化方块起始点
{
row=0;
col=3;
}
publicvoidrun()//下落线程
{
lsc.requestFocusInWindow();//获得焦点
while(!
end)
{
intblocktype=(int)(Math.random()*100)%7;
drawBlock(blocktype);
do
{try
{Thread.sleep(500);//控制下落速度
}catch(InterruptedExceptione)
{}
}while(fallMove());//下落
for(intj=0;j//判断是否结束
if(lsc.unitState[3][j]==2)
end=true;
}}
publicsynchronizedvoiddrawBlock(intblockType)//画方块
{
if(this.blockType!
=blockType)
blockState=(int)(Math.random()*100)%4;//状态
this.blockType=blockType;//样式
if(!
isMove(3))//判断是否能画
{
this.blockType=oldType;
this.blockState=oldState;
return;
}
intcomIndex=0x8000;
if(this.oldType!
=-1)
{
for(inti=oldRow;ifor(intj=oldCol;j{
if((patten[oldType][oldState]&comIndex)!
=0
&&lsc.unitState[i][j]==1)
lsc.drawUnit(i,j,0);//先还原
comIndex=comIndex>>1;
}}
comIndex=0x8000;
for(inti=row;ifor(intj=col;j
{
if((patten[blockType][blockState]&comIndex)!
=0)
{
if(isfall==1)
lsc.drawUnit(i,j,1);//再画,画为RED
elseif(isfall==0)
{
lsc.drawUnit(i,j,2);//无法下落,画为BLUE
lsc.deleteFullLine(i);//判断此行是否可以消
}}
comIndex=comIndex>>1;
}
if(isfall==0)//无法下落,先判断是否能消行,再重新初始化
{
//lsc.deleteFullLine(row,col);
reInit();
reInitRowCol();
}
oldRow=row;
oldCol=col;
oldType=blockType;
oldState=blockState;
}
publicvoidleftTurn()//旋转,左转
{
if(this.blockType!
=-1)
{
blockState=(blockState+1)%4;
if(isMove(3))
drawBlock(blockType);
else
blockState=(blockState+3)%4;
}}
publicvoidleftMove()//左移
{if(this.blockType!
=-1&&isMove(0))
{
col-=1;
drawBlock(blockType);
}}
publicvoidrightMove()//右移
{
if(this.blockType!
=-1&&isMove
(1))
{col+=1;
drawBlock(blockType);
}}
publicbooleanfallMove()//下移
{
if(this.blockType!
=-1)
{
if(isMove
(2))
{
row+=1;
drawBlock(blockType);
returntrue;
}else
{
isfall=0;
drawBlock(blockType);
returnfalse;
}}
returnfalse;
}
publicsynchronizedbooleanisMove(inttag)//左0,右1,下2,旋转3
{
intcomIndex=0x8000;
for(inti=row;ifor(intj=col;j
{
if((patten[blockType][blockState]&comIndex)!
=0)
{
if(tag==0&&(j==0||lsc.unitState[i][j-1]==2))//是否能左移
returnfalse;
elseif(tag==1&&//是否能右移
(j==lsc.maxcols-1||lsc.unitState[i][j+1]==2))
returnfalse;
elseif(tag==2&&//是否能下移
(i==lsc.maxrows-1||lsc.unitState[i+1][j]==2))
returnfalse;
elseif(tag==3&&//是否能旋转
(i>lsc.maxrows-1||j<0
||j>lsc.maxcols-1||lsc.unitState[i][j]==2))
returnfalse;
}
comIndex=comIndex>>1;
}
returntrue;
}}
4.5消行并统计分数
publicvoiddeleteFullLine(introw)//判断此行是否可以消,同时可消就消行
{
for(intj=0;jif(unitState[row][j]!
=2)
return;
for(inti=row;i>3;i--)
//到此即为可消,将上面的移下消此行
for(intj=0;jdrawUnit(i,j,unitState[i-1][j]);
score++;
rp.jtf.setText(String.valueOf(score));
}
五.使用说明
5.1游戏开始运行
5.2填满一行即消行得分
5.3列被填满,则游戏自动结束
六.课程设计总结与体会
本次课程设计花费我们小组一个月的时间来完成,从设计开始选择课题到最终完成课程设计,小组成员分工明确,相互合作,按时完成相关任务。
通过这次实验,我们学习到了很多Java编码成知识,同时对这个学期的课本所学的知识有了进一步巩固,特别是多线程,Swing组件和事件等能更熟练的运用。
这次实验过后,我们发现,动手比看书更能获取实际有用的知识。
真理是从实践中得知的,而且也只有实践才能检验真理。
而这次实验也加强了我们这些方面的理解能力,对书面上的东西实际操作在具体项目上有了一个更清晰的认识。
我们还意识到一个大的程序,在写代码之前,一定要有良好的需求分析和结构设计,应该占整个程序设计的大部分时间,一个好的程序,分析设计应该要非常充分,这样才不至于代码写了一半才发现很多错误。
很多具体代码操作之前的设计规划和构建才是优秀程序设计的灵魂。
设计过程中,我们另一个大的体会就是合作的好处,通过相互帮助,大大的提高了工作效率。
同时我们也发现自己的不足之处。
而且让我感受比较深的是,做事细心很重要,所谓细节决定成败。
程序还有很多不足,在今后的日子里,我们会虚心向老师同学请教,尽自己最大的努力做到最好。
七.参考文献
[1].李芝兴,杨瑞龙.《Java程序设计之网络编程》.[M].北京:
清华大学出版社
[2].印旻编.《Java语言与面向对象程序设计》.[M].北京:
清华大学出版社
[3].朱站立,沈伟.《Java程序设计实用教程》.[M].北京:
电子工业出版社
指导教师评语:
指导教师签名:
年月日
成绩
教研室审核意见:
教研室主任签字:
年月日
(此为最后一页)
|
|