目 录
第一章 需求分析
基于Java编程的扫雷游戏的设计与实现是利用已学的编程知识设计开发出一款电脑益智小游戏,此款扫雷游戏意图在人们生活烦躁、工作无聊、学习乏味之时提供一种新的打发时间、舒缓压力的休闲方式。让人达到心旷神怡、办事效率加倍的良好状态。
1.1 课程设计题目
基于Java编程的扫雷游戏的设计与实现。
1.2 课程设计任务及要求
能够通过本次课程设计,熟练掌握java开发环境---eclipse环境的使用,
加深对软件开发流程理解,训练编写程序的良好习惯。认真编写需求分析文档、做好系统功能设计、学会自己进行程序的算法、数据结构设计。同时培养良好的程序设计风格和习惯,提高软件测试、调试的能力与技巧。
1.3 系统开发技术和环境
1.3.1 Java编程语言简介
Java是目前世界上最流行的计算机编程语言,是一种可以编写跨平台应用软件的面向对象的程序设计语言,也是当今使用率最高的编程语言。 Java有着自己独特的优势:语言简单、是一个面向对象、分布式应用并且安全、体系结构中立并且可移植,最重要,它是一个动态语言。 Java自1995年问世以来,因其卓越的通用性、高效性、平台移植性和安全性等特性,成为全球范围内应用范围最广的开发语言,而且即使历经十余年发展仍然在行业内保持着“常青树”的地位。
1.3.2 Eclipse简介
Eclipse 是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括Java开发工具(Java Development Kit,JDK)。
1.3.3 性能需求
该系统在性能功能上达到如下需求:
操作简单、界面友好:基于Swing组件利用GUI实现扫雷界面,首先玩家可以进行难度选择(分为三个等级:简单、普通和困难),不同的难度选择对应界面的大小和雷数的多少都有所不同,界面友好,给予玩家直观的游戏体验。在操作上,利用事件监听实现用鼠标、键盘等实现基本的游戏功能;
即时可见:对游戏成功和失败的结果以及对游戏的重置将立即在界面中进行更新,达到“即时操作、即时生效”的功能;
系统运行应该快速、稳定、高效和可靠;
在结构上应具有很好的可扩展性,便于将来的功能扩展和维护。
玩家根据对基于Java编程的扫雷游戏的设计与实现的需求分析的上述要求及与GUI的界面的交互,基于Java编程的扫雷游戏的设计与实现的功能模块分为十个大的部分:游戏页面和组件的绘制、界面的规划、底层地图的实现及地雷和数字的生成、顶部的绘制、双缓存技术、实现事件的监听功能、游戏输赢的判定、游戏的重置、添加旗数和计时、难度的选择。
第二章 项目设计
2.1 项目设计方法三原则
项目开发者在游戏开发技术方面,积累了丰富的经验,为研究游戏开发提供了科学的指导性方法论,其主要原则如下:
(1)整体性原则。整个游戏是相互联系,相互作用的诸要素组成的综合体。我们必须从整体和各组成部分的相互关系来考察事物,从整体目标和功能出发,正确处理游戏各组成部分之间的相互关系和相互作用。
(2)分解—协调原则。就是把复杂问题化成若干相对简单的子问题以方便求解。若子游戏页面的问题比较复杂,还可以再分。但在处理各类子问题时,必须根据游戏开发的整体功能和目标,协调各子游戏页面的行为、功能与目标,以保证整体功能目标的实现。
(3)目标优化原则。所谓目标优化原则对简单的系统来说,是求最优解,对复杂游戏开发来说,求的是满意解。一定要注意,目标优化原则并不简单是求最优解的问题。
这里最需要指出的是:以上三原则是游戏开发方法中处理复杂游戏开发问题的三个主要原则,并非是全部原则。在处理实际问题时,还需要在这些原则的指导下,根据每个游戏的差异性,确定求解的具体方法和策略。
2.2 项目的设计与功能模块
基于Java编程的扫雷游戏的设计和实现主要分为十个模块:
(1)游戏页面和组件的绘制:基于Swing组件利用GUI进行窗口和雷区的绘制。
(2)界面的规划:利用设置不同未知量来规划页面,将雷区大小合理分配,同时将未知量作为静态变量封装在工具包内以便于后续功能的扩展和维护。
(3)底层地图的实现及地雷和数字的生成:将图片封装在工具包中,创建底层地图类,利用随机数生成雷数,并遍历雷周围(3*3)方格进行数字的生成。
(4)顶部的绘制:创建顶层类用于顶层组件的绘制和逻辑的判断。
(5)双缓存技术:利用双缓存技术添加临时画布解决底层和顶层组件不能相容的问题。
(6)实现事件的监听功能:添加鼠标的监听事件完成左键翻开、递归翻开、右键的插旗与取消、等基本功能。
(7)游戏输赢的判定:利用点击地雷和插旗数进行游戏输赢的判定。
(8)游戏的重置:首先进行游戏状态的设定,其中笑脸代表游戏正在进行中,哭脸代表游戏失败,眼镜脸代表游戏成功,实现当点击笑脸时游戏实现重置。
(9)添加旗数和计时:通过设置变量,封装绘制方法,修改逻辑判断中的旗数和计时实现界面插旗数和计时的实时更新。
(10)难度的选择:创建难度选择类完成基本判断和方法的封装,新建难度选择页面,通过鼠标点击难度等级传参进行不同难度游戏的实现(简单:雷数为10 普通:雷数为40 困难:雷数为99)。
2.3 项目实体类设计
窗口实现类 GameWin.java
工具类 GameUtil.java
底层地图类MapBottom.java
顶层地图类 MapTop.java
初始化地雷类 BottomRay.java
生成数字类 BottomNum.java
难度选择类 GameSelect.java
2.4 项目实体类实现对应模块
1.窗口实现类 GameWin.java
a.初始化窗口方法 initWin()
b.绘制窗口 paint(Graphics g)
c.创建相关对象 new 对象()
d.添加监听适配类 this.addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent e) {
})
e.添加主程序入口
public static void main(String[] args) {
GameWin gameWin=new GameWin();
gameWin.initWin();
}
2.工具类 GameUtil.java
a.初始化常量
public static int 常量=初始化值
b.初始化图片
public static Image 图片名=Toolkit.getDefaultToolkit().getImage()
(传入图片路径)
c.封装共用方法
public static void 方法名(相关参数){}
3.底层地图类MapBottom.java
a.绘制组件
public void paintSelf(Graphics g){}
b.封装重置游戏方法
public void reGame(){}
c.绘制剩余雷数和计时
GameUtil.公用方法()
d.判断状态并绘制组件
switch(GameUtil.state){
case 0: 相关代码 break;
case 1: 相关代码 break;
case 2: 相关代码 break;
}
4.顶层地图类 MapTop.java
a.绘制组件
public void paintSelf(Graphics g){}
b.封装重置游戏方法
public void reGame(){}
c.判断逻辑
public void judge(){
//相关代码
if(GameUtil.LEFT){
//覆盖则翻开
}
if(GameUtil.RIGHT){
//覆盖则插旗
if(){}
//插旗则取消
else if(){}
}
}
d.数字翻开
public void numOpen(int x,int y){}
e.失败判定 t失败 f未失败
boolean boom(){}
f.失败显示
seeBoom(){}
g.胜利判定 t胜利 f未胜利
boolean victory(){}
h.递归翻开
spaceOpen(int x,int y){}
5.初始化地雷类 BottomRay.java
a.生成地雷
public void newRay(){}
b.避免重合
boolean isPlace=true;
public void newRay(){
if(isPlace){
//将坐标放入数组
}
}
6.生成数字类 BottomNum.java
a.生成数字
public void newNum(){}
7.难度选择类 GameSelect.java
a.绘制窗口
public void paintSelf(Graphics g){}
b.判断是否点击到等级
boolean hard(){}
c.选择不同难度并实现相关页面(方法的重载)
public void hard(int level){}
第三章 详细设计
3.1 游戏页面和组件的绘制
首先利用GUI进行游戏页面窗口的基本绘制,页面如图 3-1所示:
图3-1 进行页面窗口基本绘制
3.2 界面的规划
首先设计整个界面的合适划分,页面如图3-2所示:
图3-2 扫雷游戏界面的规划
其次将图中参数转换为对应的常量并绘制底层地图类网格
页面如图3-3所示:
图3-3 扫雷游戏界面的规划
3.3底层地图的实现及地雷和数字的生成
3.3.1 添加地雷(利用随机数)
利用随机数生成雷数和数字,如图3-4,图3-5所示:
图3-4 随机添加地雷界面
3.3.2 生成数字
图3-5 生成数字界面
3.4 顶部的绘制
此时绘制顶部图片(出现闪烁现象),如图3-6所示:
图3-6 顶部绘制界面
3.5 双缓存技术
利用双缓存技术,创建临时画布,将所有组件绘制完后一次性加入到临时画布中,然后再用画笔将临时画布绘制到窗口画布中,解决闪烁问题。
如图3-7所示:
3.6 实现事件的监听功能
3.6.1点击鼠标左键实现翻开功能
参考代码如图3-8,图3-9所示:
图3-8 鼠标左键实现翻开功能参考代码
图3-9 鼠标左键实现翻开功能参考代码
3.6.2点击空格实现递归翻开功能
参考代码如图3-10,图3-11所示:
图3-10 鼠标左键点击空格实现递归翻开功能
图3-11 鼠标左键点击空格实现递归翻开功能
3.6.3点击鼠标右键实现插旗功能
参考代码如图3-12,图3-13所示:
图3-12点击鼠标右键实现插旗功能
图3-13点击鼠标右键实现插旗功能
3.7 游戏输赢的判定
此款扫雷游戏目前为止把游戏状态分为三个阶段:
public static int state=0 //游戏中(显示笑脸)
public static int state=1 //游戏失败(显示哭脸)
public static int state=2 //游戏成功(显示戴上眼镜)
当判定游戏为游戏中(state==0)时
页面如图3-14所示:
图3-14 判定游戏状态为游戏中显示界面
当判定游戏为游戏失败(state==1)时
页面如图3-15所示:
图3-15 判定游戏状态为游戏失败显示界面
当判定游戏为游戏成功(state==2)时
页面如图3-16所示:
图3-16 判定游戏状态为游戏成功显示界面
3.8 游戏的重置
点击游戏中界面中间笑脸可完成游戏的重置
页面如图3-17所示:
图3-17 游戏重置的显示界面
3.9 添加旗数和计时
为使游戏的体验感更强将在页面左上角添加旗数并随着插旗数自减、在页面的右上角添加计时从而实现实时更新
页面效果如图3-18所示:
图 3-18 添加旗数和计时的显示界面
3.10 难度的选择
为增加游戏的趣味性和用户的体验感,在这里把游戏分为三个不同的阶段:
简单( 9*9 10个雷 )
普通( 16*16 40个雷 )
困难( 30*16 99个雷 )
为使玩家能够自主选择游戏难度,在这里为难度的选择重新绘制一个窗口并设置监听事件使玩家无论在何种游戏状态下按下鼠标中的滚轮键都能弹出难度选择页面供玩家自主选择。
重新绘制的窗口示意图如图3-19所示:
图3-19 难度选择显示界面
当游戏难度为简单时(页面布局9*9 雷数为10个)
页面如图3-20所示:
图3-20 游戏难度为简单显示界面
当游戏难度为普通时(页面布局16*16 雷数为40个)
页面如图3-21所示:
图3-21 游戏难度为普通显示界面
当游戏难度为困难时(页面布局30*16 雷数为99个)
页面如图3-22所示:
图3-22 游戏难度为复杂显示界面
第四章 课程设计总结与体会
随着互联网技术的大力发展,人们的日常生活已经离不开网络。未来时代我们的生活和工作一定会更加借助于信息技术的发展,越来越方便、快捷、安全、高效,在线网络的发展过程以及当下的应用情况和发展趋势,我们可以充分地相信网络技术将极大的改变我们的生活和娱乐方式,使我们的生活变得更加美好、舒适。
4.1 课程设计总结
本次课程设计是基于Java编程的扫雷游戏的设计和实现,利用eclipse开发环境并使用Java语言中的面向对象的封装、继承和多态、集合框架、代码块、常用类、双缓存、Swing组件、GUI等技术,将此款扫雷游戏分为十个模块,分别为:游戏页面和组件的绘制、界面的规划、底层地图的实现及地雷和数字的生成、顶部的绘制、双缓存技术、实现事件的监听功能、游戏输赢的判定、游戏的重置、添加旗数和计时、难度的选择,重点利用Java语言面向对象的封装、继承和多态,一步一步实现每个模块,不断调试和运行,直至整个扫雷游戏的实现。
4.2 心得体会
在这次课程设计中,我用Java语言中的面向对象的封装、继承和多态、集合框架、代码块、常用类、双缓存、Swing组件、GUI等技术,深切体会到Java语言面向对象的核心思想所在。通过这次课程设计,我不仅巩固了之前所学的知识,也学到了一些新的知识和编写程序的技巧。我明白了在开发项目前要先思考项目的需求、如何实现,清晰的思路和明确的目的有利于后期开发项目的顺利进行。通过本次课程设计,我认识到我所掌握的知识还尚且浅显,在今后的学习中我会针对自己所需要的知识,进一步扩展性地学习,积极培养自己对程序设计的兴趣,多与老师和同学交流,共同提高,共同进步。
参考文献
*********************************************************************************************************************************************************************************
*********************************************************************************************************************************************************************************
致谢
这次课程设计的过程中,遇见了很多理论与实践连接的问题,在此,非常感谢指导老师***和辅导老师***的指导,使得很多编程问题得以解决。课程设计选题、构思、查阅文献、修改、定稿,每一步都凝聚着导师的心血。导师以她们严谨的治学态度广博的学识宽广的视野敏锐的观察力给我在学习研究上的指导,使我的学习研究工作受益匪浅。同时***老师还经常教导我们怎样为人处世,他勤奋的工作作风,遇事勤于思考的学习和工作态度,积极进取的勇气和魄力给我的人生带来了宝贵的精神财富。在此,我深切和怀着十分感激的心情,向老师表达我最真挚的感谢。在同时我也要感谢我的同学和朋友,在我课程设计过程中对我的鼓励和支持!在漫长的学习生涯中,感谢我的父母在精神上的理解与支持和在生活上的照顾。我的课程设计凝聚着他们的长期支持,我对他们在我成长道路上所付出的艰辛和汗水致以真诚的感谢!
值此课程设计完成之际,再次向所有关心、支持、帮助我的老师、同学和朋友们表示我衷心的感谢。