版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
年4月19日扫雷游戏课程设计报告整合文档仅供参考,不当之处,请联系改正。《面向对象程序设计》课程设计报告题目:扫雷游戏设计院(系):计算机与电子系专业班级:计算机科学与技术0903班学生姓名:============学号:============指导教师:=======2012年6月4日至20华中科技大学武昌分校制面向对象程序设计课程设计任务书一、设计(调查报告/论文)题目扫雷游戏设计二、设计(调查报告/论文)主要内容内容:Windows系统提供的扫雷游戏是一个很有趣的游戏。这里使用Java语言编写一个与其类似的扫雷游戏。基本功能与要求:1.扫雷游戏分为初级,中级和高级三个级别,扫雷英雄榜存储每个级别的最好成绩,即挖出全部的地雷且用时最少者。游戏菜单能够选择“初级”,“中级”和“高级”或“查看英雄榜”。2.选择级别后将出现相应级别的扫雷区域,这时用户使用鼠标左键单击雷区中的任何一个方块启动计时器。3.用户要揭开某个方块,可单击它。若所揭方块下有雷,用户便输了这一局,若所揭方块下无雷,则显示数字,该数字代表方块周围的八个方块中共有多少颗雷。4.如果用户认为某个方块下埋有地雷,单击右键能够在方块上标识一个用户认为是雷的图标,即给出一个扫雷标记。用户每标记出一个扫雷标记(无论用户标记是否正确),程序将显示剩余雷数减少一个。5.扫雷胜利后(用时最少者),程序弹出保存成绩对话框。三、原始资料1.《面向对象程序设计课程设计》指导书2.耿祥义.JAVA大学实用教程.北京:清华大学出版社,.四、要求的设计(调查/论文)成果1.课程设计报告2.课程设计软件五、进程安排布置任务,查找资料、需求分析1天总体设计1天详细设计1.5天编制源程序实现3.5天测试与修改1天撰写课设报告2天六、主要参考资料[1]张广彬.Java课程设计案例精编(第二版).北京:清华大学出版社,.[2]耿祥义.Java课程设计(第二版).北京:清华大学出版社,.[3]耿祥义.JAVA大学实用教程.北京:清华大学出版社,.[4]邹林达.陈国君Java2程序设计基础.北京:清华大学出版社,.[5]邹林达.Java2程序设计基础实验指导.北京:清华大学,.指导教师(签名):20年月日详细设计编码实现系统测试1.1.1扫雷游戏概述扫雷是一种具有迷惑性的对记忆和推理能力的简单测试,它是长久以来最受欢迎的Windows游戏之一。游戏目标:找出空方块,同时避免触雷。1.1.2扫雷的操作方法游戏主区域由很多个方格组成。使用鼠标随机点击一个方格,方格即被打开并显示出方格中的数字;方格中数字则表示其周围的8个方格隐藏了几颗雷;如果点开的格子为空白格,即其周围有0颗雷,则其周围格子自动打开。例如,方格中出现1,说明上下左右及斜角合计有一颗雷,依次类推,2则有2颗,3则有3颗。1.1.3游戏具有的功能=1\*ROMANI.能够显示主菜单和界面游戏需要提供主菜单让玩家进行游戏设置,同时能够显示当前剩余的地雷数量及当前花费时间等相关信息到界面上。=2\*ROMANII.能够接收鼠标输入功能能够接收玩家的鼠标输入功能,左键和右键输入。=3\*ROMANIII.能够根据规则翻转相应的格子翻动指定位置的格子。=4\*ROMANIV.能够标示指定格子的功能即能够对确定或者怀疑是地雷的格子进行"旗子"和"?"符号的标示。=5\*ROMANV.游戏胜负判断功能当玩家单击的格子中有地雷时,判定玩家失败,游戏结束。当扫雷游戏中全部格子被打开时,判定玩家成功。=6\*ROMANVI英雄榜记录更新当有玩家把当前等级的地雷全部扫出来后,而且时间比记录中的时间短时,在结束游戏时,要求玩家把名字保存下来。游戏初始时时间为999秒。例如,当第一个玩家把全部地雷扫出来的时间为120秒,这时玩家的记录时间将被保存下来并作为记录时间线。直到有玩家的时间少于120秒,才能更新当前记录时间线并保存玩家的名字。userDefine.javaBlockBlock图1-1类之间的组合关系MineGameFileShowRecordMineAreaRecordBlockViewLayMinesJButtonJLabeluserDefine帮助帮助图1-2功能图扫雷游戏主界面重新开始关于扫雷游戏低级中级高级英雄榜开始退出自定义userDefine类是详细设计JFrameJFrameActionListenerMineGamebar:JMenuBar;fileMenu,heipMenu:JMenu开始,初级,中级,高级,英雄榜,自定义,退出,关于:JMenuItemmineArea:MineArea英雄榜:FileshowHeroRecord:ShowRecordMineGame():无类型actionPerformed(ActionEvent)main(String[]):void图2-1MineGame类的UML图MineAreaMineArearow,colum,mineCount,markMount:intlay:LayMinesblock:Block[][]record:RecordblockView:BlockView[][] resStart:JButtonshowTime:JTextField time:TimershowMarkedMineCount:JTextFieldinitMineArea(int,int,int,int):voidshow(intm,intn):voidactionPerformed(ActionEvent):voidinquireWin():voidmousePressed(MouseEvent):voidJPanelActionListenerMouseListenerMineGamemineArea:MineArea图2-2MineArea类的UML图以下是UML图中有关数据和方法的详细说明。成员变量a.Block是Block类型的数组,用来确定雷区有多少需进行扫雷的方块。b.blockView是Blockview类型的数组,负责为block数组中的Block对象提供视图。c.Lay是LayMines类型的对象,负责设置block数组中的哪些方块是雷或不是雷。d.Record负责提供保存成绩的界面,是一个对话框,默认不可见。用户只有扫雷成功后(用时最少),才能看见该对话框。e.reStart是一个按钮对象,用户单击它重新开始游戏。f.time是计时器对象,负责计算用户的用时。2)方法A.initMineArea(int,int,int,int)方法可根据参数提供的数据设置雷区的宽度,高度,雷的数目以及雷区的级别。B.actionPerformed(ActionEvent)是MIneArea类实现ActionListener接口中的方法。当用户单击blockView中的某个方块时,actionPerformed(ActionEvent)方法负责执行有关算法,例如,当用鼠标左键单击方块上的按钮后,若该方块下有雷,actionPerformed(ActionEvent)方法将使用户输掉本局,若该方块下又雷,actionPerformed(ActionEvent)方法将显示BlockView对象中的标签,该标签上是一个数字,该数字代表当前方块的周围的8个方块中总共有多少颗雷。C.show()方法是一个递归方法。actionPerformed(ActionEvent)方法执行时将调用show方法进行扫雷。D.mousePress(MouseEvent)方法是MineArea类实现的MouseListener接口中的方法,当用户按下鼠标右键时,mousePress(MouseEvent)方法负责让方块上显示一个探雷标记。E.inquireWin()方法用来判断用户是否扫雷成功,如果成功该方法负责让record对话框可见。所谓扫雷成功是指不但找到了全部的雷而且用时最少。Block对象负责封装雷区中方块中的数据以及对这些数据的操作,外观效果由Blockview负责提供(见后面的BlockView)。Block类创立的对象是数组block的单元的对象。Block型数组block是MineArea类的重要成员之一。标明Block类的主要成员变量和方法以及和MineArea类之间的组合关系的UML图如下图2-3所示。图2-3Block类的UML图以下是UML图中有关数据的方法的详细说明。1)成员变量是方块上的名字。b.aroundMineNumber是方块周围雷的数目。c.mineIcon是方块上雷的图标。d.sMine用来表示方块是否是雷。e.isMark用来表示方块是否被标记。f.isOpen用来表示方块是否被挖开。2)方法A.setAroundMineNumber(int)方法用来设置aroundMineNumber的值。B.getAroundMineNumber()方法用来获取aroundMineNumber的值。BlockView创立的对象负责为Block对象提供视图,以便用户经过该视图与Block对象交互。BlockView对象使用一个标签和按钮为Block对象提供视图,标签和按钮按着卡片布局层叠在一起,默认状态按钮遮挡住标签。当用户单击按钮后,如果Block对象时雷,BlockView对象中的标签显示的事雷的图标;如果Block对象不是雷,标签显示的是周围雷的总数。BlockView类是javax。swing包中JPanel类的一个子类,创立的对象是数组blockView的单元中的对象。BlockView型数组BlockView是MineArea类的重要成员之一。标明BlockView类的主要成员变量和方法以及和MineArea类之间的组合关系的UML图如图2-4所示。图2-4BlockView类的UML图以下是UML图中有关数据的方法的详细说明。1)成员变量a.blockNameOrIcon用来显示Block对象的name,number和mineIcon属性。b.blockCover用来遮挡blockNameOrIcon。c.card卡片布局。2)方法A.giveView(Blockblock)方法给参数指定的Block对象提供视图,如果Block对象的isMine属性为true,即方块是雷,那么blockNameOrIcon标签上设置的文本就是Block对象的name属性的值,同时blockNameOrIcon标签上设置的图标就是Block对象的mineIcon指定的图标。如果Block对象的isMine属性为false,blockNameOrIcon标签上设置的图标就是Block对象的aroundMineNumber属性的值,及周围雷的数目B.seeblockNameOrIcon()方法让用户看见视图中的标签,无法看见按钮。C.seeblockNameOrIcon(0方法让用户看见视图中的按钮,无法看见标签。LayMines对象使用随机算法制定MineArea对象中的哪些Block对象是雷,哪些对象不是雷,没有可现实的效果图。LayMines创立的对象Lay是MineArea中的重要成员,表明该类的主要成员变量和方法以及和MineArea类之间组合关系的UML图如图2-5所示。图2-5LayMines类的UML图以下是UML图中有关数据的方法的详细说明。1)成员变量mineIcon用来存放一个格式为gif的图像。2)方法layMinesForBlock(Block[][],in)方法对参数指定的Block数组进行设置,其中int参数指定雷的数目,当指定Block数组中每个单元中的方块是雷时,就将该房快上的图标设置为mineIcon,当指定Block数组中每个单元中的方块不是雷时,就将该方块的名字设置为周围的雷的数目。Record创立的对象负责提供保存成绩的界面。Record是javax。swing包中jDialog对话框的子类,并实现了ActionListener接口。Record创立的对象:record是MineArea类的成员之一,当用户扫雷成功时,该对象提供了保存成绩到文件的界面。标明Record类的主要成员变量,方法以及和MineArea类之间组合关系的UML图如图2-6所示。图2-6Record类的UML图以下是UML图中有关数据的方法的详细说明。1)成员变量·textName提供用户扫雷优胜者输入姓名·用户单击”确定“按钮,能够保存成绩2)方法·actionPerformed(ActionEvent)方法是Record类实现的ActionListener接口中的方法,当用户单击”确定“按钮后,该方法被执行,所执行的操作就是获取用户输入的名字和用时然后调用writeRecord(String,String)方法将信息写入”英雄榜“中。·writeRecord(String,String)方法负责将有关信息扫雷用时,扫雷级别,扫雷优胜者姓名等心思写入到”英雄榜“文件。ShowRecord创立的对象负责提供显示成绩的界面。ShowRecord是javax。swing包中JDialog对话框的子类,并实现了ActionListener接口。ShowReacord创立的对象showHeroRecord是MineGame类的成员之一,当用户选择查看"英雄榜“菜单项时,该对话框可见,提供了查看扫雷的最好成绩的界面。标明ShowRecord类的主要成员变量,方法以及和MineGame类之间组合关系的UML图如图2-7所示。图2-7ShowRecord类的UML图以下是UML图中有关数据的方法的详细说明。成员变量·File存放文件的引用·用户单击”显示成绩“按钮,能够查看各个级别扫雷的最好成绩。·用户单击”重新计分“按钮,能够将”英雄榜“中的成绩恢复为初始值。2)方法·actionPerformed(ActionEvent)方法是ShowRecord类实现的ActionListener接口中的方法,当用户单击”显示成绩“按钮后,该方法被执行,所执行的操作就是调用readAndShow()方法。·readAndShow()方法负责读取存放在文件中的各个级别的扫雷最好成绩以及扫雷者姓名,并显示这些相关信息。userDefine类userDefine是java.awt包中Rame框架的子类,并实现了ActionListener接口。userDefine创立的对像:usedefine是MineArea类的成员之一,当用户点击菜单栏中的游戏->自定义时,弹出界面,在界面的文本框中输入相应的数字。然后单击确定即可,或者单击取消退出界面。标明userDefine类的主要成员变量、方法以及和MineArea类之间的组合关系的UML图如图2-8所示。JFrameJFrameActionListeneruserDefinerow,colum,mineCount,score:JLableex1,ex2,ex3,ex4:JLablerow1,colum1,mineCount1,score1:JTextFieldcon1,con2,con3,con4:JPanel确定,取消:JButtonactionPerformed(ActionEvent)setVisible(boolean):void图2-8userDefine类的UML图MineAreauserdefin:userDefine以下是UML图中有关数据和方法的详细说明。1)成员变量a.row,colum,mineCount,score:分别用来显示行数,列数,雷数,分数b.row1,colum1,mineCount1,score1:用来自定义雷区的长度值,宽度值,所有的雷数值以及每赢一局所得的分数c.ex1,ex2,ex3,ex4::用来说明上述内容d.con1,con2,con3,con4:用来装Label和TextFiled,以方便布局e.确定,取消;单击“确定”后,如果输入的内容合法,就会实现自定义的雷区,如果不合法的话,就会弹出一个警告框,提示输入有误;单击“取消”退出自定义窗口。2)方法actionPerformrd(ActonEvent)方法是userDefine类中实现的ActionListener接口中的方法,当用户单击界面的“确定”,该方法被执行,所执行的操作就是,将用户输入的信息传入程序,实验自定义雷区的难度级别。当用户单击界面的“取消”,该方法被执行,所执行的操作就是,退出用户自定义界面。编码实现各个类的的主要源代码实现如下:importjava.awt.event.*;//包含事件类importjava.awt.*;//包含抽象窗口工具集中的图形文本、窗口GUI类importjavax.swing.*;//包含SWING组件importjavax.swing.Box.Filler;importjavax.swing.border.*;//包含布局类importjava.util.*;//包含有用的数据类型类importjava.util.List;importjava.io.*;//包含输入流和输出流类importjavax.swing.ImageIcon;//包含图标publicclassMineGameextendsJFrameimplementsActionListener{JMenuBarmenubar; //负责创立菜单条JMenuItem开始,初级,中级,高级,扫雷英雄榜,自定义,退出,关于;//负责创立菜单项JMenufileMenu,helpMenu;//负责创立菜单ImageIconapp;//负责创立标题栏的图标JLabell1,l2,l3,l4;JTextAreata;MineAreamineArea=null;File英雄榜=newFile("英雄榜.txt");//创立文件保存记录Hashtablehashtable=null;ShowRecordshowHeroRecord=null;userDefineuserdefine=newuserDefine();//调用userDefine类MineGame(){mineArea=newMineArea(8,8,10,1);add(mineArea,BorderLayout.CENTER);app=newImageIcon("app.gif");//给标题栏创立图标setIconImage(app.getImage());//获取图标并调用类实现setTitle("扫雷");//加入标题字段menubar=newJMenuBar();//创立菜单条JMenufileMenu=newJMenu("游戏(G)");//创立菜单JMenuhelpMenu=newJMenu("帮助(H)");//创立菜单fileMenu.setMnemonic('G');helpMenu.setMnemonic('H');开始=newJMenuItem("开始");//创立菜单项开始.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F2,0));//添加快捷方式初级=newJMenuItem("初级");中级=newJMenuItem("中级");高级=newJMenuItem("高级");扫雷英雄榜=newJMenuItem("扫雷英雄榜");扫雷英雄榜.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F4,0));自定义=newJMenuItem("自定义",KeyEvent.VK_S);自定义.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F5,0));退出=newJMenuItem("退出");关于=newJMenuItem("关于");关于.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F1,0));fileMenu.add(开始);//加入菜单的容器fileMenu.addSeparator();//加入分隔符fileMenu.add(初级);fileMenu.add(中级);fileMenu.add(高级);fileMenu.addSeparator();fileMenu.add(扫雷英雄榜);fileMenu.addSeparator();fileMenu.add(自定义);fileMenu.addSeparator();fileMenu.add(退出);helpMenu.add(关于);menubar.add(fileMenu);//加入菜单条的容器menubar.add(helpMenu);setJMenuBar(menubar);//完成封装//添加事件监听器开始.addActionListener(this);初级.addActionListener(this);中级.addActionListener(this);高级.addActionListener(this);扫雷英雄榜.addActionListener(this);自定义.addActionListener(this);退出.addActionListener(this);关于.addActionListener(this);//设置英雄榜hashtable=newHashtable();hashtable.put("初级","初级#"+999+"#匿名");hashtable.put("中级","中级#"+999+"#匿名");hashtable.put("高级","高级#"+999+"#匿名");if(!英雄榜.exists()){try{FileOutputStreamout=newFileOutputStream(英雄榜);ObjectOutputStreamobjectOut=newObjectOutputStream(out);objectOut.writeObject(hashtable);objectOut.close();out.close();}catch(IOExceptione){}}showHeroRecord=newShowRecord(this,hashtable);setBounds(100,100,300,300);setVisible(true);//设为可见setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//结束窗体所在的应用程序validate();}//负责执行菜单发出的有关命令 publicvoidactionPerformed(ActionEvente){ if(e.getSource()==开始){ mineArea.initMineArea(8,8,10,1);//默认为初级}if(e.getSource()==初级){ mineArea.initMineArea(8,8,10,1); setBounds(100,100,300,300);mineArea.showTime.setText("0");mineArea.time.stop();}if(e.getSource()==中级){mineArea.initMineArea(16,16,40,2);setBounds(100,100,500,500);mineArea.showTime.setText("0");mineArea.time.stop();}if(e.getSource()==高级){mineArea.initMineArea(22,22,99,3);setBounds(100,100,650,650);mineArea.showTime.setText("0");mineArea.time.stop();}if(e.getSource()==扫雷英雄榜){if(showHeroRecord!=null)showHeroRecord.setVisible(true);}if(e.getSource()==自定义){ userdefine.setVisible(true); }if(e.getSource()==退出){ System.exit(0); }if(e.getSource()==关于){ JDialogdialog=newJDialog(); dialog.setTitle("关于帮助"); FlowLayoutfl=newFlowLayout(); dialog.setLayout(fl); dialog.setSize(500,500); dialog.setVisible(true); Strings="扫雷游戏的规则如下:"; finalJLabell1=newJLabel(); l1.setText(s); l1.setForeground(newColor(0,0,0)); l1.setFont(newFont("Dialog",10,20)); //l1.setBounds(60,84,345,26); finalJLabell2=newJLabel("1,游戏区包括雷区、地雷计数器和计时器."); finalJLabell3=newJLabel("2,经过单击即可挖开方块,如果挖开的是地雷,则您输掉游戏."); finalJLabell4=newJLabel("3,如果方块上出现数字,表示在其周围的八个方块中共有多少颗地雷"); dialog.add(l1); dialog.add(l2); dialog.add(l3); dialog.add(l4); setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); if(dialog!=null){dialog.setVisible(true); } }validate();} publicstaticvoidmain(Stringargs[]){ MineGamemg=newMineGame();}}publicMineArea(introw,intcolum,intmineCount,intgrade){reStart=newJButton("重新开始");mark=newImageIcon("flag.gif");//探雷标记time=newTimer(1000,this);showTime=newJTextField(3);showMarkedMineCount=newJTextField(3);showTime.setHorizontalAlignment(JTextField.CENTER);showMarkedMineCount.setHorizontalAlignment(JTextField.CENTER);showMarkedMineCount.setFont(newFont("Arial",Font.BOLD,16));showTime.setFont(newFont("Arial",Font.BOLD,16));showTime.setEditable(false);//不可更改showMarkedMineCount.setEditable(false);pCenter=newJPanel();//创立面板pSouth=newJPanel();la1=newJLabel(newImageIcon("app.gif"));la2=newJLabel(newImageIcon("time.gif"));pCenter.setBorder(BorderFactory.createLoweredBevelBorder());lay=newLayMines();initMineArea(row,colum,mineCount,grade);//初始化雷区reStart.addActionListener(this);pSouth.add(la1);pSouth.add(showMarkedMineCount);pSouth.add(reStart);pSouth.add(showTime);pSouth.add(la2);setLayout(newBorderLayout());add(pSouth,BorderLayout.SOUTH);add(pCenter,BorderLayout.CENTER);}publicvoidinitMineArea(introw,intcolum,intmineCount,intgrade){pCenter.removeAll();spendTime=0;markMount=mineCount;this.row=row;this.colum=colum;this.mineCount=mineCount;this.grade=grade;block=newBlock[row][colum];for(inti=0;i<row;i++){for(intj=0;j<colum;j++)block[i][j]=newBlock();}lay.layMinesForBlock(block,mineCount);blockView=newBlockView[row][colum];pCenter.setLayout(newGridLayout(row,colum));for(inti=0;i<row;i++){for(intj=0;j<colum;j++){blockView[i][j]=newBlockView();blockView[i][j].giveView(block[i][j]);//给block[i][j]提供视图pCenter.add(blockView[i][j]);blockView[i][j].getBlockCover().addActionListener(this);blockView[i][j].getBlockCover().addMouseListener(this);blockView[i][j].seeBlockCover();blockView[i][j].getBlockCover().setEnabled(true);blockView[i][j].getBlockCover().setIcon(null);}}showMarkedMineCount.setText(""+markMount);validate();}//当用户单击BlockView中的某个方块时,执行有关算法publicvoidactionPerformed(ActionEvente){ //点击Block方块区域 if(e.getSource()!=reStart&&e.getSource()!=time){time.start();//开始计时intm=-1,n=-1;for(inti=0;i<row;i++){for(intj=0;j<colum;j++){if(e.getSource()==blockView[i][j].getBlockCover()){m=i;n=j;break;}}}//鼠标左键单击方块上的按钮,if(block[m][n].isMine()){//如果该方块有雷,则用户输掉本局 for(inti=0;i<row;i++){for(intj=0;j<colum;j++){blockView[i][j].getBlockCover().setEnabled(false);if(block[i][j].isMine())blockView[i][j].seeBlockNameOrIcon();}} time.stop(); spendTime=0; markMount=mineCount; }else{//若该方块下面没有雷show(m,n);//见本类后面的show方法}}elseif(e.getSource()==reStart){ initMineArea(row,colum,mineCount,grade); time.stop(); showTime.setText("0");}elseif(e.getSource()==time){ spendTime++; showTime.setText(""+spendTime); }inquireWin();}//显示周围雷数publicvoidshow(intm,intn){ if(block[m][n].getAroundMineNumber()>0&&block[m][n].getIsOpen()==false){//周围有雷blockView[m][n].seeBlockNameOrIcon();block[m][n].setIsOpen(true);return;} elseif(block[m][n].getAroundMineNumber()==0&&block[m][n].getIsOpen()==false){//周围没有雷blockView[m][n].seeBlockNameOrIcon();block[m][n].setIsOpen(true);for(intk=Math.max(m-1,0);k<=Math.min(m+1,row-1);k++){for(intt=Math.max(n-1,0);t<=Math.min(n+1,colum-1);t++)show(k,t);}}}publicvoidmousePressed(MouseEvente){JButtonsource=(JButton)e.getSource();for(inti=0;i<row;i++){for(intj=0;j<colum;j++){ //单击右键的情况下if(e.getModifiers()==InputEvent.BUTTON3_MASK&&source==blockView[i][j].getBlockCover()){ if(block[i][j].getIsMark()){//方块未被标记source.setIcon(null);block[i][j].setIsMark(false);markMount=markMount+1;showMarkedMineCount.setText(""+markMount); }else{//方块被标记source.setIcon(mark);block[i][j].setIsMark(true);markMount=markMount-1;showMarkedMineCount.setText(""+markMount);} }}}publicvoidsetName(Stringicon){//设置不是雷的情况this.icon=icon;}publicStringgetName(){//获取名字,即雷的图标returnicon;}publicvoidsetAroundMineNumber(intn){//设置周围的雷数aroundMineNumber=n;}publicintgetAroundMineNumber(){//获取周围的雷数returnaroundMineNumber;}publicbooleanisMine(){//判断是否是雷returnisMine;}publicvoidsetIsMine(booleanb){//设置是否是雷isMine=b;}publicvoidsetMineIcon(ImageIconicon){//设置是雷时的图标mineIcon=icon;}publicImageIcongetMineicon(){//获取图标returnmineIcon;}publicbooleangetIsOpen(){returnisOpen;}publicvoidsetIsOpen(booleanp){//是否被挖开isOpen=p;}publicbooleangetIsMark(){returnisMark;}publicvoidsetIsMark(booleanm){//是否被标记isMark=m;}//使用一个标签和按钮,为Block对象提供视图。publicclassBlockViewextendsJPanel{JLabelblockNameOrIcon;//用来显示Block对象的name、number和mineIcon属性JButtonblockCover;//用来遮挡blockNameOrIcon.CardLayoutcard;//卡片式布局BlockView(){ card=newCardLayout();//创立卡片式布局 setLayout(card); blockNameOrIcon=newJLabel("",JLabel.CENTER);blockNameOrIcon.setHorizontalTextPosition(AbstractButton.CENTER);blockNameOrIcon.setVerticalTextPosition(AbstractButton.CENTER);blockCover=newJButton();//创立按钮add("cover",blockCover);add("view",blockNameOrIcon);}publicvoidgiveView(Blockblock){if(block.isMine){//方块是雷,设置雷的图标blockNameOrIcon.setText(block.getName());blockNameOrIcon.setIcon(block.getMineicon());}else{//方块不是雷,显示周围雷的数目intn=block.getAroundMineNumber();if(n>=1){blockNameOrIcon.setText(""+n);if(n==1)blockNameOrIcon.setForeground(newColor(255,0,0));if(n==2)blockNameOrIcon.setForeground(newColor(0,0,255));if(n==3)blockNameOrIcon.setForeground(newColor(0,255,0));if(n==4)blockNameOrIcon.setForeground(newColor(125,200,200));if(n==5)blockNameOrIcon.setForeground(newColor(200,0,50));}else//周围没有雷blockNameOrIcon.setText("");}}publicvoidseeBlockNameOrIcon(){//只能看见视图中的标签card.show(this,"view");validate();}publicvoidseeBlockCover(){//只能看见视图中的按钮card.show(this,"cover");validate();}publicJButtongetBlockCover(){returnblockCover;}}//使用随机算法指定MineArea对象中的哪些Block对象是雷,哪些不是publicclassLayMines{ ImageIconmineIcon=newImageIcon("app.gif");;//创立雷的图标publicvoidlayMinesForBlock(Blockblock[][],intmineCount){introw=block.length;intcolumn=block[0].length;LinkedList<Block>list=newLinkedList<Block>();for(inti=0;i<row;i++){for(intj=0;j<column;j++)list.add(block[i][j]);}while(mineCount>0){intsize=list.size();//list返回节点的个数intrandomIndex=(int)(Math.random()*size);Blockb=list.get(randomIndex);b.setIsMine(true);b.setMineIcon(mineIcon);list.remove(randomIndex);//list删除索引值为randomIndex的节点mineCount--;}for(inti=0;i<row;i++){for(intj=0;j<column;j++){if(block[i][j].isMine()){//该方块设为雷,在该方块上设置图标block[i][j].setIsOpen(false);block[i][j].setIsMark(false);}else{//该方块设为不是雷,设置周围雷的数目intmineNumber=0;for(intk=Math.max(i-1,0);k<=Math.min(i+1,row-1);k++){for(intt=Math.max(j-1,0);t<=Math.min(j+1,column-1);t++){if(block[k][t].isMine())mineNumber++;}}block[i][j].setIsOpen(false);block[i][j].setIsMark(false);block[i][j].setName(""+mineNumber);block[i][j].setAroundMineNumber(mineNumber);}}}//提供保存成绩的界面publicRecord(){setTitle("记录你的成绩");//新界面的标题this.time=time;this.grade=grade;setBounds(100,100,240,160);setResizable(false);setModal(true);确定=newJButton("确定");取消=newJButton("取消");textName=newJTextField(8);textName.setText("匿名");确定.addActionListener(this);取消.addActionListener(this);Containercon=getContentPane();con.setLayout(newGridLayout(2,1));label=newJLabel("您现在是...高手,输入您的大名上榜");con.add(label);JPanelp=newJPanel();p.add(textName);p.add(确定);p.add(取消);con.add(p);setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);}publicvoidsetGrade(Stringgrade){this.grade=grade;label.setText("您现在是"+grade+"高手,输入您的大名上榜");}publicvoidsetTime(inttime){this.time=time;}publicvoidactionPerformed(ActionEvente){if(e.getSource()==确定){message=grade+"#"+time+"#"+""+textName.getText();key=grade;writeRecord(key,message);setVisible(false);}if(e.getSource()==取消){setVisible(false);}}publicvoidwriteRecord(Stringkey,Stringmessage){Filef=newFile("英雄榜.txt");try{FileInputStreamin=newFileInputStream(f);ObjectInputStreamobject_in=newObjectInputStream(in);Hashtablehashtable=(Hashtable)object_in.readObject();object_in.close();in.close();Stringtemp=(String)hashtable.get(key);StringTokenizerfenxi=newStringTokenizer(temp,"#");fenxi.nextToken();intn=Integer.parseInt(fenxi.nextToken());if(time<n){hashtable.put(key,message);FileOutputStreamout=newFileOutputStream(f);ObjectOutputStreamobject_out=newObjectOutputStream(out);object_out.writeObject(hashtable);object_out.close();out.close();}}catch(Exceptione){System.out.println(e);}}//提供成绩界面publicclassShowRecordextendsJDialogimplementsActionListener{Filefile=newFile("英雄榜.txt");//创立文件保存英雄榜Stringname=null;Hashtablehashtable=null;//散列表JButton显示,重新记分;//创立两个按钮JLabellabel初级[],label中级[],label高级[];//用标签定义三个数组publicShowRecord(JFrameframe,Hashtableh){setTitle("扫雷英雄榜");hashtable=h;setBounds(100,100,320,185);setResizable(false);setVisible(false);setModal(true);label初级=newJLabel[3];label中级=newJLabel[3];label高级=newJLabel[3];for(inti=0;i<3;i++){label初级[i]=newJLabel();label初级[i].setBorder(null);label中级[i]=newJLabel();label中级[i].setBorder(null);label高级[i]=newJLabel();label高级[i].setBorder(null);}label初级[0].setText("初级");label初级[1].setText(""+999);label初级[1].setText("匿名");label中级[0].setText("中级");label中级[1].setText(""+999);label中级[1].setText("匿名");label高级[0].setText("高级");label高级[1].setText(""+999);label高级[1].setText("匿名");JPanelpCenter=newJPanel();pCenter.setLayout(newGridLayout(3,3));for(inti=0;i<3;i++)pCenter.add(label初级[i]);for(inti=0;i<3;i++)pCenter.add(label中级[i]);for(inti=0;i<3;i++)pCenter.add(label高级[i]);pCenter.setBorder(BorderFactory.createTitledBorder("扫雷英雄榜"));显示=newJButton("显示成绩");重新记分=newJButton("重新记分");显示.addActionListener(this);重新记分.addActionListener(this);JPanelpSouth=newJPanel();pSouth.setLayout(newFlowLayout(FlowLayout.RIGHT));pSouth.add(重新记分);pSouth.add(显示);add(pCenter,BorderLayout.CENTER);add(pSouth,BorderLayout.SOUTH);}//读取存放在文件中的各个级别的扫雷最好成绩及相关信息publicvoidreadAndShow(){try{ FileInputStreamin=newFileInputStream(file); ObjectInputStreamobject_in=newObjectInputStream(in);hashtable=(Hashtable)object_in.readObject();object_in.close();in.close();Stringtemp=(String)hashtable.get("初级");StringTokenizerfenxi=newStringTokenizer(temp,"#");label初级[0].setText(fenxi.nextToken());label初级[1].setText(fenxi.nextToken());label初级[2].setText(fenxi.nextToken());temp=(String)hashtable.get("中级");fenxi=newStringTokenizer(temp,"#");label中级[0].setText(fenxi.nextToken());label中级[1].setText(fenxi.nextToken());label中级[2].setText(fenxi.nextT
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 航空业员工福利与激励制度
- 2024年中国电信运营商基础设施租赁合同
- 北师大版四年级语文上全册教案
- 2024年 edition 物业管理服务合同
- 2024-2025学年宜宾市叙州区高三语文上学期第一次模拟试卷(附答案解析)
- 人教版部编本二年级下册《一匹出色的马》教案设计
- 中班科学公开课教案:分豆豆
- 中班手指游戏教案:小蝴蝶
- 2024年北林科发〔〕57号城市基础设施建设项目合同
- 中班安全教案:安全乘车
- 第4课西汉与东汉统一多民族封建国家的巩固教学设计-高中历史必修中外历史纲要上册
- 物流管理职业生涯规划
- 团队建设创造和谐的人际关系与文化
- 新时代中小学思政课一体化建设探究
- 对分课堂:中国教育的新智慧
- 陪诊项目商业计划书
- 玉米种子销售计划书
- 刑事受害人授权委托书范本
- 《电动叉车培训教材》课件
- 第3.2课《简单相信傻傻坚持》(课件)-【中职专用】高二语文同步课件(高教版2023·职业模块)
- 小学科学项目式学习教学设计与实践研究
评论
0/150
提交评论