JAVA课程设计扫雷游戏.docx

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

JAVA课程设计扫雷游戏.docx

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

JAVA课程设计扫雷游戏.docx

JAVA课程设计扫雷游戏

 

合肥学院

计算机科学与技术系

课程设计报告

2009~2010学年第二学期

课程

Java语言与应用

课程设计名称

扫雷游戏

学生姓名

胡远远

学号

0604031005

专业班级

07网络工程一班

指导教师

许强张贯虹

 

2010年09月

1.设计内容及要求

1.1扫雷游戏的基本要求

Windows2000/XP系统提供的扫雷游戏是一个很有趣的游戏。

本章的课程设计使用Java语言编写一个与其类似的扫雷游戏。

具体要求如下:

(1)选择级别后将出现相应级别的扫雷区域,这是用户使用鼠标左键单击雷区中任何一个方块便启动计时器。

(2)用户要揭开某个方块,可单击它。

若所揭方块下有雷,用户便输了这一局,若所揭方块下五雷,则显示一个数字,该数字代表方块的周围的8个方块中共有多少颗雷。

(3)如果用户认为某个方块下埋着雷,单击右键可以在方块上标识一个用户认为是雷的图标,即给出一个扫雷标记。

用户每标记出一个扫雷标记(无论用户的标记是否正确),程序将显示的剩余雷数减少一个。

(4)扫雷胜利后,显示游戏胜利。

(5)用户可以右击空格,可以选择标记为“旗帜”、“问号”或者返回成空格。

1.2需实现的主要功能

(1)用户点击笑脸实现复位操作。

调用repaint()和validate()函数对界面进行重置以及刷新操作

(2)可以显示用户完全扫雷成功所花时间。

文本框TF记录扫雷成功所花的时间

(3)在失败和胜利后跳出失败或胜利的文本框

JoptionPane该类用来调出对话框并提示胜利

2.需求分析

2.1扫雷棋盘的布局设计

系统的整体布局为:

CardLayout布局,采用了文本框、按钮、面板、框架…等组件,菜单主要有run按钮笑脸和哭脸,按钮的功能是重新开始新的游戏。

2.2雷区的设计

MineArea类是javax.swing包中Jpanel容器的子类,实现了ActionListener和MouseListener接口,所创建的对象:

mineArea是MineGame类中最重要的成员之一,作为一个容器添加到MineGame窗口的中心。

标明MineArea类的主要成员变量、方法以及和MineGame类之间组合关系的UML图如下图所示。

MineArea类的UML图

以下是UML图中有关数据和方法的详细说明。

1、成员变量

(1)block是Block类型的数组,用来确定雷区有多少需进行扫雷的方块。

(2)blockView是BlockView类型的数组,负责为block数组中的Block对象提供视图。

(3)lay是LayMines类型的对象,负责设置block数组中的哪些方块是雷或不是雷。

(4)run是一个按钮对象,用户单击它重新开始游戏。

(6)time是计时器对象,负责计算用户的用时。

2、方法

(1)setbounds(int,int,int,int)方法可根据参数提供的数据设置雷区的宽度、高度、雷的数目。

(2)actionPerformed(ActionEvent)是MineArea类实现的ActionListener接口中的方法。

当用户单击blockView中的某个方块时,actionPerformed(ActionEvent)方法负责执行有关算法,例如,当用鼠标左键单击方块上的按钮后,若该方块下有雷,lost(ActionEvent)方法将使用户输掉本局,若该方块下无雷,getboomcount(ActionEvent)方法将显示icon对象中的标签,该标签上是一个数字,该数字代表当前方块的周围的8个方块中共有多少颗雷。

(3)Mouse_Handler(MouseEvent)方法是MineArea类实现的MouseListener接口中的方法,当用户按下鼠标有件事mouseReleased(MouseEvent)方法负责让方块上显示一个探雷标记。

(4)iswin函数判断是否扫雷成功

当雷数全部被正确的排除,或者无雷区已经被全部点开,只剩雷时,判定为胜利,JoptionPane类创建的对象讲调用方法showMessageDialog()弹出对话框提示:

YOUWIN!

3.总体设计

总体流程图

4.主要功能设计流程

4.1雷区设计流程图

雷区设计流程图

在实现以上功能时,主要需解决的功能模块如下:

1、怎样产生雷?

setBoomPosi()方法中posi[]数组用来记录雷的位置,先在雷区中随机产生一个雷,记录为posi[0],并记录其X,Y坐标位置,然后再使用Math.random()*maxPosi+1方法产生第二个雷,并判断其X坐标是否与POSI[0]重复,若重复,重新产生一个雷,并再次进行判断,直至坐标相异为止,若不重复,则用posi[1]记录该雷,并记录其XY坐标位置。

同理,以此类推,便可产生所有的雷。

2、游戏中怎样判断是否累的位置?

用isBoomPosi(int,int)方法来实现该功能,主要思想是鼠标所点击的网格的坐标是否与随机产生的40个雷中的某个坐标相同,若相同,则是雷,若不同,则不是雷。

3、若点击的位置不是雷,怎样显示周围的雷数,又或者怎么才能把周围的格子拓展开来?

getBoomCount(int,int)该方法主要是来实现如下功能:

点击的网格若不是雷,则计算出周围8个格子的坐标。

getBoomCount(int,int)主要根据上一个方法中所得到的8个坐标计算出这些格子哪些与40个雷的坐标有相同的,并记录个数count

4、当点击到雷时如何判断

根据点击的位置,若是该位置为雷,则调用LOSE(int,int)方法,该方法判定玩家为输,标志为RUN文本框中笑脸变为哭脸。

当玩家点击哭脸时,调用以上所提的过的2个方法重置界面,并更新。

5、怎样标记雷的位置

mouseReleased()该方法用来实现此功能,若玩家认为该网格内有雷,右击鼠标一次,该方法调用getico()方法标记为红旗,同时,计数文本框的数目减一,若玩家不能判定该网格,可以右击鼠标2次,以问号为记,计数器减一后又加一。

若玩家标记过问号后,能确定该网格内无雷,可再次右击一次,标记回到原始状态。

5.代码实现

5.1运行效果图

2-7运行主界面效果图

2-8游戏失败效果图

2-9游戏成功效果图

6.总结与说明

经过编写这个扫雷游戏,我认识到应该注意细节问题,虽然是很小的问题,但可以提高自己编程的能力,而且还可以培养自己编程的严谨性,同时还可以为以后的编程积累经验。

编写完这个扫雷游戏,我发现自己有很多的不足,我想如果让我来单独来编写这个游戏,我感觉很吃力,因为这个游戏涉及到好多算法。

感触最深的就是我们真的要扎扎实实的打基础!

通过该课程设计,全面系统的理解了程序构造的一般原理和基本实现方法。

把死板的课本知识变得生动有趣,激发了学习的积极性。

把学过的计算机编译原理的知识强化,能够把课堂上学的知识通过自己设计的程序表示出来,加深了对理论知识的理解。

现在通过自己动手做实验,从实践上认识了操作系统是如何处理命令的,课程设计中程序比较复杂,在调试时应该仔细。

在这次课程设计中,我就是按照实验指导的思想来完成。

加深了理解文件系统的内部功能及内部实现,培养实践动手能力和程序开发能力的目的。

7.原代码

//初始化方法

publicvoidinit(introw,intcol,intboomNum){

this.getContentPane().removeAll();

if(mytime!

=null){

mytime.stop();

tf.setText("0");

bf.setText(boomNum+"");

}

time=0;

runFlag=false;

this.row=row;

this.col=col;

this.boomNum=boomNum;

viewBoomNum=10;

setBoomPosi();

this.setBounds(200,200,col*boomWidth+6,row*boomWidth+6+20+40);

this.setLayout(null);

pan=newJPanel(newGridLayout(row,col));

pan.setBounds(0,40,col*boomWidth,row*boomWidth);

this.add(pan);

but=newJButton[row][col];

hbut=newHandler[row][col];

mh=newMouse_Handler[row][col];

for(inti=0;i

for(intj=0;j

but[i][j]=newJButton(ico[0]);

hbut[i][j]=newHandler(i,j);

but[i][j].addActionListener(hbut[i][j]);

mh[i][j]=newMouse_Handler(this,i,j);

but[i][j].addMouseListener(mh[i][j]);

pan.add(but[i][j]);

}

}

//顶部面板

pan2=newJPanel(null);

pan2.setBounds(0,5,col*boomWidth,30);

bf=newJTextField();

bf.setBounds(10,5,30,20);

pan2.add(bf);

tf=newJTextField();

tf.setBounds(pan2.getWidth()-40,5,30,20);

pan2.add(tf);

run=newJButton(ico[15]);

run.setBounds((pan2.getWidth()-24)/2,3,24,24);

pan2.add(run);

this.add(pan2);

bf.setText(boomNum+"");

tf.setText("0");

bf.setEditable(false);

tf.setEditable(false);

bf.setHorizontalAlignment(JTextField.CENTER);

tf.setHorizontalAlignment(JTextField.CENTER);

mytime=newSetTime(this);

mytime.setDaemon(true);

this.repaint();

this.validate();

run.addActionListener(newActionListener(){

publicvoidactionPerformed(ActionEventarg0){

init(9,9,10);

}

});

}

//设定雷的位置

publicvoidsetBoomPosi(){

posi=newint[boomNum];

intmaxPosi=row*col;

posi[0]=(int)(Math.random()*maxPosi+1);

for(inti=1;i

inttemp=(int)(Math.random()*maxPosi+1);

booleanflag=true;

for(intj=0;j

if(temp==posi[j]){

flag=false;

break;

}

}

if(flag){

posi[i]=temp;

i++;

}

}

Arrays.sort(posi);

}

classHandlerimplementsActionListener{

intx,y;

publicHandler(intx,inty){

this.x=x;

this.y=y;

}

publicvoidactionPerformed(ActionEventarg0){

if(!

but[x][y].getIcon().equals(ico[2])){

if(!

runFlag){

mytime.start();

runFlag=true;

}

setType(x,y);

isWin();

}}}

//根据坐标得到位置

publicintgetPosi(intx,inty){

returnx*col+y+1;

}

//判断是否是雷的位置

publicbooleanisBoomPosi(intx,inty){

intp=getPosi(x,y);

for(inti=0;i

if(posi[i]==p)

returntrue;

}

returnfalse;

}

//得到周围雷的个数

publicintgetBoomCount(intx,inty){

int[][]bounds=this.getBounds(x,y);

intcount=0;

for(inti=0;i

inttx=bounds[i][0];

intty=bounds[i][1];

if(this.isOK(tx,ty)&&this.isBoomPosi(tx,ty)){

count++;

}

}

returncount;

}

//得到周围格子坐标

publicint[][]getBounds(intx,inty){

returnnewint[][]{

{x-1,y-1},

{x-1,y},

{x-1,y+1},

{x,y+1},

{x+1,y+1},

{x+1,y},

{x+1,y-1},

{x,y-1}

};

}

//检查坐标是否合法

publicbooleanisOK(intx,inty){

if(x>=0&&x=0&&y

returntrue;

}

returnfalse;

}

//延展

publicvoidsetType(intx,inty){

if(this.isOK(x,y)&&this.isBoomPosi(x,y)){

//显现所有的雷

lost(x,y);

but[x][y].setIcon(ico[13]);

//移除所有监听器

removeListener();

//停止计时

mytime.stop();

//改变初始图标

run.setIcon(ico[14]);

}elseif(this.isOK(x,y)&&!

this.isBoomPosi(x,y)){

//but[x][y].setBackground(Color.WHITE);

if(this.getBoomCount(x,y)!

=0){

//but[x][y].setText(this.getBoomCount(x,y)+"");

but[x][y].setIcon(ico[this.getBoomCount(x,y)+3]);

}else{

but[x][y].setIcon(ico[1]);

int[][]bounds=this.getBounds(x,y);

for(inti=0;i

inttx=bounds[i][0];

intty=bounds[i][1];

if(this.isOK(tx,ty)&&but[tx][ty].getIcon().equals(ico[0])){

setType(tx,ty);

}}}}}

//判断是否赢了

publicvoidisWin(){

intcount=0;

for(inti=0;i

for(intj=0;j

if(but[i][j].getIcon().equals(ico[0])||

but[i][j].getIcon().equals(ico[2])||

but[i][j].getIcon().equals(ico[3])){

count++;

}}}

if(count==this.boomNum){

removeListener();

JOptionPane.showMessageDialog(null,"YOUWIN!

");

}}

publicJButton[][]getBut(){

returnbut;

}

publicvoidsetBut(JButton[][]but){

this.but=but;

}

publicintgetBoomNum(){

returnboomNum;

}

publicvoidsetBoomNum(intboomNum){

this.boomNum=boomNum;

}

publicintgetRow(){

returnrow;

}

publicvoidsetRow(introw){

this.row=row;

}

publicintgetCol(){

returncol;

}

publicvoidsetCol(intcol){

this.col=col;

}

publicint[]getPosi(){

returnposi;

}

publicvoidsetPosi(int[]posi){

this.posi=posi;

}

publicstaticintgetBoomWidth(){

returnboomWidth;

}

publicstaticvoidsetBoomWidth(intboomWidth){

Boom.boomWidth=boomWidth;

}

publicJPanelgetPan(){

returnpan;

}

publicvoidsetPan(JPanelpan){

this.pan=pan;

}

//输了

publicvoidlost(intx,inty){

for(inti=0;i

for(intj=0;j

for(intk=0;k

if(this.getPosi(i,j)==posi[k]){

but[i][j].setIcon(ico[12]);

break;

}

}

}}}

//移除雷按钮监听器

publicvoidremoveListener(){

for(inti=0;i

for(intj=0;j

but[i][j].removeActionListener(hbut[i][j]);

but[i][j].removeMouseListener(mh[i][j]);

}}}

publicIcon[]getIco(){

returnico;

}

publicvoidsetIco(Icon[]ico){

this.ico=ico;

}

//改变时间

publicvoidsetTime(){

this.time++;

tf.setText(time+"");

}

//改变雷数量

publicvoidsetBoomNum(booleantype){

if(type){

viewBoomNum++;

}else{

viewBoomNum--;

}

bf.setText(viewBoomNum+"");

}

publicJTextFieldgetBf(){

returnbf;

}

publicvoidsetBf(JTextFieldbf){

this.bf=bf;

}

 

publicJTextFieldgetTf(){

returntf;

}

publicvoidsetTf(JTextFieldtf){

this.tf=tf;

}}

3Mouse_Handler.java、

packageboom;

importjava.awt.Color;

importjava.awt.event.MouseEvent;

importjava.awt.event.MouseListener;

importjavax.swing.JButton;

publicclassMouse_HandlerimplementsMouseListener{

privateBoomwin;

privateintx,y;

publicMouse_Handler(Boomwin,intx,inty){

this.win=win;

this.x=x;

this.y=y;

}

publicvoidmouseClicked(MouseEventarg0){}

publicvoidmouseEntered(MouseEventarg0){}

publicvoidmouseExited(MouseEventarg0){}

publicvoidmousePressed(Mou

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

当前位置:首页 > 党团工作 > 入党转正申请

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

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