扫雷游戏程序课程设计报告书.docx

上传人:b****6 文档编号:4589404 上传时间:2022-12-07 格式:DOCX 页数:46 大小:160.69KB
下载 相关 举报
扫雷游戏程序课程设计报告书.docx_第1页
第1页 / 共46页
扫雷游戏程序课程设计报告书.docx_第2页
第2页 / 共46页
扫雷游戏程序课程设计报告书.docx_第3页
第3页 / 共46页
扫雷游戏程序课程设计报告书.docx_第4页
第4页 / 共46页
扫雷游戏程序课程设计报告书.docx_第5页
第5页 / 共46页
点击查看更多>>
下载资源
资源描述

扫雷游戏程序课程设计报告书.docx

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

扫雷游戏程序课程设计报告书.docx

扫雷游戏程序课程设计报告书

Java扫雷游戏课程设计

一、课程设计目的

通过选择《Java课程设计》中扫雷游戏,这个综合性的题目作为本次的课程设计。

可以让我们更加熟悉Java程序设计这门课程,学会熟练使用Eclipse这个编程软件,加深对Java语言中相关知识的掌握,提高编程水平。

同时培养独立思考和同学间团结合作的能力,为毕业设计以及将来的工作和学习打下坚实的基础。

并且通过这次课程设计,我们也可以得到一下能力的锻炼:

(1)进一步巩固、加深学生所学专业课程《JAVA语言教程》的基本理论知识,理论联系实际,进一步培养学生综合分析问题,解决问题的能力。

(2)全面考核学生所掌握的基本理论知识及其实际业务能力,从而达到提高学生素质的最终目的。

(3)利用所学知识,开发小型应用系统,掌握运用JAVA语言编写调试应用系统程序,训练独立开发应用系统,进行数据处理的综合能力。

(4)对于给定的设计题目,如何进行分析,理清思路,并给出相应的数学模型。

(5)熟练掌握JAVA语言的GUI设计,灵活运用各种类库。

二、设计内容及要求

Windows游戏提供的扫雷游戏是一个很有趣的游戏。

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

内容:

设计一个类似windows的扫雷游戏,达到中级水平,即:

196个方块,40个雷。

具体内容如下:

(1)我的程序刚进入界面时便会有一张漂亮的画面,以此来吸引用户的兴趣。

(2)我的扫雷游戏只有一个级别中级,扫雷英雄榜存储最好成绩,即挖出全部的地雷且用时最少者。

单击游戏菜单可以选择“开始游戏”或“查看英雄版”。

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

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

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

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

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

(6)扫雷胜利后(用时最少者),程序弹出保存成绩的对话框。

(7)用户可以选择标记疑问的方块,用可以勾选游戏菜单下的标记即可,此时双击右键并可出现“?

”标记。

(8)当用户用鼠标点击时程序上的笑脸时游戏便开始了新的一局。

用户成功是便会有一张很酷的表情,担当用户失败是,便会有一张哭丧的表情。

具体要求如下

(1)右键标示为雷,左键直接翻开。

(2)无雷的方块翻开后用数字表示周围8个方块中的地雷数,周围每雷的方块翻开后,同时翻开周围方块(和windows游戏一样)。

(3)由数字动态表示已进行的时间(单位是秒)和已挖出的雷。

(4)选作内容:

支持左、右键同时按下后的功能。

三、程序设计步骤

该程序共创建了八个包,每个包都有各自的作用,每个包中又有不同的类。

其中他们的作用包括,设计雷区,设计界面,布置雷,还有显示时间和雷数。

以及显示不同的图片。

程序中主要包含的包方法和类:

定义的包

包中的类

类中的主要方法和变量

bean

MineLabel

MineLabel

Own

setName

setTimes

dialog

ShowWin

init

Win

Init、JTextField

frame

SartFrame

Restart、setStart

listener

MineMenuListener

actionPerformed

MouseListener

MouseListener、mousePressed、mouseReleased

MouseMotionListener

mouseMoved、mouseDragged

menu

MineMenu

SartFrame、heroMenu、fileMenu、getSartFrame

panel

MineField

buildMinesartFrame

MineState

usedtimeG、usedtimeS、usedtimeBnewGame

timer

Timers

mineStateact、ionPerformed、times

tools

Tools

Motifmetal、Image、windows

1、扫雷棋盘的布局设计

系统的整体布局采用了复杂的网格布局,采用了菜单、按钮、面板…等组件,菜单主要包括开始,中级,扫雷英雄榜,退出,布局中的笑脸按钮的功能是重新开始新的游戏。

2、雷区设计

首先定义雷快所在的行和列,privateintrowIndex;//雷块所在的行privateintcolIndex;//雷块所在的列

showwin类是packagecom.sf.minesweeper.dialog包中Jpanel容器的子类,实现了ActionListener和MouseListener接口,所创建的对象:

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

1、成员变量

(1定义二维数组数组,用来确定雷区有多少需进行扫雷的方块。

(2)tools是packagecom.sf.minesweeper.tools包中的类,用来显示图片,包括显示时间表情笑脸的等多种图片。

(3)privateMineStatemineState;//记雷数privateMineFieldmineField;//布置labble和雷数,负责设置数组中的哪些方块是雷或不是雷。

(4)settitle负责提供保存成绩的界面,是一个对话框,默认不可见。

用户只有扫雷成功后(用时最少),才可以看见对话框。

(5)reStart是一个按钮对象,用户单击它选择游戏是否开始以及重新开始游戏。

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

2、方法

(1)own方法可根据参数提供的数据设置雷区的宽度、高度、雷的数目以及雷区的级别。

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

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

(3)show()方法是一个递归方法。

actionPerformed(ActionEvent)方法执行时将调用show方法进行扫雷。

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

(5)Win()方法用来判断用户是否扫雷成功,如果成功该方法负责让对话框可见。

3、图片显示

Imageicom是packagecom.sf.minesweeper.tools包中的类,用来显示图片,其中图片被放在文件夹image中,程序通过调用其中的图片来显示。

不同的图片。

ImageIcontimeCount[],用来显示d0-d10时间标签图片,ImageIconiiface分别对应face0-face9表情标签图片。

ImageIconiimine分别对应mine-mine3雷表情标签图片。

ImageIconiiask分别对应ask-ask2问号表情标签图片。

iiflag对应旗子表情标签图片iihole对应点表情标签图片。

4、扫雷游戏的功能图如下:

四、调试及测试

扫雷游戏的主要界面主要界面如下:

界面中有游戏和帮助按钮,其中游戏按钮中包括开局、中级、扫雷英雄榜、退出等按钮。

帮助按钮中有关于扫雷的按钮。

扫雷游戏的界面是14*14的界面,戏中界面中有40个雷。

运行游戏,当玩家踩到地雷时,会出现如下的界面:

如果你认为是雷,就可以标上一个旗帜,如果不确定就可以标上一个问号,但是如果你踩到了地雷,将会出现上面的界面。

如果你扫雷成功了,就会有如下界面:

如果你成功的标记处所有的雷区,那么,最后就会弹出“留下你大名”的界面。

你就可以把你的名字保存在扫雷英雄榜中。

五、本设计改进建议和总结

我的程序界面的美观性做的不太好,比如说布局,颜色搭配有待改进,没有初始化界面,界面大小难以控制。

当我做完之后,确实有一点成就感,这种感觉激励着自已更加努力的学习这门课程编程的进程肯定会遇到困难,要充分利用现有的资源比如说互联网,书籍,这次实验多亏在在网上找的Java API,帮助我解决了不小困难。

要有团队合作精神,很感谢我的认友在这次实验给予我的帮助。

通过这次实训,增加了我学习软件技术的兴趣,虽然还不明确软件技术包含的具体内容,但从Java语言这门课程开始,已发现程序设计的乐趣,在学习Java语言的过程中也学到了许多计算机应用基础知识,对计算机的机体也有了一个大体的了解.特别是在做这些比较大型的编程软件中学到了很多知识。

这次实训是老师给了题目,经过自己的努力,实现要求。

先做简单的小程序游戏界面和布置,一步步的再做其它要求,在实际操作过程中犯的一些错误还会有意外的收获,感觉实训很有意思。

在具体操作中对这学期所学的Java的理论知识得到巩固,达到实训的基本目的,也发现自己的不足之出,在以后的上机中应更加注意,同时体会到Java语言具有的语句简洁,使用灵活,执行效率高等特点。

发现上机实训的重要作用,特别是对数组和循环有了深刻的理解。

通过实际操作,学会Java语言程序编程的基本步骤、基本方法,开发了自己的逻辑思维能力,培养了分析问题、解决问题的能力。

深刻体会到“没有做不到的,只有想不到的”,“团结就是力量”,“实践是检验真理的标准”……的寓意。

在此希望以后应多进行这样的实训,加长设间,培养我们独立思考问题的能力,提高实际操作水平,感谢老师的指导。

六、主要参考文献

[1]张永常,JAVA程序设计实用教程,电子工业出版社

[2]施霞萍,JAVA程序设计教程,机械工业出版社

[3]《JavaApplet实例编程》,赤金、聂松编著,中国水利水电出版社 

[4]《Java开发利器——Eclipse从入门到精通》张峰科技编,清华大学出版社

[5]Apache社区http:

//www.apache.org

六、程序源代码

packagecom.sf.minesweeper.frame;

importjava.applet.Applet;

importjava.applet.AudioClip;

importjava.awt.BorderLayout;

importjava.io.FileInputStream;

importjava.io.FileNotFoundException;

importjava.io.InputStream;

importjavax.swing.ImageIcon;

importjavax.swing.JApplet;

importjavax.swing.JFrame;

importjavax.swing.JLabel;

importjavax.swing.JPanel;

importjavax.swing.Timer;

import.*;

importjava.applet.AudioClip;

importcom.sf.minesweeper.listener.MouseListener;

importcom.sf.minesweeper.menu.MineMenu;

importcom.sf.minesweeper.panel.MineField;

importcom.sf.minesweeper.panel.MineState;

importcom.sf.minesweeper.timer.Timers;

importcom.sf.minesweeper.bean.MineLabel;

importcom.sf.minesweeper.tools.Tools;

publicclassSartFrameextendsJFrame{

privatestaticfinallongserialVersionUID=-1585043387266273492L;

/**

*@paramargs

**/

privateMineStatemineState;//记雷数

privateMineFieldmineField;//布置labble和雷数

privateMineMenumineMenu;

privateTimertimer;

privateTimerstimers;

/**

*游戏是否开始

**/

privatebooleanisStart;

//JLabeljLabel_start=newJLabel();//开始图片

publicSartFrame(){

this.setTitle("扫雷");

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

this.setLocationRelativeTo(null);

setIconImage(Tools.iicon);//利用tools来做的作

this.setResizable(false);//这样让窗口不会可放大

//..................状态栏.....................

mineState=newMineState(this);

this.add(mineState,BorderLayout.NORTH);

//...................雷区......................

mineField=newMineField(this);

this.add(mineField,BorderLayout.CENTER);

//....................菜单栏................

mineMenu=newMineMenu(this);

this.setJMenuBar(mineMenu);

//.....................时间................

Tools.time=0;

timers=newTimers(mineState);

timer=newTimer(1000,timers);

pack();

this.setVisible(true);

}

//重新布局

publicvoidrestart(){

this.remove(mineState);

this.remove(mineField);

//..................状态栏.....................

mineState=newMineState(this);

this.add(mineState,BorderLayout.NORTH);

//...................雷区......................

mineField=newMineField(this);

this.add(mineField,BorderLayout.CENTER);

//.....................时间................

Tools.time=0;

Timerstimers=newTimers(mineState);

timer=newTimer(1000,timers);

pack();

validate();//刷新窗体

}

publicstaticlonggetSerialversionuid(){

returnserialVersionUID;

}

publicMineStategetMineState(){

returnmineState;

}

publicMineFieldgetMineField(){

returnmineField;

}

publicMineMenugetMineMenu(){

returnmineMenu;

}

publicTimergetTimer(){

returntimer;

}

publicTimersgetTimers(){

returntimers;

}

publicbooleanisStart(){

returnisStart;

}

publicvoidsetStart(booleanisStart){

this.isStart=isStart;

}

publicstaticvoidmain(String[]args){

newSartFrame();

}

}

packagecom.sf.minesweeper.bean;

//Downloadby

importjavax.swing.JLabel;

/**

*自定义标签(雷块)

**/

publicclassMineLabelextendsJLabel{

privatestaticfinallongserialVersionUID=-7271927020145498558L;

/**

*判断是否是雷

**/

privatebooleanisMine;

/**

*判断雷块是否展开

**/

privatebooleanisExpanded;

/**

*判断雷块是否是旗子

**/

privatebooleanisFlag;

/**

*判断是否是雷且未标上旗子

**/

privatebooleanisMineAndNotflag;

/**

*count计算雷块周围的雷数

**/

privateintmineCount;

/**

*雷块所在的行

**/

privateintrowIndex;

/**

*雷块所在的列

**/

privateintcolIndex;

privateintexpend=0;

//雷区上的行列坐标

publicMineLabel(introwIndex,intcolIndex){

this.rowIndex=rowIndex;

this.colIndex=colIndex;

}

//一向是对应的一些get和set方法

publicbooleanisMine(){

returnisMine;

}

publicvoidsetMine(booleanisMine){

this.isMine=isMine;

}

publicbooleanisExpanded(){

returnisExpanded;

}

publicvoidsetExpanded(booleanisExpanded){

this.isExpanded=isExpanded;

}

publicbooleanisFlag(){

returnisFlag;

}

publicvoidsetFlag(booleanisFlag){

this.isFlag=isFlag;

}

publicintgetMineCount(){

returnmineCount;

}

publicvoidsetMineCount(intmineCount){

this.mineCount=mineCount;

}

publicintgetRowIndex(){

returnrowIndex;

}

publicvoidsetRowIndex(introwIndex){

this.rowIndex=rowIndex;

}

publicintgetColIndex(){

returncolIndex;

}

publicvoidsetColIndex(intcolIndex){

this.colIndex=colIndex;

}

/**

*rightClickCount右键点击次数

**/

privateintrightClickCount;

publicintgetRightClickCount(){

returnrightClickCount;

}

publicvoidsetRightClickCount(intrightClickCount){

this.rightClickCount=rightClickCount;

}

}

packagecom.sf.minesweeper.bean;

publicclassOwnimplementsComparable{

privateinttimes;

privateStringname;

privateStringlevel;

publicOwn(inttimes,Stringname,Stringlevel){

super();

this.times=times;

this.name=name;

this.level=level;

}

publicStringgetLevel(){

returnlevel;

}

publicvoidsetLevel(Stringlevel){

this.level=level;

}

publicintgetTimes(){

returntimes;

}

publicvoidsetTimes(inttimes){

this.times=times;

}

publicStringgetName(){

returnname;

}

publicvoidsetNa

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

当前位置:首页 > 高中教育 > 英语

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

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