俄罗斯方块JAVA课程设计实验报告.docx

上传人:b****8 文档编号:10928957 上传时间:2023-02-23 格式:DOCX 页数:17 大小:167.98KB
下载 相关 举报
俄罗斯方块JAVA课程设计实验报告.docx_第1页
第1页 / 共17页
俄罗斯方块JAVA课程设计实验报告.docx_第2页
第2页 / 共17页
俄罗斯方块JAVA课程设计实验报告.docx_第3页
第3页 / 共17页
俄罗斯方块JAVA课程设计实验报告.docx_第4页
第4页 / 共17页
俄罗斯方块JAVA课程设计实验报告.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

俄罗斯方块JAVA课程设计实验报告.docx

《俄罗斯方块JAVA课程设计实验报告.docx》由会员分享,可在线阅读,更多相关《俄罗斯方块JAVA课程设计实验报告.docx(17页珍藏版)》请在冰豆网上搜索。

俄罗斯方块JAVA课程设计实验报告.docx

俄罗斯方块JAVA课程设计实验报告

一.引言

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;i

for(intj=0;j

unitState[i][j]=0;

}

publicvoidpaint(Graphicsg)

{

for(inti=0;i

{

for(intj=0;j

drawUnit(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;i

for(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;i

for(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;i

for(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;j

if(unitState[row][j]!

=2)

return;

for(inti=row;i>3;i--)

//到此即为可消,将上面的移下消此行

for(intj=0;j

drawUnit(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].北京:

电子工业出版社

 

指导教师评语:

 

指导教师签名:

年月日

成绩

教研室审核意见:

 

教研室主任签字:

年月日

(此为最后一页)

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1