JAVA扫雷课程设计.docx
《JAVA扫雷课程设计.docx》由会员分享,可在线阅读,更多相关《JAVA扫雷课程设计.docx(20页珍藏版)》请在冰豆网上搜索。
![JAVA扫雷课程设计.docx](https://file1.bdocx.com/fileroot1/2023-1/29/84cc5289-8474-480b-ac42-ba23dc8e9843/84cc5289-8474-480b-ac42-ba23dc8e98431.gif)
JAVA扫雷课程设计
《JAVA程序设计》
课程设计报告
系别:
计算机与电子系
专业班级:
计算机科学与技术0801班
学生姓名:
XXXXXXX
指导教师:
XXXX
(课程设计时间:
2011年6月13日——2011年6月24日)
课程设计报告撰写内容、格式与成绩评定
一、课程设计报告的撰写内容与要求
1.课程设计总结报告应包括:
前言、基本原理或理论、设计计算书或实验报告、结论、图纸(框图、流程图)、参考资料等;或调查、访谈报告、调查问卷、调查提纲等。
2.课程设计总结报告应书写工整,文句通顺、精炼、逻辑性强,图纸和曲线的绘制应符合规范。
3.调查型课程设计应根据调查结果撰写调查报告。
调查报告内容包括:
题目、参加时间、地点、方式、过程、调查对象一般情况、调查内容、发现的问题、调查结果和调查分析及体会等。
调查报告要求语言简练、准确;叙述清楚、明白;数据、资料可靠;结论有理、有据。
4.图纸应布局合理,比例恰当,线条分明,字体工整,符合国家制图标准。
5.课程设计报告字数要求:
理工、艺术类不少于2000字,其他专业不少于3000字。
二、课程设计成绩评定
1.学生的课程设计成绩由平时成绩、业务考核成绩两部分组成,均为百分制记分,其中平时成绩占总成绩的30%,业务考核成绩占70%。
业务考核含设计报告(计算说明书、调查提纲、调查问卷等)、绘制的图纸、编制的软件、制作的模型、撰写的论文或问卷统计、调查分析等的完成及质量情况;平时成绩含设计表现、到课率等。
2.教师按学生实际成绩(百分制,含平时成绩和业务考核成绩两部分)登记并录入教务MIS系统,由系统自动转化为“优秀(90~100分)、良好(80~89分)、中等(70~79分)、及格(60~69分)和不及格(60分以下)”五等。
目录
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;iintx=(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;yif((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;yif(((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(bombS