版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、算法设计与分析课程设计扫雷游戏设计班 级计科1003班姓 名 指 导 教 师开 发 时 间2012.12.18湖南涉外经济学院信息科学与工程学院2012年12月摘 要扫雷游戏是Windows操作系统自带的一个小游戏,过去的几年里Windows操作系统历经数次换代,变得越来越庞大、复杂,但这个可爱的小游戏在任何版本的Windows操作系统里去地依然保持着原貌。但几乎每个电脑使用者都接触过它,并且深爱着这款小游戏。游戏上手极其简单,但是要熟练地掌握其中的操作及找出雷的技巧,难度却不低。作为家喻户晓老少皆宜的大众游戏,其普及程度可以说是史上任何一款游戏都无法相比的。游戏的操作方面主要以鼠标为主,当鼠
2、标指针对准未翻开的方块按下左键时即表示翻开方块,当鼠标指针对准未翻开的方块按下右键时即表示标示或疑示地雷,反复按下右键则方块会以未标示标示疑似三者关系不断循环。游戏者可以通过地雷区内的数字提示了解以数字为中心的其周边八个方格内所含的地雷数,假若翻开的方块显示数字“3”,则表示以其为中心的周边方块内藏有3个地雷。当按下的方块不是地雷,且周边八个方块也都没有地雷时,方块会以被翻开方块的八个方向将空白方块翻开。扫雷游戏是比较经典的一款小游戏,实现它的方法很多,可以用很多不同算法和语言实现,如 C,C+,VB,Jave,C#等。本论文研究的是以java为开发环境,设计并开发一款扫雷游戏,其功能类似于W
3、indows操作系统自带的扫雷游戏。论文首先介绍了制作游戏的整体思路及整个游戏设计的流程规划,然后介绍了雷区的布置及地雷随机产生的实现方法;重点介绍了在游戏过程中各事件的处理,其中又以鼠标事件和清除未靠近地雷区方块这两方面最为重要,鼠标事件是利用鼠标所发出的信息了解使用者的意图,进而做出相对应的动作。关键词:java;扫雷;课程设计;目 录第一章 引言21.1 课题背景及意义21.2开发的目的以及意义21.3关于本课题3第二章 游戏的总体分析42.1 游戏功能简介42.2 扫雷游戏的基本要求52.3 功能需求分析5第三章 游戏的具体分析63.1 总体功能图63.2 主要功能设计流程73.2.1
4、 总体流程图7图3-2-1 总体流程图7 雷区设计流程图8 排行榜设计流程图93.3各个类的详细介绍与关键代码93.3.1 类之间关系图93.3.2 MainFrame类103.3.3 LEDNumber类123.3.4 MineGrid类133.3.5 AboutDialog类133.3.6 CustomDialog类143.3.7 ImageFactory类153.3.8 UserDialog类153.3.9 LevelInfo类153.3.10 LogDialog类17第四章 游戏的实现194.1游戏的初级界面194.2游戏的中级界面204.3游戏的高级界面214.3 游戏的打包发布过程
5、22第五章 结 论24参考文献25第一章 引言1.1 课题背景及意义 扫雷最原始的版本可以追溯到1973年一款名为“方块”的游戏。不久之后,“方块”被改写成了游戏“Rlogic”。在“Rlogic”里,玩家的任务是作为美国海军陆战队队员,为指挥中心探出一条没有地雷的安全路线,如果路全被地雷堵死就算输。两年后,汤姆·安德森在“Rlogic”的基础上又编写出了游戏“地雷”,由此奠定了现代扫雷游戏的雏形。1981年, 微软公司的罗伯特·杜尔和卡特·约翰逊两位工程师在Windows 3.1系统上加载了该游戏,扫雷游戏才正式在全世界推广开来。 在计算机逐步渗入社会生活各个层
6、面的今天,计算机已经成为了人们日常生活中的一部分,越来越多的人使用计算机办公、娱乐等等。在这其中,系统自带的小游戏也占据了相当重要的地位,与那些网络游戏和3D游戏相比,它有编写简单容易上手等特点,非常适合人们在完成工作的时候适当的娱乐要求。这些小游戏大都是以益智和娱乐为目的,不仅给紧张工作的人们以放松,还可以让人们的大脑得到开发。这些小游戏包括扫雷,弹球,纸牌等等。而本课题就是扫雷游戏的设计。1.2开发的目的以及意义 大学以来各门专业课程的学习,让我综合知识全面提升了很多。为了提高自己的动手能力,将知识灵活的运用,此次我设计了一个扫雷程序。希望将书本上所学的理论知识与实际相结合,通过本次的程序
7、设计使自己在程序的开发和设计上有新的认识并能有所提高。也对于我们以后工作能力的培养具有重要意义。1.3关于本课题至少需实现的主要功能(也可以加上一些扩展功能):(1) 用户可以自定义级别并且可以任意输入雷数;(2) 具有计时功能;(3) 可以查看英雄榜。 可以不实现的功能:(4) 可以不做问号;(5) 可以不做鼠标左右两键同时操作;(6) 可以不做鼠标移动。第二章 游戏的总体分析2.1 游戏功能简介 扫雷游戏的基本功能:点击鼠标左键于雷区,如果雷区有雷,显示所有的地雷后游戏结束。若无雷,则显示周围雷数。如果周围没雷的话,则查看周围八个区域是否有雷直到有雷为止并显示,这其实是一个递归过程。点击鼠
8、标右键于雷区,则将其置为有雷而不管是否真的有雷。用户可选择初、中、高三级也可自定义雷数和区域大小。雷区左上角显示总雷数减去被标明有雷区域的数目。雷区右上角显示扫雷的时间。 将雷全部扫清或失败后显示成功或失败的对话框。下面是该游戏的几大功能:开局:首先选择游戏等级,然后生成不同等级的雷区界面。游戏等级分为三级:各等级方块数为初级、中级、高级;雷区每个方块下面或埋藏有1个地雷,或者没有地雷;挖雷:将光标移到某个方块,可挖开它;若所揭方块下有雷,则踩雷,此时所有含地雷的块都标记该局游戏失败);如果方块上出现数字,它代表在它周围的8个方块中共有多少颗地雷;标记地雷:在光标所在的某个方块上右击,则标记此
9、块下埋着地雷(有可能也是误标)。每标记一个地雷,地雷数减少1; 2.2 扫雷游戏的基本要求Windows 2000/XP系统提供的扫雷游戏是一个很有趣的游戏。本章的课程设计使用Java语言编写一个与其类似的扫雷游戏。具体要求如下: (1) 扫雷游戏分为初级、中级和高级三个级别。单击游戏菜单可以选择“初级”、“中级”和“高级”。(2) 选择级别后将出现相应级别的扫雷区域,这时用户使用鼠标左键单击“开始”便启动计时器。(3) 用户要揭开某个方块,可左键单击它。若所揭方块下有雷,用户便输了这一局,若所揭方块下无雷,则显示一个数字,该数字代表方块的周围的8个方块中共有多少颗雷。(4) 如果用户认为某个
10、方块下埋着雷,单击右键可以在方块上标识一个用户认为是雷的图标,即给出一个扫雷标记。用户每标记出一个扫雷标记(无论用户的标记是否正确),程序将显示的剩余雷数减少一个。(5)当用户点中雷时,将有“你输了”的提示出现,胜利时,将有“你赢了”的提示出现。2.3 功能需求分析本程序为java课程设计。参考Windows自带的扫雷游戏做了简化。用java编写,采用了Swing 界面。实践了java课程多方面的内容。本程序实现了主要游戏的主要方面,单游戏固定为10 x 10 格,难度三级:12, 24, 36。主要实现了如下算法:单击某行某列后产生不在单击处引爆的地图。出现空格后引发递归的清空算法。检测是否
11、所有地雷都被标记,且没有多标的胜利检测算法。控制一个计数器产生计时效果的计时器算法。等侯用户单击返回的线程。以及可区分用户鼠标左键,右键和左右两键单击的事件处理方法。程序设计主要考虑了程序的完整性和规范性。界面符合Windows常规,主要通过菜单和按钮与用户交互。所有菜单项都实现了响应功能。且主界面多用图标示意,较美观。第三章 游戏的具体分析3.1 总体功能图图3-1 总体功能图3.2 主要功能设计流程3.2.1 总体流程图开始定义并初始化按钮,菜单等事件处理菜单按钮重新开始方块开局初级高级中级自定义英雄榜退出展示相应效果N是否点中雷结束Y 图3-2-1 总体流程图 雷区设计流程图图3-2-2
12、 雷区设计流程图 排行榜设计流程图图3-2-3 排行榜设计流程图3.3各个类的详细介绍与关键代码3.3.1 类之间关系图图3-3-1 类之间关系图3.3.2 MainFrame类 MainFrame主程序类是整个程序的入口,通过package nicholas.game.mine;包将其放在nicholas的game下的mine子文件夹内,继承了JFrame并实现了ActionListener、实现了主界面各控件的布局、led灯,时间计数器,级别,失败和成功,各种状态的初始化。还实现了从mine文件里读取信息和保存信息并实现鼠标双击单击,双击,移动时发生的事件。其关键性代码如下:private
13、 class StatusMouseAdapter extends MouseAdapter private boolean mouseIn;private boolean mouseDown;private Icon icon;public StatusMouseAdapter() super();public void mouseEntered(MouseEvent me) /组件按下时mouseIn = true;if(mouseDown) statusButton.setBorder(BorderFactory.createLoweredBevelBorder();icon = sta
14、tusButton.getIcon();statusButton.setIcon(ImageFactory.getInstance().getImageicon(18);public void mousePressed(MouseEvent me) /组件释放时mouseDown = true;statusButton.setBorder(BorderFactory.createLoweredBevelBorder();icon = statusButton.getIcon();statusButton.setIcon(ImageFactory.getInstance().getImageic
15、on(18);public void mouseReleased(MouseEvent me) mouseDown = false;statusButton.setIcon(icon);statusButton.setBorder(BorderFactory.createRaisedBevelBorder();if(mouseIn)restartGame();public void mouseExited(MouseEvent me) mouseIn = false;if(mouseDown) statusButton.setIcon(icon);statusButton.setBorder(
16、BorderFactory.createRaisedBevelBorder();public void mouseEntered(MouseEvent me) /鼠标按下current = (MineGrid)me.getSource();if(leftDown&&rightDown) pressAround(current); else if(leftDown) pressGrid(current);public void mouseReleased(MouseEvent me) /鼠标释放时if(current.isNormal()statusButton.setIcon(
17、ImageFactory.getInstance().getImageicon(17);int x = current.getXpos();int y = current.getYpos();if(leftDown) /左击leftDown = false;if(firstClick) timeThread = new TimeThread();timeThread.start();firstClick = false;/改变if(modexy) int i,j;do i = (int)(Math.random()*xBound);j = (int)(Math.random()*yBound)
18、; while(modeij);modexy = false;modeij = true;if(rightDown) /右击 releaseAround(current);rightDown = false;if(middle) middle = false;if(current.isClicked() clickGrid(x,y,2); else if(current.isNormal() clickGrid(x,y,1); else rightDown = false;public void mouseExited(MouseEvent me) /鼠标停止时current = (MineG
19、rid)me.getSource();if(leftDown&&rightDown) releaseAround(current); else if(leftDown) releaseGrid(current);private void pressGrid(MineGrid g) /按下方格时if(!g.isNormal() return;g.setIcon(ImageFactory.getInstance().getImageicon(0);private void releaseGrid(MineGrid g) /释放方格时if(!g.isNormal() return;g
20、.setIcon(ImageFactory.getInstance().getImageicon(9);3.3.3 LEDNumber类LEDNumber类:把数字格式化为液晶字体图像private int numberSegment = 0, 1, 2, 3, 4, 5 , /0 1, 2 , /1 0, 1, 3, 4, 6 , /2 0, 1, 2, 3, 6 , /3 1, 2, 5, 6 , /4 0, 2, 3, 5, 6 , /5 0, 2, 3, 4, 5, 6 , /6 0, 1, 2 , /7 0, 1, 2, 3, 4, 5, 6 , /8 0, 1, 2, 3, 5,
21、6 /9 ;用二维数组numberSegment来存储数字,实现界面如图3-3-3所示。图3-3-3 LED样式的数字3.3.4 MineGrid类 MineGrid类:格子用来设置网格的状态、大小及位置信息。3.3.5 AboutDialog类AboutDialog类:帮助文档,关于扫雷文档的说明。 AboutDialog类用package nicholas.swing将其放在了nicholas下的swing文件夹下,它继承了JDialog类,并实现了ActionListener接口。 jLabel为其创建了文本标签,jButton创建了按钮,JTextArea创建了文本区域。当用户运行扫雷
22、程序时,点击如图3-3-5所示的帮助菜单出现如图3-3所示的界面。图3-3-5 关于扫雷界面图图3-3 关于扫雷界面图3.3.6 CustomDialog类 CustomDialog类:自定义雷区 通过Jlabel文本标签,接收其高度,宽度,和雷数。实现界面如下:图 3.3.7 ImageFactory类ImageFactory类:图片资源类ImageFactory类通过package nicholas.game.mine;将其存放在nicholas下的game下的mine文件夹内,通过 引入包import javax.swing.ImageIcon;来实现对图片的各种操作, ImageIco
23、n images数组是用来存放各图片。供其它类进行调用。并采用Java里的单例模式 保证其对象的唯一性。3.3.8 UserDialog类 UserDialog类:游戏级别的选择UserDialog类用package nicholas.game.mine; 将其放在了nicholas下的game下的mine子文件夹内,字符串数组String level = "初级","中级","高级"初始化各级别的大小和雷数,并通过一个Jlabel空间接手玩家的信息,将其写入文件。3.3.9 LevelInfo类LevelInfo类:级别设定publ
24、ic static final LevelInfo DEFAULT_LEVEL = new LevelInfo(9, 9, 10),new LevelInfo(16, 16, 40),new LevelInfo(16, 30, 99);定义了一个常量数组初始化各级别的默认大小和雷数,还用了一个把各级别的玩家的信息写入文件中的类LevelLog:class LevelLog implements Serializable private static final String DEFAULT_NAME = "匿名"private static final int DEFAUL
25、T_RECORD = 999;private int record;private String user;public LevelLog() setDefault();public void setDefault() user = DEFAULT_NAME;record = DEFAULT_RECORD;public void setRecord(int r) record = r;public void setUserName(String name) user = name;public int getRecord() return record;public String getUse
26、rName() return user;public String toString() return record + "t" + user + "n"3.3.10 LogDialog类LogDialog类:扫雷英雄榜,其实现代码如下:public class LogDialog extends JDialog implements ActionListener private LevelLog levelLog;private JTextArea logArea;private JButton resetButton;private JButton
27、confirmButton;public LogDialog(JFrame frame, LevelLog log) super(frame, "扫雷英雄榜", true);getContentPane().setLayout(null);levelLog = log;logArea = new JTextArea();logArea.setEditable(false);logArea.setBackground(UIManager.getColor("CheckBox.background");logArea.setBounds(10,10,160,
28、60);getContentPane().add(logArea, null); resetButton = new JButton("重新计分");resetButton.setBounds(10,70,90,25);resetButton.addActionListener(this);getContentPane().add(resetButton, null);setTextArea();confirmButton = new JButton("确定");confirmButton.setBounds(105,70,60,25);confirmB
29、utton.addActionListener(this);getContentPane().add(confirmButton, null); setSize(180,140);setLocationRelativeTo(frame); setResizable(false); show();private void setTextArea() logArea.setText("初级:" + levelLog0.toString() + "中级:" + levelLog1.toString() + "高级:" + levelLog2.toStr
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 机场飞行区课程设计
- 一年级信息技术上册 农家小院-图形工具的使用 1教案 河大版
- 九年级化学下册 第9单元 实验活动5 一定溶质质量分数的氯化钠溶液的配制教案 (新版)新人教版
- 机器人机构学课程设计
- 本科环评课程设计
- 本班近视人数研究报告
- 2024年供暖系统换热工程施工协议
- 本地污水管网施工方案
- 2024至2030年干花礼品项目投资价值分析报告
- 木储物柜施工方案
- 2024年官方兽医考试题库(判断题)
- 职业健康安全培训课件(共32张课件)
- 2024年全国统考“营养师或营养指导员”相关知识考前试题库与参考答案
- 2024年07月首都博物馆2024年招考17名合同制用工人员笔试近年2018-2023典型考题及考点剖析附答案带详解
- 2024CSCO结直肠癌诊疗指南解读
- 大学生毕业论文写作教程(高校毕业生论文写作指课程导)全套教学课件
- (正式版)QBT 2174-2024 不锈钢厨具
- 监控维修施工方案
- 是谁杀死了周日
- 2024年辽宁铁道职业技术学院高职单招(英语/数学/语文)笔试历年参考题库含答案解析
- 国家开放大学《管理英语4》章节测试参考答案
评论
0/150
提交评论