JAVA扫雷课程设计_第1页
JAVA扫雷课程设计_第2页
JAVA扫雷课程设计_第3页
JAVA扫雷课程设计_第4页
JAVA扫雷课程设计_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

《JAVA程序设计》课程设计报告系别:计算机与电子系专业班级:计算机科学与技术0801班学生姓名:XXXXXXX指导教师:XXXX(课程设计时间:2011年6课程设计报告撰写内容、格式与成绩评定一、课程设计报告的撰写内容与要求1.课程设计总结报告应包括:前言、基本原理或理论、设计计算书或实验报告、结论、图纸(框图、流程图)、参考资料等;或调查、访谈报告、调查问卷、调查提纲等。2.课程设计总结报告应书写工整,文句通顺、精炼、逻辑性强,图纸和曲线的绘制应符合规范。3.调查型课程设计应根据调查结果撰写调查报告。调查报告内容包括:题目、参加时间、地点、方式、过程、调查对象一般情况、调查内容、发现的问题、调查结果和调查分析及体会等。调查报告要求语言简练、准确;叙述清楚、明白;数据、资料可靠;结论有理、有据。4.图纸应布局合理,比例恰当,线条分明,字体工整,符合国家制图标准。5.课程设计报告字数要求:理工、艺术类不少于2000字,其他专业不少于3000字。二、课程设计成绩评定1.学生的课程设计成绩由平时成绩、业务考核成绩两部分组成,均为百分制记分,其中平时成绩占总成绩的30%,业务考核成绩占70%。业务考核含设计报告(计算说明书、调查提纲、调查问卷等)、绘制的图纸、编制的软件、制作的模型、撰写的论文或问卷统计、调查分析等的完成及质量情况;平时成绩含设计表现、到课率等。2.教师按学生实际成绩(百分制,含平时成绩和业务考核成绩两部分)登记并录入教务MIS系统,由系统自动转化为“优秀(90~100分)、良好(80~89分)、中等(70~79分)、及格(60~69分)和不及格(60分以下)”五等。目录1.课程设计目的………………12.课程设计题目描述和要求…………13.课程设计报告内容…………13.1总体设计……………………13.2详细设计……………………33.3编码实现……………………73.4系统测试……………………193.5系统运行……………………194.总结…………21参考文献………………………21(要求:目录题头用三号黑体字居中书写,隔行书写目录内容。目录中各级题序及标题用小四号黑体)

1.课程设计目的本次课程设计旨在加强JAVA程序编译的能力和对JAVA程序的理解能力,通过本次课设,加强大家的自学能力,为大家做毕业设计做好铺垫。2.课程设计题目描述和要求2.1扫雷游戏的基本要求Windows7系统提供的扫雷游戏是一个很有趣的游戏。我选的课程设计题目是使用Java语言编写一个与其类似的扫雷游戏。具体要求如下:(1)玩家可以设置雷数,没有初级中级高级之分,设置完雷数后点击开始重新不布置雷区,开始游戏。(2)用户要揭开某个方块,可单击它。若所揭方块下有泪,用户便输了这一局,若所揭方块下五雷,则显示一个数字,该数字代表方块的周围的8个方块中共有多少颗雷。(3)如果用户认为某个方块下埋着雷,单击右键可以在方块上标识一个用户认为是雷的图标,即给出一个扫雷标记。用户每标记出一个扫雷标记(无论用户的标记是否正确),程序将显示的剩余雷数减少一个。(4)用户可以选择标记疑问的方块,用可以勾选游戏菜单下的标记(或者用快捷键alt+G然后M)即可,此时双击右键并可出现“?”标记。另有颜色选项,当用户勾选此项时,游戏将以最低图像像素来显示。3.课程设计报告内容3.1总体设计(1)总体功能图图3-1总体功能图(2)总体流程图图3-2总体流程图3.2详细设计(1)扫雷棋盘的布局设计系统的整体布局为:CardLayout布局,采用了菜单、按钮、面板…等组件,菜单主要包括开始,选择级别,标记,扫雷英雄榜,退出,按钮的功能是重新开始新的游戏。(2)雷区的设计MineArea类是javax.swing包中Jpanel容器的子类,实现了ActionListener和MouseListener接口,所创建的对象:mineArea是MineGame类中最重要的成员之一,作为一个容器添加到MineGame窗口的中心。标明MineArea类的主要成员变量、方法以及和MineGame类之间组合关系的UML图如图3-3所示。图3-3MineArea类的UML图以下是UML图中有关数据和方法的详细说明。2.1成员变量(1)block是Block类型的数组,用来确定雷区有多少需进行扫雷的方块。(2)blockView是BlockView类型的数组,负责为block数组中的Block对象提供视图。(3)lay是LayMines类型的对象,负责设置block数组中的哪些方块是雷或不是雷。(4)record负责提供保存成绩的界面,是一个对话框,默认不可见。用户只有扫雷成功后(用时最少),才可以看见对话框。(5)reStart是一个按钮对象,用户单击它重新开始游戏。(6)time是计时器对象,负责计算用户的用时。2.2方法(1)initMineArea(int,int,int,int)方法可根据参数提供的数据设置雷区的宽度、高度、雷的数目以及雷区的级别。(2)actionPerformed(ActionEvent)是MineArea类实现的ActionListener接口中的方法。当用户单击blockView中的某个方块时,actionPerformed(ActionEvent)方法负责执行有关算法,例如,当用鼠标左键单击方块上的按钮后,若该方块下有雷,actionPerformed(ActionEvent)方法将使用户输掉本局,若该方块下无雷,actionPerformed(ActionEvent)方法将显示blockView对象中的标签,该标签上是一个数字,该数字代表当前方块的周围的8个方块中共有多少颗雷。(3)show()方法是一个递归方法。actionPerformed(ActionEvent)方法执行时将调用show方法进行扫雷。(4)mousePressed(MouseEvent)方法是MineArea类实现的MouseListener接口中的方法,当用户按下鼠标有件事mousePressed(MouseEvent)方法负责让方块上显示一个探雷标记。(5)inquireWin()方法用来判断用户是否扫雷成功,如果成功该方法负责让record对话框可见。所谓扫雷成功是指不仅找到了全部的累而且用时最少。(6)雷区设计流程图图3-4雷区设计流程图2.3音效的设计(1)music类是java.awt包中Frame的子类,通过构造音效声音方法,在MainFrame主类中,通过ActionListener来监视是否已开始游戏,来决定播放计时声,之后又通过ActionListener来监视是否踩到雷和是否完成来决定,播放相应的音乐。下面标明music类的主要成员变量、方法以及和MineFrame类之间组合关系的UML图如图3-2所示。图3-5MineArea类的UML图(2)音效设计流程图图3-6音效设计流程图(3)类之间关系图图3-7类之间关系图3.3.编码实现importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;publicclassFrameextendsJFrame{JTextFieldtext;JLabelnowBomb,setBomb;intBombNum,BlockNum;//当前雷数,当前方块数intrightBomb,restBomb,restBlock;//找到的地雷数,剩余雷数,剩余方块数JButtonstart=newJButton("开始");JPanelMenuPamel=newJPanel();JPanelbombPanel=newJPanel();Bomb[][]bombButton;JPanelc;BorderLayoutborderLayout1=newBorderLayout();GridLayoutgridLayout1=newGridLayout();publicFrame(){try{setDefaultCloseOperation(EXIT_ON_CLOSE);jbInit();}catch(Exceptionexception){exception.printStackTrace();}}privatevoidjbInit()throwsException{c=(JPanel)getContentPane();setTitle("扫雷");c.setBackground(Color.WHITE);MenuPamel.setBackground(Color.GRAY);c.setLayout(borderLayout1);setSize(newDimension(600,600));setResizable(false);BlockNum=144;BombNum=10;text=newJTextField("10",3);nowBomb=newJLabel("当前雷数"+":"+BombNum);setBomb=newJLabel("设置地雷数");start.addActionListener(newFrame1_start_actionAdapter(this));MenuPamel.add(setBomb);MenuPamel.add(text);MenuPamel.add(start);MenuPamel.add(nowBomb);c.add(MenuPamel,java.awt.BorderLayout.SOUTH);bombPanel.setLayout(gridLayout1);gridLayout1.setColumns((int)Math.sqrt(BlockNum));gridLayout1.setRows((int)Math.sqrt(BlockNum));bombButton=newBomb[(int)Math.sqrt(BlockNum)][(int)Math.sqrt(BlockNum)];for(inti=0;i<(int)Math.sqrt(BlockNum);i++){for(intj=0;j<(int)Math.sqrt(BlockNum);j++){bombButton[i][j]=newBomb(i,j);//bombButton[i][j].setSize(10,10);bombButton[i][j].setFont(newFont("",Font.PLAIN,14));//设置字体大小bombButton[i][j].setForeground(Color.white);bombButton[i][j].addMouseListener(newBomb_mouseAdapter(this));bombButton[i][j].addActionListener(newBomb_actionAdapter(this));bombPanel.add(bombButton[i][j]);}}c.add(bombPanel,java.awt.BorderLayout.CENTER);startBomb();}/*开始按钮*/publicvoidstart_actionPerformed(ActionEvente){intnum=Integer.parseInt(text.getText().trim());if(num>=5&&num<50){BombNum=num;startBomb();}elseif(num<5){JOptionPane.showMessageDialog(null,"您设置的地雷数太少了,请重设!","错误",JOptionPane.ERROR_MESSAGE);num=10;BombNum=num;}else{JOptionPane.showMessageDialog(null,"您设置的地雷数太多了,请重设!","错误",JOptionPane.ERROR_MESSAGE);num=10;BombNum=num;}}/*开始,布雷*/publicvoidstartBomb(){nowBomb.setText("当前雷数"+":"+BombNum);for(inti=0;i<(int)Math.sqrt(BlockNum);i++){for(intj=0;j<(int)Math.sqrt(BlockNum);j++){bombButton[i][j].isBomb=false;bombButton[i][j].isClicked=false;bombButton[i][j].isRight=false;bombButton[i][j].BombFlag=0;bombButton[i][j].BombRoundCount=9;bombButton[i][j].setEnabled(true);bombButton[i][j].setText("");bombButton[i][j].setFont(newFont("",Font.PLAIN,14));//设置字体大小bombButton[i][j].setForeground(Color.BLUE);rightBomb=0;restBomb=BombNum;restBlock=BlockNum-BombNum;}}for(inti=0;i<BombNum;){intx=(int)(Math.random()*(int)(Math.sqrt(BlockNum)-1));inty=(int)(Math.random()*(int)(Math.sqrt(BlockNum)-1));if(bombButton[x][y].isBomb!=true){bombButton[x][y].isBomb=true;i++;}}CountRoundBomb();}/*计算方块周围雷数*/publicvoidCountRoundBomb(){for(inti=0;i<(int)Math.sqrt(BlockNum);i++){for(intj=0;j<(int)Math.sqrt(BlockNum);j++){intcount=0;//当需要检测的单元格本身无地雷的情况下,统计周围的地雷个数if(bombButton[i][j].isBomb!=true){for(intx=i-1;x<i+2;x++){for(inty=j-1;y<j+2;y++){if((x>=0)&&(y>=0)&&(x<((int)Math.sqrt(BlockNum)))&&(y<((int)Math.sqrt(BlockNum)))){if(bombButton[x][y].isBomb==true){count++;}}}}bombButton[i][j].BombRoundCount=count;}}}}/*是否挖完了所有的雷*/publicvoidisWin(){restBlock=BlockNum-BombNum;for(inti=0;i<(int)Math.sqrt(BlockNum);i++){for(intj=0;j<(int)Math.sqrt(BlockNum);j++){if(bombButton[i][j].isClicked==true){restBlock--;}}}if(rightBomb==BombNum||restBlock==0){JOptionPane.showMessageDialog(this,"您挖完了所有的雷,您胜利了!","胜利",JOptionPane.INFORMATION_MESSAGE);startBomb();}}/**当选中的位置为空,则翻开周围的地图**/publicvoidisNull(BombClickedButton){inti,j;i=ClickedButton.num_x;j=ClickedButton.num_y;for(intx=i-1;x<i+2;x++){for(inty=j-1;y<j+2;y++){if(((x!=i)||(y!=j))&&(x>=0)&&(y>=0)&&(x<((int)Math.sqrt(BlockNum)))&&(y<((int)Math.sqrt(BlockNum)))){if(bombButton[x][y].isBomb==false&&bombButton[x][y].isClicked==false&&bombButton[x][y].isRight==false){turn(bombButton[x][y]);}}}}}/*翻开*/publicvoidturn(BombClickedButton){ClickedButton.setEnabled(false);ClickedButton.isClicked=true;if(ClickedButton.BombRoundCount>0){ClickedButton.setText(ClickedButton.BombRoundCount+"");}else{isNull(ClickedButton);}}/*左键点击*/publicvoidactionPerformed(ActionEvente){if(((Bomb)e.getSource()).isClicked==false&&((Bomb)e.getSource()).isRight==false){if(((Bomb)e.getSource()).isBomb==false){turn(((Bomb)e.getSource()));isWin();}else{for(inti=0;i<(int)Math.sqrt(BlockNum);i++){for(intj=0;j<(int)Math.sqrt(BlockNum);j++){if(bombButton[i][j].isBomb==true){bombButton[i][j].setText("b");}}}((Bomb)e.getSource()).setForeground(Color.RED);((Bomb)e.getSource()).setFont(newFont("",Font.BOLD,20));((Bomb)e.getSource()).setText("X");JOptionPane.showMessageDialog(this,"你踩到地雷了,按确定重来","踩到地雷",2);startBomb();}}}/*右键点击*/publicvoidmouseClicked(MouseEvente){BombbombSource=(Bomb)e.getSource();booleanright=SwingUtilities.isRightMouseButton(e);if((right==true)&&(bombSource.isClicked==false)){bombSource.BombFlag=(bombSource.BombFlag+1)%3;if(bombSource.BombFlag==1){if(restBomb>0){bombSource.setForeground(Color.RED);bombSource.setText("F");bombSource.isRight=true;restBomb--;}else{bombSource.BombFlag=0;}}elseif(bombSource.BombFlag==2){restBomb++;bombSource.setText("Q");bombSource.isRight=false;}else{bombSource.setText("");}if(bombSource.isBomb==true){if(bombSource.BombFlag==1){rightBomb++;}elseif(bombSource.BombFlag==2){rightBomb--;}}nowBomb.setText("当前雷数"+":"+restBomb);isWin();}}publicstaticvoidmain(String[]args){Frameframe=newFrame();frame.setVisible(true);}}classFrame1_start_actionAdapterimplementsActionListener{privateFrameadaptee;Frame1_start_actionAdapter(Frameadaptee){this.adaptee=adaptee;}publicvoidactionPerformed(ActionEvente){adaptee.start_actionPerformed(e);}}////////////////////////////classBombextendsJButton{intnum_x,num_y;//第几号方块intBombRoundCount;//周围雷数booleanisBomb;//是否为雷booleanisClicked;//是否被点击intBombFlag;//探雷标记booleanisRight;//是否点击右键publicBomb(intx,inty){num_x=x;num_y=y;BombFlag=0;BombRoundCount=9;isBomb=false;isClicked=false;isRight=false;}}classBomb_actionAdapterimplementsActionListener{privateFrameadaptee;Bomb_actionAdapter(Framead

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论