JAVA扫雷课程设计.docx
- 文档编号:17360027
- 上传时间:2023-07-24
- 格式:DOCX
- 页数:23
- 大小:360.32KB
JAVA扫雷课程设计.docx
《JAVA扫雷课程设计.docx》由会员分享,可在线阅读,更多相关《JAVA扫雷课程设计.docx(23页珍藏版)》请在冰点文库上搜索。
JAVA扫雷课程设计
《JAVA程序设计》
课程设计报告
系别:
计算机与电子系
专业班级:
计算机科学与技术0801班
学生姓名:
XXXXXXX
指导教师:
XXXX
(课程设计时间:
2011年6月13日——2011年6月24日)
目录
1.课程设计目的………………………………………………………………1
2.课程设计题目描述和要求…………………………………………1
3.课程设计报告内容…………………………………………………………1
3.1总体设计……………………………………………………………………1
3.2详细设计……………………………………………………………………3
3.3编码实现……………………………………………………………………7
3.4系统测试……………………………………………………………………19
3.5系统运行……………………………………………………………………19
4.总结…………………………………………………………………………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.*;
publicclassFrame
extendsJFrame{
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 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 for(inty=j-1;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 for(inty=j-1;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_actionAdapter implementsActionListener{ privateFrameadaptee; Frame1_start_actionAdapter(Frameadaptee){ this.adaptee=adaptee; } publicvoidactionPerformed(ActionEvente){ adaptee.start_actionPerformed(e); } } //////////////////////////// classBomb extendsJButton{ intnum_x,num_y;//第几号方块 intBombRoundCount;//周围雷数 booleanisBomb;//是否为雷 booleanisClicked;//是否被点击 intBombFlag;//探雷标记 booleanisRigh
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- JAVA 扫雷 课程设计
![提示](https://static.bingdoc.com/images/bang_tan.gif)