java课程设计 SWT 扫雷功能图类图类详细说明测试.docx
《java课程设计 SWT 扫雷功能图类图类详细说明测试.docx》由会员分享,可在线阅读,更多相关《java课程设计 SWT 扫雷功能图类图类详细说明测试.docx(53页珍藏版)》请在冰豆网上搜索。
java课程设计SWT扫雷功能图类图类详细说明测试
《面向对象程序设计》
课程设计报告
题目:
扫雷游戏
院(系):
计算机与电子系
专业班级:
计算机科学与技术0901班
*******
学号:
***********
******
2012年6月4日至2012年6月15日
华中科技大学武昌分校制
面向对象程序设计课程设计任务书
一、设计(调查报告/论文)题目
扫雷游戏
二、设计(调查报告/论文)主要内容
内容:
扫雷游戏分为初级,中级和高级三个级别,扫雷英雄榜存储每个级别的最好成绩,即挖出全部的地雷且用时最少者。
游戏菜单可以选择“初级”,“中级”和“高级”或“查看英雄榜”。
基本功能与要求:
1.选择级别后将出现相应级别的扫雷区域,这时用户使用鼠标左键单击雷区中的任何一个方块启动计时器。
2.用户要揭开某个方块,可单击它。
若所揭方块下有雷,用户便输了这一局,若所揭方块下无雷,则显示数字,该数字代表方块周围的八个方块中共有多少颗雷。
3.如果用户认为某个方块下埋有地雷,单击右键可以在方块上标识一个用户认为是雷的图标,即给出一个扫雷标记。
用户每标记出一个扫雷标记(无论用户标记是否正确),程序将显示剩余雷数减少一个。
4.扫雷胜利后(用时最少者),程序弹出保存成绩对话框。
三、原始资料
1.《面向对象程序设计课程设计》指导书
2.耿祥义.JAVA大学实用教程.北京:
清华大学出版社,2009.
四、要求的设计(调查/论文)成果
1.课程设计报告
2.课程设计软件
五、进程安排
布置任务,查找资料、需求分析1天
总体设计1天
详细设计1.5天
编制源程序实现3.5天
测试与修改1天
撰写课设报告2天
六、主要参考资料
[1]张广彬.Java课程设计案例精编(第二版).北京:
清华大学出版社,2011.
[2]耿祥义.Java课程设计(第二版).北京:
清华大学出版社,2008.
[3]耿祥义.JAVA大学实用教程.北京:
清华大学出版社,2009.
[4]邹林达.陈国君Java2程序设计基础.北京:
清华大学出版社,2010.
[5]邹林达.Java2程序设计基础实验指导.北京:
清华大学,2010.
指导教师(签名):
20年月日
1需求与总体设计……………………………………………………………………………1
1.1需求分析…………………………………………………………………………1
1.2功能图样…………………………………………………………………………1
1.3总体设计…………………………………………………………………………2
1.4类图设计…………………………………………………………………………2
2详细设计……………………………………………………………………4
2.1总体阐述…………………………………………………………………………………4
2.2ImageSource类………………………………………………………………………4
2.3MouseLeftListener类…………………………………………………………………5
2.4MouseRightListener类……………………………………………………………………5
2.5CountT类…………………………………………………………………………………6
2.6fuzhumianbanComposite类…………………………………………………………………7
2.7hero类………………………………………………………………………………………8
2.8mainshell类……………………………………………………………………………9
2.9MenuShell类…………………………………………………………………………10
2.10mineborder类……………………………………………………………………………11
3编码实现…………………………………………………………………………………13
3.1minesweeper.action包…………………………………………………………………13
3.2minesweeper.images包……………………………………………………………………22
3.3minesweeper.swt包……………………………………………………………………22
4系统测试………………………………………………………………………………………44
4.1程序主界面…………………………………………………………………………………44
4.2游戏难度测试………………………………………………………………………………44
4.3英雄榜测试…………………………………………………………………………………46
4.4游戏失败测试………………………………………………………………………………47
4.4游戏获胜测试………………………………………………………………………………47
总结……………………………………………………………………………………50
1需求与总体设计
1.1需求分析
1.1.1课程设计目的
本次课程设计的主要目的是为了通过具体的程序加深对java语言的掌握,提高自己的编程水平。
选择的题目为扫雷游戏,这是一个综合性的题目,可以对java中的各项功能有更好的理解和使用,同时也为以后的工作打下一定基础。
1.1.2应用平台
系统平台:
WindowsXP/VISTA/7
编程语言:
JAVA
开发平台:
Eclipse
图形化界面:
SWT
1.1.3程序描述和功能需求分析
扫雷游戏分为初级,中级和高级三个级别,扫雷英雄榜存储每个级别的最好成绩,即挖出全部的地雷且用时最少者。
游戏菜单可以选择“初级”,“中级”和“高级”或“查看英雄榜”。
基本功能与要求:
(1)选择级别后将出现相应级别的扫雷区域,这时用户使用鼠标左键单击雷区中的任何一个方块启动计时器。
(2)用户要揭开某个方块,可单击它。
若所揭方块下有雷,用户便输了这一局,若所揭方块下无雷,则显示数字,该数字代表方块周围的八个方块中共有多少颗雷。
(3)如果用户认为某个方块下埋有地雷,单击右键可以在方块上标识一个用户认为是雷的图标,即给出一个扫雷标记。
用户每标记出一个扫雷标记(无论用户标记是否正确),程序将显示剩余雷数减少一个。
(4)扫雷胜利后(用时最少者),程序弹出保存成绩对话框。
1.2功能图样
图1-1功能图样
1.3总体设计
扫雷游戏由包minesweeper.swt中的主类mainshell创建,它调用该包其他类来完成该游戏的各个模块的创建:
调用fuzhumianbanComposite类创建辅助面板,调用MenuShell类来创建菜单栏,调用mineborder来创建扫雷区。
被调用的3个类又有自己的监听器,而当用到鼠标监听器时,则调用包minesweeper.action里面的MouseLeftListener和MouseRightListener来创建鼠标左击右击监听器。
1.4类图设计
图1-2类图设计
2详细设计
2.1总体阐述
在Java图形界面中创建扫雷游戏的实现方法,需要SWT中的Widgets组件,Events组件,Images组件,Layout组件。
SWT(StandardWidgetToolkit)StandardWidgetToolkit是一个开源的GUI编程框架,与AWT/Swing有相似的用处,著名的开源IDE-eclipse就是用SWT开发的。
SWT提供了一种高效的创建图像化用户界面的能力,也是Eclipse平台的UI组件之一。
它相比于Swing,速度相对比较快,而且因为使用了与操作系统相同的渲染方式,界面上与操作模式上比较接近操作系统的风格。
对于跨平台性的问题,SWT是通过不同的底层支持库来解决的。
2.2ImageSource类
详细类图:
ImageSource类是用于初始化各Image,便于图片更改,其详细类图信息如图所示:
图2-1ImageSource详细类图
(1)成员变量
image是Image[9]型,用于初始化扫雷个数的0-8的图片。
d是Display类型,用于接受传入构造函数的Display
mine,explosion,flag,wrong,digbome,xiaolian,app,background都是Image类型,用于存储对应的应用程序所需的图片
(2)方法
ImageSource(Displaydisplay)是该类的构造函数,带入的display是传入自身成员变量
2.3MouseLeftListener类
详细类图:
MouseLeftListener类是创建鼠标左键点击触发的事件,其详细类图信息如图所示:
图2-2MouseLeftListener详细类图
(1)成员变量
Button_Game是Button[][]型,用于接收构造函数传入的Button[][]数组
Map_Bomb是Int[][]型,用于接收构造函数传入的Int[][]数组
Bomb_I和Bomb_J是Int型,Bomb_I为地雷区有多少行,Bome_J为地雷区有多少列。
在构造函数初始化。
Imagesource是ImageSource类的实例,便于函数调用初始化后的图片
(2)方法
MouseLeftListener(Button[][],int[][],int,int)是该类的构造函数,带入的Button[][]是用来初始化成员变量Button_Game的,两个int参数分别先后初始化了Bome_I和Bome_J。
sweep(int,int)是用于扫开固定坐标地雷的函数,传入坐标(x,y)值,翻开指定坐标的button的内容。
mouseUp(MouseEvent)是该监听器的重载函数,用于实现点击的事件,即扫雷。
2.4MouseRightListener类
详细类图:
MouseRightListener类是创建鼠标右键点击触发的事件,其详细类图信息如图所示:
图2-3MouseRightListener详细类图
(1)成员变量
Button_Game是Button[][]型,用于接收构造函数传入的Button[][]数组
Map_Bomb是Int[][]型,用于接收构造函数传入的Int[][]数组
Bomb_I和Bomb_J是Int型,Bomb_I为地雷区有多少行,Bome_J为地雷区有多少列。
在构造函数初始化。
Imagesource是ImageSource类的实例,便于函数调用初始化后的图片
(2)方法
MouseRightListener(Button[][],int[][],int,int)是该类的构造函数,带入的Button[][]是用来初始化成员变量Button_Game的,两个int参数分别先后初始化了Bome_I和Bome_J。
mouseUp(MouseEvent)是该监听器的重载函数,用于实现点击的事件。
即设立flag和消去flag。
2.5CountT类
详细类图:
CountT类是创建TimerTask任务,它继承了java.util.TimerTask类,定期更新mineborder.CountTime时间,并且把传入构造函数的CLabel更新显示当前时间,其详细类图信息如图所示:
图2-4CountT详细类图
(1)成员变量
cl是CLabel类的实例,用于接受构造函数传入的CLabel。
(2)方法
CountT(CLabel)是该类的构造函数,传入CLabel类型给成员变量cl,并且调用run()方法来异步更新cl显示的内容。
2.6fuzhumianbanComposite类
详细类图:
fuzhumianbanComposite类是在主程序上方创建一个辅助的面板,它继承了Composite类,便于用户操作,它创建出一个叫l1的label显示剩余雷数,一个叫l2的label显示已用时间,一个叫startbottom的button用来重新开始,其详细类图信息如图所示:
图2-5fuzhumianbanComposite详细类图
(1)成员变量
l1,l2是CLabel类的实例,l1用来显示剩余雷数,l2用来显示已用时间
startbottom是Button型,用来给用户点击,从而重新开启一局
FirstClickFlag是Boolean类型,默认为True,用来标记是否为鼠标第一次点击
(2)方法
fuzhumianbanComposite(Composite)是该类的构造函数,传入Composite来初始化父类,且父类样式为SWT.BORDER|SWT.TRANSPARENT。
newSelectionAdapter(){...}是该成员变量startbottom的监听器,widgetSelected(SelectionEvent)是该按钮的启动监听器事件,当该按钮被点击,则重新开始新的一轮。
2.7hero类
详细类图:
hero类是创建英雄榜类,有查看英雄榜和更新最高得分的功能,其详细类图信息如图所示:
图2-6hero详细类图
(1)成员变量
lb12,lb22,lb32是Label的实例,用于显示初级,中级,高级难度的历史最高纪录
strbegin,strmidd,strhard是String型,用来存储各等级难度的历史最高纪录
dg是Shell型,用于接受构造函数时传入该对话框所在的Shell
highscore是int型,用于保存当前难度的最高分数。
(2)方法
hero()是该类的构造函数,读取文件highscore.txt里面的记录来初始化strbegin,strmidd,strhard这3个字符串。
herodiag(Shell)传入父Shell,用于创建英雄榜对话框,该对话框用6个Label,每两个为一对,用于显示提示信息和最高记录;一个Button,用于离开该对话框,该button有监听器newSelectionListener(){...},用来监听鼠标点击。
scorecompare()是判断当前获胜分数是否能刷新英雄榜上的历史最高分数。
sethighscore()用于设置最高分数,它有一个Label用于显示提示信息,一个Text用于记录玩家姓名。
gethighscore(String)传入String记录,过滤姓名等信息,提取出他的分数
2.8mainshell类
详细类图:
mainshell类是创建主窗口(调用MenuShell创建Menu,调用mineborder创建扫雷面板,调用fuzhumianbanComposite创建辅助面板),其详细类图信息如图所示:
图2-7mainshell详细类图
(1)成员变量
d是Display型,用于存储创建的Display,便于其他类调用。
s是Shell型,用于存储创建的Shell,便于其他类调用。
fuzu是fuzhumianbanComposite类的实例,用于创建辅助面板。
mb是mineborder类的实例,用于创建扫雷区
gd是GridData类的实例,用于设置布局
(2)方法
main(String[])是整个程序的方法,该方法创建主Shell,并调用其他类。
它有3个监听器,用于调正游戏难度。
2.9MenuShell类
详细类图:
MenuShell类是用于创建菜单栏,拥有游戏和帮组两大主菜单,其详细类图信息如图所示:
图2-8MenuShell详细类图
(1)成员变量
s是Shell型,用于接收构造函数传入的父Shell。
easyradioItem,middleradioItem,hardradioItem是MenuItem型,并且样式都为SWT.RADIO,一次只能选取一个难度
(2)方法
MenuShell(Shell)是该类的构造函数,构造出菜单栏,他有2个子菜单:
游戏和帮助。
游戏上有选项:
开局,初级,中级,高级,英雄榜,退出。
帮助上有选项:
使用帮助和关于扫雷。
每个选项都有其对应的选择监听器。
2.10mineborder类
详细类图:
mineborder类是用于扫雷区,其详细类图信息如图所示:
图2-9mineborder详细类图
(1)成员变量
Button_Game是Button[][]型,用于创建扫雷区
Map_Bomb是Int[][]型,用于创建扫雷区的地雷分布图
Bomb_I和Bomb_J是Int型,Bomb_I为地雷区有多少行,Bome_J为地雷区有多少列。
mines,Tag_Num,CountTime都是int型,mines用来定义雷数,Tag_Num用来定义flag可用数目,CountTime用来计时
timer是Timer类型,用来定义计时器。
Success是boolean类型,默认为true,用来辅助判断玩家是否获胜的条件,一旦玩家中途失败,则设置为false
(2)方法
mineborder(Composite,int,int,int,int)是该类的构造函数,带入的Composite是父容器,此处为父Shell,后面的int依次为样式,行数,列数,雷数
reset()用于重新开始游戏。
3编码实现
3.1minesweeper.action包
(1)ImageSource类
packageminesweeper.action;
importorg.eclipse.swt.graphics.*;
importorg.eclipse.swt.widgets.*;
//该类用于初始化各Image,便于图片更改
publicclassImageSource{
privateDisplayd;
publicImage[]image=newImage[9];
publicImageSource(Displaydisplay){//构造函数,用于初始化0-8,这九个图片的image
this.d=display;
for(inti=0;i<9;i++)
image[i]=newImage(d,"bin\\minesweeper\\images\\"+i+".gif");
}
//定义各种image,便于其他类调用
publicImagemine=newImage(d,"bin\\minesweeper\\images\\mine.gif");
publicImageexplosion=newImage(d,"bin\\minesweeper\\images\\explosion.gif");
publicImageflag=newImage(d,"bin\\minesweeper\\images\\flag.gif");
publicImagewrong=newImage(d,"bin\\minesweeper\\images\\wrong.gif");
publicImagedigbome=newImage(d,"bin\\minesweeper\\images\\digbome.gif");
publicImagexiaolian=newImage(d,"bin\\minesweeper\\images\\xiaolian.ico");
publicImageapp=newImage(d,"bin\\minesweeper\\images\\app.png");
publicImagebackground=newImage(d,"bin\\minesweeper\\images\\background.jpg");
}
(2)MouseLeftListener类
packageminesweeper.action;
importjava.io.IOException;
importjava.util.TimerTask;
importminesweeper.swt.*;
importorg.eclipse.swt.SWT;
importorg.eclipse.swt.widgets.*;
importorg.eclipse.swt.events.*;
//创建左键点击触发的MouseAdapter
publicclassMouseLeftListenerextendsMouseAdapter{
privateButton[][]Button_Game;
privateint[][]Map_Bomb;
privateintBomb_I,Bomb_J;
privateImageSourceimagesource=newImageSource(mainshell.d);
//构造函数,用于初始化参数,便于后续进行操作
publicMouseLeftListener(Button[][]Button_Game,int[][]Map_Bomb,intBomb_I,intBomb_J){
this.Button_Game=Button_Game;
this.Map_Bomb=Map_Bomb;
this.Bomb_I=Bomb_I;
this.Bomb_J=Bomb_J;
}
//sweep函数,传入(x,y)坐标,翻开该坐标button的内容
publicvoidsweep(intX,intY){
if(Button_Game[X][Y].getImage()==null){
if(Map_Bomb[X][Y]==9){//如果选择的是雷
Button_Game[X][Y].setImage(imagesource.mine);//设置为雷的图片
}
else{
Button_Game[X][Y].setImage(imagesource.image[Map_Bomb[X][Y]]);//设置成相应数字的图片
}
if(Map_Bomb[X][Y]==0)//如果该格子周围什么都没有,挖开周围所有
{
if(Y-1>=0)
{
sweep(X,Y-1);//如果该雷的左边存在,那么对他调用sweep函数扫雷
if(X+1sweep(X+1,Y-1);//如果该雷的左下方存在,那么对他调用sweep函数扫雷
if(X-1>0)
sweep(X-1,Y-1);//如果该雷的左上方存在,那么对他调用sweep函数扫雷
}
if(X-1>=0)
sweep(X-1,Y);//如果该雷的上方存在,那么对他调用sweep函数扫雷
if(X+1sweep(X+1,Y);