扫雷设计说明书.docx
《扫雷设计说明书.docx》由会员分享,可在线阅读,更多相关《扫雷设计说明书.docx(33页珍藏版)》请在冰豆网上搜索。
扫雷设计说明书
福州软件职业技术学院
毕业设计说明书
题目:
扫雷
系别:
计算机系
专业/班级:
软件技术JAVA
(1)班
年级:
2008级
学号:
08013140
姓名:
江钊
指导老师:
蒋秀凤
2011年5月15日
内容摘要
此次设计的一款扫雷游戏,其功能类似于Windows操作系统自带的扫雷游戏。
首先介绍了制作游戏的整体思路及整个游戏设计的流程规划,然后介绍了雷区的布置及地雷随机产生的实现方法;重点介绍了在游戏过程中各事件的处理,其中又以鼠标事件和清除未靠近地雷区方块这两方面最为重要,鼠标事件是利用鼠标所发出的信息了解使用者的意图,进而做出相对应的动作,而清除未靠近地雷区方块由于引进了“递归”这个概念而使其简单化。
本次设计只是完成了扫雷游戏的基本功能,在细节方面仍有待完善。
关键词(3—5个),中间用”,”号分开
“扫雷”、“事件”、“递归”
目录
1设计任务要求1
1.1目的及意义1
1.2系统功能要求1
1.3预期开发成果1
2技术平台要求1
2.1硬件技术平台1
2.2软件技术平台1
3系统功能模块说明2
3.1系统功能模块图2
3.2各模块的基本功能说明2
4设计结果2
4.1设计测试2
4.2设计结果展示2
4.3设计作品改进之处2
总结2
参考文献2
1设计任务要求
1.1目的及意义
在计算机逐步渗入社会生活各个层面的今天,计算机已经成为了人们日常生活的一部分,越来越多的人使用计算机办公、娱乐等。
扫雷游戏是Windows操作系统自带的一款小游戏,在过去的几年里,Windows操作系统历经数次换代更新,变得越来越庞大、复杂,功能也越来越强大,但是这款小游戏依然保持着原来的容貌,可见这款游戏受到越来越多的人的喜爱。
本次的毕业设计我将利用eclipse、JavaDevelopmentKit作为开发工具,开发一款类似的“扫雷游戏”。
通过研究Windows操作系统自带的扫雷游戏,我们可以发现在这个游戏中主要有一下两个关键的地方:
第一个是初始化问题,包括随机产生本局游戏的雷的总数,雷的分布对于每以个小区域如何获取周围地区的雷数等等。
第二就是对鼠标事件的处理问题,既在游戏过程中对鼠标事件应如何做出反应。
经过三年的大学学习,我对理论知识有了一丁的了解和认知,本次的毕业设计便是将书本上所学的理论知识与实际相融合,同时也是对所学知识的一种检查,希望通过本次的毕业设计使自己在程序的开发和设计上有新的认识并能有所提高。
本次毕业设计既锻炼了我们的实际动手能力,又在老师的指导下进行了一次模拟实际产品的开发,对于我们以后工作能力的培养具有重要意义。
1.2系统功能要求
在运行之前要先安装JavaDevelopmentKit,在windowxp2003vista等系统都可以运行
1.3预期开发成果
importjava.awt.*;
importjavax.swing.*;
importjava.util.Random;
importjava.awt.event.*;
classMinextendsJPanel //雷的类
{
//备注:
鼠标的左键=1;右键=3;中键=2
privateint flag=0,statu=0; //定义雷的属性0:
没有打开1:
打开2:
标示为雷3:
不确定
//flag=0不是雷 ;flag=1是雷
privateint but,count=0; //but:
哪一个鼠标键被按下去了 count:
这个区域周围有多少个雷
privateintmx=0,my=0,mw=10; //定义雷的坐标和宽度
publicMin() //构造函数
{
statu=0;
}
publicMin(intf,intx,inty,intw)
//构造函数
{
flag =f;
mx =x;
my =y;
mw =w;
}
publicintgetFlag(){returnflag;}
publicintgetStatu(){returnstatu;}
publicintgetMx(){returnmx;}
publicintgetMy(){returnmy;}
publicintgetMw(){returnmw;}
publicintgetCount(){returncount;}
publicvoidsetFlag(intf){flag=f;}
publicvoidsetCount(intc){count=c;}
publicvoidsetData(intf,intx,inty,intw,ints)
//传递值
{
flag =f;
mx =(x-1)*w;
my =(y-1)*w;
mw =w-1;
statu =s;
}
//根据你点击鼠标的不同来改变雷的属性
publicintsendKey(intkey)
{
//返回值,如果游戏结束则返回-1
int rtn=1;
if(key==3)
{
switch(statu)
{
case1:
break;
case2:
statu=3;
break;
case3:
statu=0;
break;
case0:
statu=2;
break;
}
rtn=1;
}
if(key==1&&statu==0)
{
switch(flag)
{
case0:
statu=1;
rtn=2;
break;
case1:
statu=1;
rtn=-1;
break;
}
}
returnrtn;
}
}
classDrawPanelextendsJPanel
{
privateint i,j;
privateint f=0; //iff=1thengameover,iff=2thenwin
privateint chx=0,chy=0; //专门记录坐标x,y的值
privateint msum=6,ksum=0; //msum:
雷的个数,ksum:
标示雷的个数
privateint bx=10,by=10,bw=40; //bx,by:
棋盘的大小,bw:
棋子的大小
publicMinboard[][]={
{newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin()},
{newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin()},
{newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin()},
{newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin()},
{newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin()},
{newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin()},
{newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin()},
{newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin()},
{newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin()},
{newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin()},
{newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin()},
{newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin()},
{newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin()},
{newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin()},
{newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin()},
{newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin()},
{newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin()},
{newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin()},
{newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin()},
{newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin(),newMin()},
};
//画坐标为ax,ay区域的雷的状态
publicvoiddraw(Graphicsg,intax,intay)
{
int x,y,w; //坐标x,y;和宽度:
w
int s,c,flag; //状态;雷的个数;
int cx=bw/2-4;
int cy=bw/2+4;
x =board[ax][ay].getMx();
y =board[ax][ay].getMy();
w =board[ax][ay].getMw();
s =board[ax][ay].getStatu();
c =board[ax][ay].getCount();
flag=board[ax][ay].getFlag();
switch(s)
{
case0:
//没有打开状态
{
g.setColor(Color.black);
g.fillRect(x,y,w,w);
break;
}
case1:
//打开状态
{
g.setColor(Color.blue);
g.fillRect(x,y,w,w);
if(c!
=0&&flag==0) //此处没有雷
{
g.setColor(Color.red);
g.drawString(String.valueOf(c),x+cx,y+cy);
}
if(flag==1) //此处有雷
{
g.setColor(Color.red);
g.fillRect(x,y,w,w);
g.setColor(Color.blue);
g.drawString("雷",x+cx,y+cy);
}
break;
}
case2:
//标雷状态
{
g.setColor(Color.green);
g.fillRect(x,y,w,w);
g.setColor(Color.blue);
g.drawString("旗",x+cx,y+cy);
break;
}
case3:
//不确定状态
{
g.setColor(Color.black);
g.fillRect(x,y,w,w);
g.setColor(Color.red);
g.drawString("?
",x+cx,y+cy);
break;
}
default:
break;
}
}
//没有图形器的绘图函数:
画出坐标ax,ay的雷的状态和图形
publicvoiddraw(intax,intay)
{
Graphicsg;
g =this.getGraphics();
draw(g,ax,ay);
}
//打开周围没有雷的地方,并且绘画所在区域点击左键触发
publicintopenNoMin(intax,intay)
{
inti,j;
if(ax<1||ay<1||ax>bx||ay>by)return0; //鼠标点击的区域出界了
if(board[ax][ay].getStatu()!
=0)return0; //如果此区域打开了,返回
board[ax][ay].sendKey
(1); //如果返回值等于-1,就说明游戏结束
draw(ax,ay);
if(board[ax][ay].getFlag()==1)
//如果游戏结束,把所有的雷都显示出来
{
for(i=1;i<=bx;i++)
{
for(j=1;j<=by;j++)
{
if(board[i][j].getFlag()==1)
{
board[i][j].sendKey
(1);
draw(i,j);
}
}
}
return-1;
}
//如果游戏没有结束
if(board[ax][ay].getCount()>0)
{
ksum++;
return1; //周围有雷,就不用打开周围地区
}
if(board[ax][ay].getCount()==0&&board[ax][ay].getFlag()==0)
//周围没有雷,打开周围地区,直到有雷的地区
{
openNoMin(ax-1,ay-1);openNoMin(ax,ay-1);openNoMin(ax+1,ay-1);
openNoMin(ax-1,ay ); openNoMin(ax+1,ay );
openNoMin(ax-1,ay+1);openNoMin(ax,ay+1);openNoMin(ax+1,ay+1);
}
ksum++;
return1;
}
//计算坐标x,y的周围雷的个数
publicintgetCount(intai,intaj)
{
intsum=0;
if(board[ai][aj].getFlag()==1)
{
returnsum;
}
if(ai>1&&aj>1&&ai {
sum= board[ai-1][aj-1].getFlag()+ board[ai][aj-1].getFlag()+ board[ai+1][aj-1].getFlag()+
board[ai-1][aj ].getFlag()+ board[ai+1][aj ].getFlag()+
board[ai-1][aj+1].getFlag()