JAVA作业Java课程设计实验报告扫雷哈工大选修课作业Word文件下载.docx
- 文档编号:19025164
- 上传时间:2023-01-03
- 格式:DOCX
- 页数:33
- 大小:161.44KB
JAVA作业Java课程设计实验报告扫雷哈工大选修课作业Word文件下载.docx
《JAVA作业Java课程设计实验报告扫雷哈工大选修课作业Word文件下载.docx》由会员分享,可在线阅读,更多相关《JAVA作业Java课程设计实验报告扫雷哈工大选修课作业Word文件下载.docx(33页珍藏版)》请在冰豆网上搜索。
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
true
labeled
normal
●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<
xBound-1)xhigh++;
if(y>
0)ylow--;
if(y<
yBound-1)yhigh++;
}
//函数略
}
●扩散功能
voidcheckMine(introw,intcol){
inti,j;
i=row<
0?
0:
row;
i=i>
9?
9:
i;
j=col<
col;
j=j>
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{
}
if(isWin()){
win();
●计时器
privateclassTimeThreadextendsThread{
publicTimeThread(){}
//对Run方法进行重构
publicvoidrun(){
finalThreadcurrentThread=Thread.currentThread();
while(timepassed<
1000&
currentThread==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(){
FilelogFile=newFile("
mine.log"
if(!
logFile.exists())return;
ObjectInputStreamois=newObjectInputStream(newFileInputStream(logFile));
for(inti=0;
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(){
ObjectOutputStreamoos=newObjectOutputStream(newFileOutputStream(logFile));
oos.writeObject(log[i]);
oos.writeBoolean(markCheck);
oos.writeInt(currentLevel);
oos.writeObject(levelInfo);
oos.close();
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.add(timeLabel);
statusPanel.add(temp,BorderLayout.EAST);
statusButton=newJLabel();
statusButton.setBorder(BorderFactory.createRaisedBevelBorder());
statusButton.addMouseListener(sma);
temp=newJPanel(newFlowLayout(1,0,4));
temp.add(statusButton);
statusPanel.add(temp,BorderLayout.CENTER);
statusPanel.setSize(10,37);
status
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- JAVA 作业 课程设计 实验 报告 扫雷 哈工大 选修课
![提示](https://static.bdocx.com/images/bang_tan.gif)