JAVA扫雷课程设计.docx

上传人:b****5 文档编号:8168531 上传时间:2023-01-29 格式:DOCX 页数:20 大小:361.35KB
下载 相关 举报
JAVA扫雷课程设计.docx_第1页
第1页 / 共20页
JAVA扫雷课程设计.docx_第2页
第2页 / 共20页
JAVA扫雷课程设计.docx_第3页
第3页 / 共20页
JAVA扫雷课程设计.docx_第4页
第4页 / 共20页
JAVA扫雷课程设计.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

JAVA扫雷课程设计.docx

《JAVA扫雷课程设计.docx》由会员分享,可在线阅读,更多相关《JAVA扫雷课程设计.docx(20页珍藏版)》请在冰豆网上搜索。

JAVA扫雷课程设计.docx

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;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(bombS

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1