北京邮电大学学士学位论文

上传人:仙*** 文档编号:204868408 上传时间:2023-04-27 格式:DOC 页数:52 大小:1.80MB
返回 下载 相关 举报
北京邮电大学学士学位论文_第1页
第1页 / 共52页
北京邮电大学学士学位论文_第2页
第2页 / 共52页
北京邮电大学学士学位论文_第3页
第3页 / 共52页
点击查看更多>>
资源描述
北京邮电大学毕业设计基于Java的迷宫游戏摘要迷宫游戏是我们最常见的游戏之一,该游戏出现在手机游戏、掌上游戏机和电脑游戏当中,因此迷宫游戏也是一个十分经典的游戏。一般的迷宫游戏比较简单,游戏中随机出现一些障碍,要求玩家能够找出一条从起点到终点的通路。它看似简单确变化无穷,迷宫游戏上手及其简单,但要熟练的掌握其中的奥秘且快速找出一条通路,难度却不低。作为家喻户晓老少皆宜的大众游戏,其普及程度可以说是史上任何一款游戏都无法比较的。本设计是一款基于Java的迷宫游戏。目前用于游戏开发的计算机语言多种多样,而Java只是其中一种。然而,Java是现在全球最时髦的开发工具之一,它拥有一套庞大且完整的类库,内置了其他怨言需要靠库甚至是操作系统才能支持的功能。所以,程序员可以很容易的用Java编写并运行基于Java的游戏。本文从游戏的背景研究和发展现状开始,详细描述了整个游戏的制作过程。对实现功能以及操作过程进行了重点讨论,开发用到了Java类库中的许多包以及其中的类,例如java.util包,java.lang包,java.awt包等等,稳重会对这些包和类的用法进行讲解。关键词 游戏;迷宫;Java;算法AbsractJava-Based Maze GameMaze Game is one of the most common of our game , the game appeared in mobile games , handheld game consoles and computer games which , therefore maze game is a very classic game. Generally relatively simple maze game , the game randomly some obstacles , requiring players to be able to find a path from start to finish . It seems simple indeed enormous, and its simple maze game started , but a skilled master mystery cut quickly identify a path , the difficulty really is not low . As a well-known popular game for all ages , its popularity can be said that the history of any game can not be compared.This design is a Java-based maze game . Current computer language for a variety of game development , and Java is just one of them. However , Java is now one of the worlds most fashionable development tools, it has a large and complete library, built-in library or other complaints need to rely on the operating system to support functions. Therefore, the programmer can easily written in Java and run Java-based games.In this paper, the status of research and development background of the game began , a detailed description of the entire game production process. The realization of functions and operations are focused on the process , the development of the Java class libraries used in many packages as well as one of the categories, such as java.util package , java.lang package , java.awt package and so on , will these packages and steady type of usage to explain.Keywords game;maze;Java Language;algorithm48目 录1 绪论51.1 课题的研究背景与意义51.2 Java简介51.2.1 名字起源51.2.2 发展历史51.2.3 语言特征51.2.4 开发平台62 可行性研究72.1 可行性分析72.1.1 技术可行性72.1.2 经济可行性72.1.3 操作可行性72.1.4 法律可行性73 需求分析83.1 系统初步分析83.1.1 用户需求分析83.1.2 功能需求分析83.1.3 系统的可靠性和可用性需求分析84 总体设计94.1 系统开发94.1.1 系统开发的原则94.1.2 系统设计阶段94.1.3 结构设计阶段94.2 相关算法介绍104.2.1 深度优先算法生成迷宫介绍104.2.2 普里姆算法生成迷宫介绍115 详细设计135.1核心包的设计135.1.1 MainFrame类的设计与实现135.1.2 SetFrame类的设计与实现155.1.3 ShowPane类的设计与实现175.1.4 MainController类的设计与实现205.1.5 AbstractMap类的设计与实现235.1.6 DFSMap类的设计与实现235.1.7 PriMap类的设计与实现295.1.8 Point类的设计与实现326 结论34参考文献35致 谢36外文文献37中文翻译471 绪论1.1 课题的研究背景与意义随着经济的快速发展,计算机的地位在人们生活中已日益突出,基于各种操作系统的娱乐游戏也越来越多、越来越大众化,成为人们生活中必不可少的一部分。而随着人们生活品质的提高,电脑游戏也越来越多元化,迷宫游戏就是其中的一种。迷宫游戏操作简单方便,也具有一定的思考力,能够引发人的思维及兴趣,老少皆宜,是一款经久不衰的大众化游戏。游戏的最初目的就是让玩家在游戏中得到放松。游戏一直存在于人类生活中,如今定义的游戏从早期的猜谜游戏,发展至如今的单击RPG游戏,网络游戏等,已经升华为更高级别意义上的娱乐游戏,对人们的感官刺激也越发强烈,得到乐趣也更多。对于编写游戏而言,Java已变得足够成熟。它现在是一种开发能都在多种平台上运行的中小型游戏的很好的方式。此外,Java支持和其他库一起工作,而且它的速度变得越来越快。由于Java游戏一般来说简单有趣,并且对用户硬件要求极小,所以Java游戏通常对85%的计算机用户都有吸引力。1.2 Java简介1.2.1 名字起源Java是印度尼西亚爪哇岛的英文名称。Java语言中的许多库类名称,多与咖啡有关:如JavaBeans、NetBeans以及ObjectBeans等等。SUN和JAVA的标识也正是一杯正冒着热气的咖啡。1.2.2 发展历史Java是由Sun Microsystems公司推出的Java面向对象程序设计语言(以下简称Java语言)和Java平台的总称。用Java实现的HotJava浏览器(支持Java applet)显示了Java的魅力:跨平台、动态的Web、Internet计算。从此,Java被广泛接受并推动了Web的迅速发展,常用的浏览器现在均支持Java applet。另一方面,Java技术也不断更新。(2010年Oracle公司收购了SUN) 1.2.3 语言特征Java是一个纯粹的面向对象的程序设计语言,它继承了 C+语言面向对象技术的核心。Java舍弃了容易引起错误的指针、运算符重载、多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java 1.5 版本中,Java 又引入了泛型编程、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。Java不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码,然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。编辑Java源代码可以使用任何无格式的纯文本编辑器。1.2.4 开发平台Java平台由Java虚拟机和Java应用编程接口(简称API)构成。Java应用编程接口为此提供了一个独立于操作系统的标准接口,可分为基本部分和扩展部分。Java平台已经嵌入了几乎所有的操作系统。这样Java程序可以就可以在各种系统中运行。Java程序设计语言共分为三个体系JavaSE(java平台标准版),JavaEE(java平台企业版),JavaME(java平台微型版)。2 可行性研究可行性研究的目的,就是用最小的代价在尽可能短的时间内确定问题是否能解决。要达到这个目的,必须分析集中主要的可能解法的利弊,从而判断原定的系统规模和目标是否现实,系统完成后所能带来的经济效益时候大到值得投资开发这个系统的程度。因此,可行性研究实质上是要进行一次大大压缩简化了的系统分析和设计的过程,也就是在较高层次上以较抽象的方式进行的系统分析和设计的过程。2.1 可行性分析2.1.1 技术可行性开发本游戏的编程语言有多种,如:VC,VB,Java等,但考虑到自身对语言的熟悉程度和编写程序的困难度,选择Java语言进行游戏的开发。本游戏实在Windows 环境下开发的,一般机器配置就可以满足要求,对机器本身没有太高的要求,环境只需装上jdk即可,Java是现在全球最流行的开发语言之一,他拥有一套庞大且完善的类库,内置了其他语言所需要的靠库甚至是操作系统才能支持的功能,拥有一个虚拟机。Eclipse是SUN公司开发的Java集成开发环境工具,是目前最优秀的Java集成开发工具之一。2.1.2 经济可行性由于本系统使用到的工具一般机器都具有,使用的环境也很简单,开发成本低。Java一直以来由于其可以“跨平台”以及“一次编译,到处运行”等特点,且因为Java游戏简单有趣,并且对用户硬性要求极小,所以Java游戏通常对85%的计算机用户都有吸引力。2.1.3 操作可行性由于整个系统的开发过程中从操作简便、界面美观、灵活使用、的用户要求为出发点,界面设计是要充分考虑玩家的感受,界面比较直观,互动性很好,操作起来简单明了。2.1.4 法律可行性信息产业部已将游戏通用引擎研究及师范产品纳入国家“863计划”,这是中国首次将游戏技术纳入国家科技计划当中。文化部也想国内多家游戏业的实力厂商首次颁发了网络文化经营许可证,加大对游戏的监管力度,进口游戏的审查制度,限制国内对国外的受理措施。科技部指定科技发展计划,将把游戏开发的扶持力度加大。这样一来,国内游戏厂商将可获得发展的核心技术平台,政策有利于保护中国游戏软件的自主知识产权,这位游戏开发发展创造了良好的政策环境。3 需求分析所谓系统分析,就是指在整个系统开发过程中,解决“做什么”的问题,把要解决哪些问题,满足用户哪些具体的信息需求调查分析清楚,从逻辑上或者说从信息处理的功能希求上提出系统方案,即逻辑模型,为下一阶段进行物理设计方案设计,解决怎么办提供依据。3.1 系统初步分析3.1.1 用户需求分析随着Internet的发展,进入信息时代后快速获得网络共享资源成为很简单的事情,人们对计算机产品产生更大的依赖性。计算机的普及使得原本生活已经不嫩更适应人们的需要,广大计算机爱好者迫切的需要能够使用计算机进行必要的娱乐活动来丰富自己的生活,这样,计算机游戏应运而生。据目前的游戏调研来看,由Java开发的游戏仍然是一个空白页,但是它却是一个继续填补的空白页。而Java语言由于其天生的语言特性,很适合进行游戏应用的开发,但由于系统环境问题时的它一直以来未能用于游戏开发,而近来由于Java的发展,它已经摆脱了束缚,浮出了游戏开发的水面。这也是玩家迫切要求的。3.1.2 功能需求分析系统功能的需求指定系统必须提供的服务。通过需求分析应该划分出系统必须完成的所有功能。本作的功能模块主要包括游戏的后台设计,游戏的界面设计。游戏的引擎设计的需求分析:游戏后台是游戏的灵魂,也就是这个游戏的框架,它的好坏直接决定着游戏的质量。它是控制所有游戏功能的主程序,包括画面的处理,路径寻找算法的实现,接收玩家的设置等。所以坚定一个游戏的好坏,从内部设计的原因上说,是从游戏的后台设计体现出来的。一个游戏的后台设计,直接关系到游戏设计的其他方面,诸如游戏的图形系统、声音系统及设计的物理模块等各方面。就如一台CPU一样,游戏的后台也是直接牵制着整个游戏的设计。它主要的作用是处理游戏的时间,运行游戏,输出相应提示,响应玩家的游戏监听时间等。所以,游戏的后台设计是必要的功能模块,而且游戏的后台必须设计好,这样游戏才具有更好的可玩性。游戏程序是一样精度要求很高的程序系统,因为其代码利用率很高。一个实时运行的最终作品,每秒都会运行成千上万的程序,且需要极高频率在后台等待响应。因此,其伙计设计应当相当严谨。游戏界面设计的需求分析:作为一个游戏吸引玩家的最重要的方便就是几面。本作品界面简洁明了,是玩家人容易上手操作,且适应性强。3.1.3 系统的可靠性和可用性需求分析可靠性需求定量地指定系统的可靠性,例如,游戏在运行过程中不能频繁发生错误而不得不中止游戏。可用性则与可靠性密切相关,它量化了用户可以使用系统的程度。例如,游戏的运行必须保证随时可以,不能在一段时间内,游戏产生不可预见的错误而致无法运行等。4 总体设计总体设计过程通常由两个主要阶段组成:系统设计阶段,确定系统的具体实现方案;结构设计阶段,确定软件结构和功能模块。4.1 系统开发4.1.1 系统开发的原则经过需求分析阶段的工作,系统必须“做什么”已经明确,而系统开发是要明确“怎么做”。总体设计的基本目的就是回答“概括地说,系统应该如何实现?”这个问题,因此,总体设计又称概要设计或者初步设计。通过这个阶段的工作将划分出组成系统的物理元素程序、文件、数据库、人工过程和文档等等,但每个物理元素仍然处于黑盒子级,这些黑盒里的具体内容在详细设计中。总体设计的另一项重要的任务就是设计软件的结构,也就是确定系统中每个程序是由哪些模块组成,以及这些模块相互之间的关系。总体设计过程首先寻找实现目标系统的各种不同的方案。然后从这些提供的选择方案中选取若干合理的方案,为每个合理的方案都准备一份系统流程图,列出组成系统所有元素,进程成本、效益分析,并且制定实现此方案的进度计划。通常,设计出初步软件结构后还要进行多方改进,从而得到更合理的结构,进行必要的数据库设计,确定测试要求并且制定测试计划。基于上面的叙述,在详细设计之前先进行总体设计的必要性:可以站在全局高度上,花较少的成本,从较抽象的层次上分析对比多种系统方案和软件结构,从中选出最佳方案和最合理的软件结构,从而用较低的成本开发出较高成本的软件系统。4.1.2 系统设计阶段系统设计阶段的主要目的是确定软件如何做的问题。主要任务是确定系统中的大模块和设计方法,确定软件的功能模块和模块作用、组成、关系等。本系统是一款较为传统的游戏,当玩家打开游戏,显示游戏界面,设置游戏难度之后便可开始游戏。当玩家找不到通往出口的路径时,可以点击“显示路径”按钮来显示一条从入口到出口的通路,不过这样的机会只有一次。也可以在此选择“绘制地图”,选择同一难度的其他地图样式,重新开始游戏。当玩家自己找到出口时,游戏便会提醒“恭喜您,已找到出口!”。4.1.3 结构设计阶段经过系统设计阶段的思考和实践,需要对功能结构进行细致的划分。一个程序的结构设计的好坏也需要决定其发展的重要指标。对一个程序的模块划分往往也能是程序设计变得简单。本游戏的模块大致分为后台引擎和用户界面两大块,界面模块包括总体界面设计和设置界面设计。后台引擎模块包括深度优先迷宫生成算法和普里姆迷宫生成算法。除此之外,还包括一个主界面控制类,用于界面算法和界面生成之间的连接控制,还有一个点类,主要用于定义点的相关操作,一个迷宫生成的接口类,类中声明了迷宫生成算法所需要定义的三个方法。以为不做具体定义,所以被称为接口类。其功能模块图如下:图4-1 功能模块图4.2 相关算法介绍算法是解题方案的准确而完整的描述,其代表着用系统的方法描述解决问题的策略机制。算法就相当于对一定规范的输入,在有限的时间内获得所要求的的输出。描述算法的方法有好多种,常用的自然语言、结构化流程图,伪代码等,其中最普遍的就是流程图。本设计除了实现迷宫的相关功能之外,还着重就实现迷宫的算法进行研究,通过算法及实现迷宫的特点比较深度优先算法和普里姆算法在迷宫生成方面的优劣性。4.2.1 深度优先算法生成迷宫介绍DFSMap类使用深度优先算法得到地图的类。设置一个二维数组,数组的值为格子的状态。初始地图的上所有的格都设为墙,不可达。之后,再定义出口和入口,也将其设置为背景,可以被访问的通道。这样,生成的迷宫中显示的是每一个格子的四面都是墙。从入口点开始向四个方向中的一个随机访问,每找到一个可被访问的点,就去掉该点上的墙,可被访问的点继续以这样的方式向下进行下去。对每个已被访问的格子都设置为已访问。当一个点对某一方向进行访问时,首先需要根据判断条件判断被访问的点是否被访问过,或者处于边界,若该点的四个方向已经被访问或者无法访问,就退回上一个点,而上一个点需重复进行这一过程。这样一次遍历过后,可以确保每一个可被访问的点均被访问过。由于每次访问的方向是随机的,这样导致许多种不同的遍历情况,因为形成了不同的迷宫。所以迷宫的形成是堆积的,但是从起点到终点只有唯一路径。在算法上,只要是利用栈来实现。第一次先将第一个起始点入栈,之后每访问一个点就将该点入栈,之后再对栈顶点的四个方向进行随机访问。若访问到新点,就将新点入栈,直到这个点的四个方向都无法访问时,将该点出栈。然后利用栈顶的点继续朝着四个方向访问。以此类推,直到所有的点全被遍历过,遍历就结束了,这样就形成了迷宫地图。深度优先算法生成迷宫的流程图如图4-2。图4-2 深度优先算法生成迷宫4.2.2 普里姆算法生成迷宫介绍普里姆算法是图的最小生成树的一种构造算法。其构成最小生成树的过程为:在所有“其一个顶点已经落在生成树上,另一个顶点尚未落在生成树上”的边中取一条权值为最小的边,逐条加在生成树上,直至生成树中含有n-1条边为止。PriMap类是利用普里姆算法实现迷宫的形成。首先,设置迷宫中的格子均为墙。其次,选择入口点并将其设置为可行,然后将其邻墙放入列表中。当列表中有状态为不可行的格子时,从列表中随机选择一个作为墙的格子。此时,如果它相邻的格子不是迷宫的通路,则把墙打通,即设置此格子的状态为可行,让其成为迷宫的通路,再将该格子的邻墙加入列表;如果墙的邻格已经是通路,则就从列表中删除这面墙。两种算法都有各自的有点,从两种生成算法所生成的迷宫中可以很清楚的看出。深度优先算法所生成的迷宫有些扭曲,曲折较多,但想要找出一条通路比较容易。所以深度优先算法适用于较为简单的迷宫的生成。相较而言,普里姆算法比较复杂。其生成的迷宫岔路较多,生成的迷宫看起来很自然,但是想要找出一条通路是比较有难度的。所以相比,普里姆算法适用于难度较大的迷宫生成算法。相关示意图如图4-3。图4-3 深普里姆算法生成迷宫5 详细设计详细设计阶段的根本目标是确定应该怎样具体实现所要求的系统,也就是说,经过这个阶段的设计工作,应该得出对目标系统的精确描述,从而在编码阶段可以吧这个描述直接翻译成某种程序设计语言书写的程序。详细设计的结果基本上决定了最终程序设计代码的质量。详细设计的目标你仅仅是逻辑上正确地实现每个模块的功能,更重要的是设计出的处理过程尽可能简明易懂。结构程序设计技术是实现上述目标的关键技术,因此是详细设计的逻辑基础。5.1核心包的设计本游戏主要由游戏界面和游戏后台两大部分组成,其中的基本类包括如下:AbstractMap,DFSMap,MainController,MainFrame,PathMap,Point,SetFrame,ShowPane,Test工程图如图5-1。图 5-1 工程图5.1.1 MainFrame类的设计与实现本类主要是主界面的显示设计。主界面主要由JMenuBar、Container、JPanel三个容器组成。其中JMenuBar主要放置菜单选项“开始”和“设置”,Container是用来显示地图,JPanel是放置“开始游戏”、“显示路线”及上下左右四个方向键。之后为菜单项设置监听器以及为上下左右四个方向键设置监听。MainFrame类的主要代码如下:SuppressWarnings(serial)class EnterKeyListener implements KeyListener Overridepublic void keyTyped(KeyEvent e) / TODO Auto-generated method stubint keyCode = e.getKeyCode();switch (keyCode) case KeyEvent.VK_UP:dfspan.play(1);break;case KeyEvent.VK_DOWN:dfspan.play(2);break;case KeyEvent.VK_LEFT:dfspan.play(3);break;case KeyEvent.VK_RIGHT:dfspan.play(4);break;class GoListener implements ActionListener/ 方向监听int i;GoListener(int i) this.i = i;Overridepublic void actionPerformed(ActionEvent e) / TODO Auto-generated method stubdfspan.play(i);con.repaint();class ItemListener implements ActionListener/ 菜单项监听器MainFrame mainFrame;public ItemListener(MainFrame mainFrame) / TODO Auto-generated constructor stubthis.mainFrame = mainFrame;Overridepublic void actionPerformed(ActionEvent e) / TODO Auto-generated method stubif (e.getSource() = item11) System.exit(0); else if (e.getSource() = item21) new SetFrame(mainFrame);public static void main(String args) new MainFrame();主界面如图5-2。图 5-2 主界面5.1.2 SetFrame类的设计与实现SetFrame主要实现菜单中“设置”选项的设计。在设置选项中可以选择生成迷宫的算法,各为深度优先算法或者普里姆算法。还可以对游戏的难度进行设置,分别为“简单”、“中等”、“复杂”。设置其默认选项为“深度优先算法”和“中等”难度。设置完毕之后,按确认键开始游戏。对不同的游戏难度进行相应,即不同难度的游戏设置地图的边界大小的不同。通过变换地图长宽的值近而改变地图的难易程度。当玩家不想在继续游戏时,可选择设置栏上的“开始”选项,继续选择“退出”,则可以退出游戏。SetFrame类的主要代码如下:private void setRadio() int m = main.getM();if (m = 20)simRadio.setSelected(true);else if (m = 50)difRadio.setSelected(true);else if (m = 35)midRadio.setSelected(true);private void setMapRadio() int w = main.getCurflag();if (w = 0)dfsRadio.setSelected(true);else if (w = 1)priRadio.setSelected(true);else if (w = 2)graRadio.setSelected(true);class SureListener implements ActionListener SetFrame s;public SureListener(SetFrame setFrame) / TODO Auto-generated constructor stubs = setFrame;Override/ 不同难度的响应public void actionPerformed(ActionEvent e) / TODO Auto-generated method stubif (e.getSource() = okBut) if (simRadio.isSelected() main.setM(20);main.setN(20); if (dfsRadio.isSelected()main.setCurflag(0);else if (priRadio.isSelected()main.setCurflag(1);else if (graRadio.isSelected()main.setCurflag(2); else if (e.getSource() = exitBut);/ s.setVisible(false);main.setEnabled(true);s.setVisible(false);设置界面如图5-3。图 5-3 设置界面图5.1.3 ShowPane类的设计与实现首先将迷宫所有格子设置成背景黑色,绘制迷宫时,所有迷宫的墙均为绿色,若寻找出的路径中含有某块格子,则将此块格子设置成红色。若不依赖游戏寻找出的路径,而是玩家自己寻找路径,当玩家走到迷宫的出口时,则此时弹出对话框“恭喜你,到迷宫的尽头!”ShowPane类主要代码如下:SuppressWarnings(serial)public class ShowPane extends JPanel boolean a;private static final int SX = 30;private static final int SY = 30;private Stack stack;ShowPane(boolean a) this.a = a;stack = new Stack();this.setBackground(Color.black);stack.add(new Point(1, 0);repaint();ShowPane() a = new boolean11;stack = new Stack();this.setBackground(Color.black);Overrideprotected void paintComponent(Graphics g) / TODO Auto-generated method stubg.setColor(Color.black);g.fillRect(0, 0, this.getWidth(), this.getHeight();g.setColor(Color.green);for (int i = 0; i a.length; i+) for (int j = 0; j a0.length; j+) if (aij = false) g.fillRect(SX + i * 8, SY + j * 8, 8, 8); else if (isHas(i, j) g.setColor(Color.red);g.fillRect(SX + i * 8, SY + j * 8, 8, 8);g.setColor(Color.green);public void redraw(boolean a)/ 重绘界面this.a = a;stack.clear();stack.push(new Point(1, 0);repaint();public void play(int keyvalue)/ 走迷宫(玩家自玩)if (stack.size() = 1) Point p = stack.peek();int x = p.getX();int y = p.getY();if (x = 1 & y = 0) if (keyvalue = 2) stack.pop();stack.push(new Point(x, y + 1); else if (x = a.length - 2 & y = a0.length - 1) JOptionPane.showMessageDialog(this, 恭喜你,到迷宫的尽头。); else if (keyvalue = 1 & axy - 1 = true) stack.pop();stack.push(new Point(x, y - 1); else if (keyvalue = 2 & axy + 1 = true) stack.pop();stack.push(new Point(x, y + 1); else if (keyvalue = 3 & ax - 1y = true) stack.pop();stack.push(new Point(x - 1, y); else if (keyvalue = 4 & ax + 1y = true) stack.pop();stack.push(new Point(x + 1, y);repaint();相关示意图如图5-4和图5-5。图 5-4 迷宫路线显示图图 5-5 玩家找到出口时的相关提示5.1.4 MainController类的设计与实现本类主要负责“绘制地图”、“显示路径”、“隐藏路径”单个按钮的控制。通过为按钮增加监听,使按键被得到相应的控制。本游戏中,每一种游戏的难度可以绘制若干种地图,但每种显示的地图只有一次显示路径的机会。MainController类的主要代码如下:package maze4;public class MainController class ButtonListener implements ActionListener Overridepublic void actionPerformed(ActionEvent e) / TODO Auto-generated method stubif (e.getSource() = button_kaishi) int curflag = mainFrame.getCurflag();if (curflag = 0)map = new DFSMap(mainFrame.getM(), mainFrame.getN();else if (curflag = 1)map = new PriMap(mainFrame.getM(), mainFrame.getN();boolean b = map.getData();dfspan.redraw(b);dfspan.setVisible(true);button_xianshi.setEnabled(true);button_xianshi.setText(显示路径); else if (e.getSource() = button_xianshi) if (button_xianshi.getText() = 显示路径) int curflag = mainFrame.getCurflag();if (curflag = 0) dfspan.showResult(map.getPath(); else if (curflag = 1) pripan.showResult(map.getPath();button_xianshi.setText(隐藏路径); else int curflag = mainFrame.getCurflag();if (curflag = 0) dfspan.showResult(null); else if (curflag = 1) pripan.showResult(null);button_xianshi.setText(显示路径);button_xianshi.setEnabled(false);con.repaint();不同难易程度绘制的地图及其路径显示如图5-7、图5-8和图5-9。图 5-7 简单难度的迷宫游戏路径显示界面图 5-8 复杂难度的迷宫游戏界面图 5-9 复杂难度的迷宫游戏路径显示界面5.1.5 AbstractMap类的设计与实现AbstractMap类为一个抽象类,表示选择不同的算法。在这里定义了getData、reset、getPath三个接口,分别表示 得到数据、重置、得到路径三种方法。这三种方法将会在DFSMap和PriMap两个类中得以详细定义及实现。AbstractMap类的代码如下:public abstract class AbstractMap/* * 得到数据*/public abstract boolean getData();/* * 重置*/public abstract void reset(int m,int n);/* * 得到路径*/public abstract Stack getPath();5.1.6 DFSMap类的设计与实现DFSMap类使用深度优先算法得到地图的类。设置一个二维数组,数组的值为格子的状态。初始地图的上所有的格都设为墙,不可达。之后,再定义出口和入口,也将其设置为背景,可以被访问的通道。这样,生成的迷宫中显示的是每一个格子的四面都是墙。迷宫形成:首先判断地图上的每一个点是否都已经被遍历过,若没有,得到一点的坐标,判断该点实在地图画布的四个角、四条边上、或是在中间位置,分别用0-8表示该点是在左上角、左下角、右上角、右下角、左边界、右边界、上边界、下边界、中间位置。之后逐一进行分析,若该点位于地图的四个角,则下一步只有两个方向可以选择;若该点位于地图的四条边界上,则下一步有三个方向可以选择;若该点位于地图中间位置,则下一步有四个方向可以选择。不管朝上下左右四个方向如何移动,若此点可达,即将该点入栈。DFSMap类的主要代码如下:public class DFSMap extends AbstractMap public Stack getPath()/ 得到/ TODO Auto-generated method stubreturn stack;private boolean check()/ 判断是否全部走过。for (int i = 1; i m; i += 2) for (int j = 1; j n; j += 2) if (aij = false)return false;return true;private void forward()/ 后退一步if (DFSflag = false) stack.pop();Point p = stack.pop();currX = p.getX();currY = p.getY(); else int i, j;boolean flag = false;while (!flag) i = (int) (Math.random() * m);j = (int) (Math.random() * n);if (aij = true & i % 2 = 1 & j % 2 = 1) currX = i;currY = j;flag = true;从入口点开始向四个方向中的一个随机访问,每找到一个可被访问的点,就去掉该点上的墙,可被访问的点继续以这样的方式向下进行下去。对每个已被访问的格子都设置为已访问。当一个点对某一方向进行访问时,首先需要根据判断条件判断被访问的点是否被访问过,或者处于边界,若该点的四个方向已经被访问或者无法访问,就退回上一个点,而上一个点需重复进行这一过程。这样一次遍历过后,可以确保每一个可被访问的点均被访问过。由于每次访问的方向是随机的,这样导致许多种不同的遍历情况,因为形成了不同的迷宫。所以迷宫的形成是堆积的,但是从起点到终点只有唯一路径。相关代码如下:private void go()/ 具体操作while (!check() int test = getPosition(currX, currY);switch (test) case 1: / 在左上角case 2:/ 在左下角case 3:choice1(test);/ 在右上角break;case 4:/ 在右下角acurrXcurrY = true;acurrXcurrY + 1 = true;stack.push(new Point(currX, currY);stack.push(new Point(currX, currY + 1);DFSflag = true;forward();break;case 5:/ 在左边case 6: / 在右边case 7:/ 在上面case 8:choice2(test);/ 在下面break;case 0:choice0();/ 在中间break;private void choice0()/ 在中间时/ TODO Auto-generated method stubacurrXcurrY = true;int orders = this.getOrder(4);boolean flag = false;for (int i = 0; i orders.length; i+) if (ordersi = 0 & acurrXcurrY - 2 = false) goUp();flag = true;break; else if (ordersi = 1 & acurrXcurrY + 2 = false) goDown();flag = true;break; else if (ordersi = 2 & acurrX - 2currY = false) goLeft();flag = true;break; else if (ordersi = 3 & acurrX + 2currY = false) goRight();flag = true;break;if (flag = false) forward();在算法上,只要是利用栈来实现。第一次先将第一个起始点入栈,之后每访问一个点就将该点入栈,之后再对栈顶点的四个方向进行随机访问。若访问到新点,就将新点入栈,直到这个点的四个方向都无法访问时,将该点出栈。然后利用栈顶的点继续朝着四个方向访问。以此类推,直到所有的点全被遍历过,遍历就结束了,这样就形成了迷宫地图。相关代码如下:private void choice2(int dirc)/ 在四边/ TODO Auto-generated method stubacurrXcurrY = true;int orders = this.getOrder(3);boolean flag = false;if (dirc = 5) for (int i = 0; i orders.length; i+) if (ordersi = 0 & acurrXcurrY - 2 = false) goUp();flag = true;break; else if (ordersi = 1 & acurrXcurrY + 2 = false) goDown();flag = true;break; else if (ordersi = 2 & acurrX + 2currY = false) goRight();flag = true;break; else if (dirc = 6) for (int i = 0; i orders.length; i+) if (ordersi = 0 & acurrXcurrY - 2 = false) goUp();flag = true;break; else if (ordersi = 1 &
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 管理文书 > 施工组织


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!