JAVA作业Java课程设计实验报告扫雷哈工大选修课作业.docx
- 文档编号:6029695
- 上传时间:2023-01-03
- 格式:DOCX
- 页数:33
- 大小:161.44KB
JAVA作业Java课程设计实验报告扫雷哈工大选修课作业.docx
《JAVA作业Java课程设计实验报告扫雷哈工大选修课作业.docx》由会员分享,可在线阅读,更多相关《JAVA作业Java课程设计实验报告扫雷哈工大选修课作业.docx(33页珍藏版)》请在冰豆网上搜索。
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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- JAVA 作业 课程设计 实验 报告 扫雷 哈工大 选修课