JAVA作业Java课程设计实验报告扫雷哈工大选修课作业.docx

上传人:b****6 文档编号:6029695 上传时间:2023-01-03 格式:DOCX 页数:33 大小:161.44KB
下载 相关 举报
JAVA作业Java课程设计实验报告扫雷哈工大选修课作业.docx_第1页
第1页 / 共33页
JAVA作业Java课程设计实验报告扫雷哈工大选修课作业.docx_第2页
第2页 / 共33页
JAVA作业Java课程设计实验报告扫雷哈工大选修课作业.docx_第3页
第3页 / 共33页
JAVA作业Java课程设计实验报告扫雷哈工大选修课作业.docx_第4页
第4页 / 共33页
JAVA作业Java课程设计实验报告扫雷哈工大选修课作业.docx_第5页
第5页 / 共33页
点击查看更多>>
下载资源
资源描述

JAVA作业Java课程设计实验报告扫雷哈工大选修课作业.docx

《JAVA作业Java课程设计实验报告扫雷哈工大选修课作业.docx》由会员分享,可在线阅读,更多相关《JAVA作业Java课程设计实验报告扫雷哈工大选修课作业.docx(33页珍藏版)》请在冰豆网上搜索。

JAVA作业Java课程设计实验报告扫雷哈工大选修课作业.docx

JAVA作业Java课程设计实验报告扫雷哈工大选修课作业

HarbinInstituteofTechnology

课程设计报告

 

课程名称:

JAVA网络设计

设计题目:

扫雷游戏

院系:

电子

班级:

08

设计者:

学号:

指导教师:

辛明影

设计时间:

2010,11,29

 

一,题目分析

扫雷游戏分析:

●扫雷的基本原理

九宫格中(3*3共九个格子),中间的数字代表其周围的地雷个数,即以中间数为中心所在地九格中共有中间那个数的地雷。

比如中间为1,那么以这个1为中心,其周围共八个空格中只有一个是地雷。

●扫雷的基本功能

1)开局:

首先选择游戏等级,然后生成不同等级的雷区界面。

游戏等级分为三级:

各等级方块数为——初级:

9×9、中级:

16×16、高级:

24×24;自定义:

X,各级地雷数分别为10,40,99;雷区每个方块下面或埋藏有1个地雷,或者没有地雷;

2)挖雷:

鼠标点击方块,可挖开它;若所揭方块下有雷,则踩雷,此时所有含地雷的块都标记,该局游戏失败;如果方块上出现数字,它代表在它周围的8个方块中共有多少颗地雷;

3)标记地雷:

在某个光标上点击鼠标右键,则标记此块下埋着地雷(实际上可能是误标),显示为F。

每标记一个地雷,地雷数减少1;

4)自动挖开:

如果某个数字方块周围的地雷全都标记完,则自动将其剩下的方块挖开;

5)扩散:

扫雷程序还会自动展开已确定没有雷的雷区。

如果a[3,4]周围雷数为1,a[2,3]已被标示为地雷,那么a[24],a[25],a[33],a[35],a[43],a[44],a[45]将被展开,一直波及到不可确定的雷区。

6)游戏数据的记录:

对于得分较高的玩家进行统计,保存在“mine.log”文件中。

7)用于记录游戏时间的独立线程,并在界面实时显示游戏时间。

7)总体设计

开发环境:

WindowsXpsp3+NetBeansIDE

1.项目包的UML视图:

图1-项目包视图

项目由三个包组成:

●saolei.game.mine功能:

这个包是游戏的核心,其中实现了主界面,核心算法,图片管理,等级记录等功能

●saolei.awt功能:

实现LedNumber类,把数字格式化为液晶显示图片

●saolei.swing功能:

实现AboutDialog类,响应about事件。

2.saolei.swing包UML视图

图二-saolei.swing包视图

AboutDialog继承自JDialog,并实现了actionPerformed方法来监听事件,这个监听接口用来捕捉从主界面传来的About事件,其中JTextArea组件中的文字,通过根目录下的“readme.txt”读入。

3.saolei.awt包视图

图三-saolei.awt包视图

实现了LedNumber类,用于把数字格式化为液晶字体图像。

主要用来解决计时器的液晶显示问题。

4..saolei.game.mine包UML视图

图四-saolei.mine包UML视图

这是游戏的核心类

●CustomDialog类功能:

用于用户自定义扫雷的难度(及规模大小)

●ImageFactory类功能:

用于游戏中所有的图片的管理,用于返回指定ID的ImageIcon类型图片。

●LevelInfo类功能:

实现序列化接口Serializable,用于对游戏数据(对应的用户名和分数)的存储。

●LogDialog类功能:

继承自Jdialog,从文件读取游戏最高分的数据,并通过对话框显示。

●MainFrame类

功能:

游戏的核心类

子类GridMouseAdapter继承自MouseAdapter类,实现鼠标事件的捕捉,如:

鼠标进入组件,鼠标退出组件,鼠标按下,鼠标松开等事件,通过调用ImageFactory的方法,实现图片的切换和显示,实时更新用户界面。

子类StatusMouseAdapter继承自MouseAdapter类,该类根据鼠标事件和当前的游戏状况,对状态栏的图片等进行修改。

子类TimeThread类继承自Thread类,在游戏开始的时候创建这样一个独立线程,用于对游戏的时间进行记录。

●MineGrid类功能:

MineGrid类对应的就是扫雷界面的每一个小方块,其继承自JLabel类,在构造函数中传入ImageIcon类,用来显示图片,其中设置了status变量,用来记录当前区块的状态:

CLICKED,LABELED,NORMAL(被选中,被标记,正常)

对应逻辑关系:

状态

是否可以选中

是否可以标记

是否可以双击

clicked

false

false

true

labeled

false

true

false

normal

true

true

false

●UserDialog类功能:

当成绩突破记录的时候,用来记录数据的对话框。

5.项目类UML视图

图五-UMLofClassrelationship

三、数据结构设计

除了大部分的类(Class)外,扫雷程序没有涉及到复杂的数据结构,界面区块也只采用数组存储.

四、算法设计

●图像化的实现

每一个区块需要用不同的图片来表示不同的状态,可以通过继承JLabel控件,来模拟每一个雷区。

●扫雷功能的实现

图六-扫雷过程演示

每次点击方块时,程序自动判断方块的红色区域是否有雷,上图表明,以2为绿色方块为中心的8个方块中个,共有2个雷。

1)用户点击到的是雷区:

游戏失败,程序把所有的雷区显示出来

2)用户点击到的是正常区:

游戏继续进行,调用相关的扩散算法(见扩散实现部分)。

3)用户点击右键:

把相该区块的status属性标记为labeled。

4)当所有雷区已被标记,游戏结束,进入相关的数据记录程序。

●扫雷扩散功能的实现

图七-扫雷的扩散示意

当点击到空白的方格式,需要最大限度地显示其附近方块的雷区信息,所以可以采用递归的方法,来判断周围的雷区情况。

具体算法见算法实现部分。

●计时器的实现

创建继承自Thread类的TimeThread类,重构run方法,并结合LedNumber把数字转换为Led模式,在屏幕显示出来。

●游戏记录的存储和序列化技术的使用

JavaSE中提供了Serializable序列化接口,为了保存在存中的各种对象的状态(也就是实例变量,不是方法),并且可以把保存的对象状态再读出来Java提供一种保存对象状态的机制-序列化.

序列化过程:

图八-对象序列化流程

五、物理实现及结果

1.主要数据结构的物理设计

●MineGrid类的设计

CLICKED,LABELED,NORMAL分别是用来表示雷区状态的常数,MineGrid类还包括雷区的大小,x,y坐标等。

●CustomDialog类的设计

用户自定义窗口界面,其中变量包括widthField(输入宽度的JTextField组件),heighField(记录高度的JTextField组件),按钮(JButton组件)

●ImageFactory类的设计

images:

存储所有ImageIcon类型图片的数组

getImageicon:

取得特定的图片。

●MainFrame类的设计

2.核心算法的物理实现

●可视化的实现

publicclassMineGridextendsJLabel{

publicstaticfinalintCLICKED=0;

publicstaticfinalintLABELED=1;

publicstaticfinalintNORMAL=2;

publicstaticfinalintSIZE=16;

publicstaticintxBound;

publicstaticintyBound;

privateintx,y;

privateintstatus;

privatebooleanmark;

intxlow;

intylow;

intxhigh;

intyhigh;

publicMineGrid(intx,inty){

super();

this.x=x;

this.y=y;

status=NORMAL;

mark=false;

xhigh=x;

yhigh=y;

xlow=x;

ylow=y;

if(x>0)xlow--;

if(x

if(y>0)ylow--;

if(y

}

//函数略

}

●扩散功能

voidcheckMine(introw,intcol){

inti,j;

i=row<0?

0:

row;

i=i>9?

9:

i;

j=col<0?

0:

col;

j=j>9?

9:

j;

if(mine.mine[i][j]==9){

bomb(i,j);

}elseif(mine.mine[i][j]==0

&&mineButton[i][j].getClickFlag()==false){

mineButton[i][j].setClickFlag(true);

showLabel(i,j);

for(intii=i-1;ii<=i+1;ii++)

for(intjj=j-1;jj<=j+1;jj++)

checkMine(ii,jj);

}else{

showLabel(i,j);

mineButton[i][j].setClickFlag(true);

}

if(isWin()){

win();

}

}

●计时器

privateclassTimeThreadextendsThread{

publicTimeThread(){}

//对Run方法进行重构

publicvoidrun(){

finalThreadcurrentThread=Thread.currentThread();

while(timepassed<1000&¤tThread==timeThread){

//changetimeLabel

SwingUtilities.invokeLater(

//innerclassRunnable

newRunnable(){

publicvoidrun(){

timeLabel.setIcon(newImageIcon(led.getLedImage(timepassed,3)));

}

}

);

try{

Thread.sleep(999);

}catch(InterruptedExceptioni){

System.err.println("sleepinterrupted");

}

timepassed++;

}

}//endofmethodrun

}

●序列化存储的实现

//实现Serializable接口

classLevelLogimplementsSerializable{

//变量略

……

publicvoidsetRecord(intr){

record=r;

}

publicvoidsetUserName(Stringname){

user=name;

}

publicintgetRecord(){

returnrecord;

}

publicStringgetUserName(){

returnuser;

}

publicStringtoString(){

returnrecord+"\t"+user+"\n";

}

}

2.实现结果

●可视化效果

[用户自定义游戏][扫雷扩散][扫雷失败]

●序列化存储

[对象序列化后的字节码]

六、结果分析

本课程设计完成了扫雷游戏的基本工作。

并且设计了菜单,对话框等可视化图形界面,使其更具有实用性,方便人们操作,同时通过序列化技术完成了对游戏数据的存储和读入。

七、结论

本次课程设计完成了扫雷游戏的基本过程,并给出了相应的图形化界面模拟演示。

通过本次课程设计,训练了对Java中JLabel等基本组件的应用和掌握。

并对面向对象的程序设计技术(Java)和多线程技术有了一定的锻炼。

对集成开发环境NetBeansIDE有了一定程度的熟练。

八、附录(主要功能函数代码)

MineFrame:

packagesaolei.game.mine;

/**

*

*authorkit

*/

importjava.awt.*;

importjava.awt.event.*;

importjava.io.*;

importjavax.swing.*;

importsaolei.awt.LedNumber;

importsaolei.swing.AboutDialog;

publicclassMainFrameextendsJFrameimplementsActionListener{

//UIcomponents

privateJLabelmineLabel;

privateJLabeltimeLabel;

privateJLabelstatusButton;

privateJPanelgridPanel;

privateJPanelstatusPanel;

privateDimensiongpd;

privateDimensionspd;

privateMineGridgrid[][];

privatebooleanmode[][];

privatefinalintmargin=7;

privatefinalinttitleh=52;

privateintxBound;

privateintyBound;

privateintmineCount;

privateintshowCount;//theamountofgridsopened

privateintleftCount;//theamountofminesnotlabeled

privateinttimepassed;

privatebooleanfirstClick;

privatebooleanmarkCheck;

//MenuComponents

privateJMenuItemstartItem;

privateJMenuItemexitItem;

privateJMenuItemlogItem;

privateJMenuItemaboutItem;

privateJRadioButtonMenuItemlevelItem[];

privateJCheckBoxMenuItemmarkCheckItem;

//Gameinformations

privateLevelInfolevelInfo;

privateintcurrentLevel;

privateLevelLoglog[];

privateLedNumberled;

privateGridMouseAdaptergma;

privateStatusMouseAdaptersma;

privateTimeThreadtimeThread;

publicMainFrame(){

super("扫雷");

//default

currentLevel=0;

levelInfo=LevelInfo.DEFAULT_LEVEL[currentLevel];

log=newLevelLog[3];

for(inti=0;i<3;i++)

log[i]=newLevelLog();

//readfromfile

readLog();

led=newLedNumber();

gma=newGridMouseAdapter();

sma=newStatusMouseAdapter();

//setupmenus

setMenuBar();

setStatusPanel();

resetPane();

addWindowListener(

newWindowAdapter(){

publicvoidwindowClosing(WindowEvente){

writeLog();

System.exit(0);

}

}

);

setIconImage(ImageFactory.getInstance().getImageicon(16).getImage());

setResizable(false);

}

//executionapplication

publicstaticvoidmain(Stringargs[]){

MainFrameapplication=newMainFrame();

try{

UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

}catch(Exceptione){}

}

//fileoperation

privatevoidreadLog(){

try{

FilelogFile=newFile("mine.log");

if(!

logFile.exists())return;

ObjectInputStreamois=newObjectInputStream(newFileInputStream(logFile));

for(inti=0;i<3;i++){

log[i]=(LevelLog)ois.readObject();

}

markCheck=ois.readBoolean();

currentLevel=ois.readInt();

if(currentLevel==3){

levelInfo=(LevelInfo)ois.readObject();

}else{

levelInfo=LevelInfo.DEFAULT_LEVEL[currentLevel];

}

ois.close();

}catch(Exceptione){System.out.println("readfail");}

}

privatevoidwriteLog(){

try{

FilelogFile=newFile("mine.log");

ObjectOutputStreamoos=newObjectOutputStream(newFileOutputStream(logFile));

for(inti=0;i<3;i++){

oos.writeObject(log[i]);

}

oos.writeBoolean(markCheck);

oos.writeInt(currentLevel);

if(currentLevel==3){

oos.writeObject(levelInfo);

}

oos.close();

}catch(Exceptione){System.out.println("writefail");}

}

/*

*addstatuslabeltostatuspanel

*/

privatevoidsetStatusPanel(){

JPaneltemp;

statusPanel=newJPanel(newBorderLayout());

mineLabel=newJLabel();

mineLabel.setBorder(BorderFactory.createLoweredBevelBorder());

temp=newJPanel(newFlowLayout(1,4,4));

temp.add(mineLabel);

temp.setBackground(Color.LIGHT_GRAY);

statusPanel.add(temp,BorderLayout.WEST);

timeLabel=newJLabel();

timeLabel.setBorder(BorderFactory.createLoweredBevelBorder());

temp=newJPanel(newFlowLayout(1,4,4));

temp.add(timeLabel);

temp.setBackground(Color.LIGHT_GRAY);

statusPanel.add(temp,BorderLayout.EAST);

statusButton=newJLabel();

statusButton.setBorder(BorderFactory.createRaisedBevelBorder());

statusButton.addMouseListener(sma);

temp=newJPanel(newFlowLayout(1,0,4));

temp.setBackground(Color.LIGHT_GRAY);

temp.add(statusButton);

statusPanel.add(temp,BorderLayout.CENTER);

statusPanel.setSize(10,37);

status

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

当前位置:首页 > 自然科学

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

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