Java桌面游戏争霸的设计与实现毕业论文.doc_第1页
Java桌面游戏争霸的设计与实现毕业论文.doc_第2页
Java桌面游戏争霸的设计与实现毕业论文.doc_第3页
Java桌面游戏争霸的设计与实现毕业论文.doc_第4页
Java桌面游戏争霸的设计与实现毕业论文.doc_第5页
已阅读5页,还剩42页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Java桌面游戏争霸的设计与实现毕业论文目 录1 引言11.1 课题的研究背景与意义11.2Java语言的特点和及其与游戏的结合11.2.1Java语言的特点11.2.2Java与网络的结合21.3可行性的分析31.3.1技术可行性31.3.2经济可行性41.3.3操作可行性41.3.4法律可行性42 需求分析52.1 系统初步分析52.1.1用户需求分析52.1.2功能需求分析52.1.3系统的可靠性和可用性需求分析62.2 数据流分析63总体设计73.1 系统开发73.1.1系统开发的原则73.1.2系统设计阶段73.1.3结构设计阶段94 详细设计144.1核心包的设计144.1.1Card类的设计与实现:144.1.2Continent类的设计与实现:154.1.3Mission类的设计与实现:164.1.4Country类的设计与实现:164.1.5Player类的设计与实现:174.1.6Statistic类的设计与实现:184.2本地翻译包的设计194.2.1TranslationBoudle类的设计与实现194.2.2MapTranslator类的设计与实现204.3网络包的设计224.4人工智能包的设计254.5其他工具类的设计284.6游戏界面的设计305 用户使用手册375.1 系统环境说明375.2 系统简介375.2.1 系统特点375.2.2 操作方法375.3 游戏需要改进的地方38结 论39参 考 文 献40致 谢411 引 言1.1 课题的研究背景与意义随着计算机日益普及,计算机已然成为人们日常生活的一部分的今天,计算机游戏也越来越成为人们生活中不可或缺的元素。游戏可以简单地理解为调节人们生活节奏和缓解人们生活压力的一种手段。现在理解的游戏基本意义都是娱乐性质较浓,要有特定的行为模式,遵循一定规则以达到游戏者目的的行动。游戏的最初目的就是让游戏者(玩家)在游戏中得到放松。游戏一直存在于人类活动中,如今定义的游戏从早期的猜谜游戏,发展到如今的单机RPG游戏,网络游戏等,已经升华为更高级别意义上的娱乐活动,对人们的感官刺激也越发强烈,得到的乐趣也更多。而对于编写游戏而言,Java终于变得足够成熟了(Java的语言特性和其与游戏的结合请见下一小节)。它现在是一种开发能够在多种平台上运行的中小型游戏的很好的方式。此外,Java支持和其他的库一起工作,而且它的速度变得越来越快。Java并不是以游戏编程为目的而被开发的,事实上,游戏编程可能是Java创造者心中的最后一个目标。在过去,妨碍Java发展的是它的运行环境;浏览器和Java类库一起从本质上决定了Java应该用来写哪种类型的应用程序,而高速的游戏和图象则不在其中。这给Java带来了不好的影响,因为人们注意的不是语言,而是它的运行环境。现在,浏览器已经不能控制一切了,Java作为游戏编程语言的另一个机会到来了。Java在过去有一点超前于它的时代,当时市场的动力落后于Java,但是现在Java可以而且已经取得成功。据悉,中国民族网络游戏出版工程将在5年内出版100种大型民族网络游戏,总投资预计超过3亿元。信息产业部已将网络游戏通用引擎研究及示范产品纳入国家“863计划”,这是中国首次将网络游戏技术纳入国家科技计划。文化部也向国内12家在网络游戏业的实力厂商首批颁发了网络文化经营许可证,加大对网络游戏的监管力度,进口游戏审查制,限制国内对国外的受理措施。科技部制定科技发展规划,将把网络游戏纳入现代服务业并加以扶持。政府态度和政策都是一种信号,表明2005年对本土网络游戏的扶持力度将加大;国内游戏厂商将可获得发展的核心技术平台;政策有利于保护中国游戏软件的自主知识产权;这为网络游戏发展创造了良好的政策环境。而Java的创建者把Java称为“网络编程语言”,且由于JAVA游戏一般来说简单有趣,并且对用户硬件要求极小,所以JAVA游戏通常对85%的计算机用户都有吸引力。1.2 Java语言的特点和及其与游戏的结合1.2.1 Java语言的特点Java能够取得如此的成功,是因为它在设计时的目标就定位在要解决当今程序员们所面临的众多问题。Java的基本目标之一就是要提高生产率。生产率来源于许多方面,但是Java希望在语言方面相对于它的前辈有明显的提高,从而为程序员提供更大的便利。1.系统易于表达、易于理解被设计用来适应问题的“类”,在表达问题的能力上显得更强。这意味着当你编写代码时,你是在用问题空间的术语,而不是计算机也就是解空间的术语,来描述解决方案。可以用更高层的概念来处理问题,并且只用一行代码就可以做更多的事。易于表达所带来的另一个好处就是易于维护,维护在程序生命周期中所占的成本比例极大。如果程序易于理解,那么他必定易于维护。同时,这也降低了创建和维护文档的费用。2.类库的巨大影响力创建程序最快捷的方式就是使用已经编写好的代码:类库。Java的主要目标之一就是要使类库更易于使用。这是通过将类库转型为新的数据类型来实现的,因此,引入类库意味着在语言中添加了新的数据类型。因为Java编译器会照管类库的使用方式确保正确地初始化和回收垃圾,并保证其他方法被正确地调用,因此,你只需专注于你想让类库做些什么,而不必关心应如何去做。3.错误处理在C语言中,错误处理一直是一个声名狼籍的问题,而且经常被忽视经常只能靠上帝保佑了。如果你在构建一个大型的、复杂的程序,那么没有什么比在程序某处暗藏了一个错误,而你却没有任何能够暗示它在何处的线索更糟糕的事情了。Java异常处理便是一种能够确保错误必须被报告,而且对此必须有所响应的机制。4.大型程序设计许多传统语言在程序大小和复杂度方面都有内置的限制。例如,BASIC可能对某类问题的解决能力非常强,可以快速地创建解决方案,但是如果程序长度超过数页,或者超出该语言正常的题域之外,它就会像“在非常粘稠的液体中游泳”。它没有明确的界线来表示何时你所使用的语言会导致最终的失败,即使有这样的界线,你也会忽视它。你总不能说:“我的BASIC程序太大了,我不得不用C来重写它!”相反,你会试着将几行代码硬塞进去,以便在程序中增加新功能。因此,不知不觉中,你就付出了额外的开销。Java具备编写大型程序的能力也就是说,它消除了小型程序和大型程序之间的复杂度界线。在编写“hello,world”风格的小应用程序时,你当然不必使用OOP,但是当你需要用到时,这些功能随手可得。而且,对小型程序和大型程序,编译器都会一视同仁地、积极地找出因bug而产生的错误。1.2.2 Java与网络的结合Java不仅是一种功能强大的、安全的、跨平台的、国际化的编程语言,而且它还在不断地被扩展,以提供更多的 语言功能和类库,能够优雅地处理在传统编程语言中很难解决的问题,例如线程、数据库访问、网络编程和分部式计算。Java是通过applet以及使用Java Web Start来进行客户端编程的。Applet是只在Web浏览中器运行的小程序,它是作为网页的一部分而自动下载的。当applet被激活时,它便开始执行一个程序,这正是它优雅之处:它提供一种分发软件的方法,一旦用户需要客户端软件时,就自动从服务器把客户端软件分发给用户。用户获取最新版本的客户端软件时不会产生错误,而且也不需要很麻烦的重新安装过程。Java的这种设计方式,使得程序员只需创建单一的程序,而只要一台计算机有浏览器,且浏览器具有内置的Java解释器,那么这个程序就可以自动在这台计算机上运行。由于Java是一种成熟的编程语言,所以在提出对服务器的请求之前和之后,可以在客户端尽可能多地多做些事情。例如,不必跨网络地发送一张请求表单来检查自己是否填写了错误的日期或其他参数,客户端计算机就可以快速地标出错误数据,而不用等待服务器作出标记并给你传回图片。这不仅立即就获得了高速度和快速的响应能力,而且也降低了网络流量和服务器负载,从而不会使整个Internet的速度都慢下来。Java applet胜过脚本语言程序的优势之一就是,它是以被编译过的形式存在的,因此其源代码对客户端来说是不可见的。另一方面,虽然反编译Java applet并不需要花费多少力气,但是隐藏你的代码通常并不是一个重要的话题。有另外两个因素很重要。如果编译过的applet很大的话,那么就需要额外的时间去下载它。脚本语言程序只是被作为Web页面的一部分文本而集成到了Web页面中。这对Web网站的响应能力来说很重要。另一个因素是非常重要的“学习曲线”问题。如果你是一个Visual BASIC程序员,那么转而学习VBScript可能是最快的解决方案,而且由于它或许能够解决大多数典型的客户/服务器问题,所以你可能很难对学习Java报以公正的态度。如果你已经对脚本语言很有经验了,那么你在考虑使用Java之前,应该先看看JavaScript是否满足你的要求,这样对你会很有好处,因为它们能够更方便地满足你的要求,而且使你更具生产力。Java引起人们的注意很大程度上始于applet。Java确实是一种通用的编程语言,至少在理论上可以解决各种其他语言能够解决的问题。正像前面指出的那样,可能存在其他更有效的方式去解决客户/服务器问题。当你离开applet的竞技场时,你便步入了通用应用系统的世界,这里的系统都是独立运行的,不需要浏览器,就像其他普通程序一样。在这里,Java的威力不仅在于它的可移植性,还包括它的可编程性。Java已经具备了许多功能,让你创建健壮的程序,而花费的时间比使用Java之前的任何编程语言都更少。不过,这是好坏参半的事。为Java带来的改进,所付出的代价是降低了执行速度。像任何语言一样,Java也具有不适合解决某类问题的天生的限制。然而,Java是快速进化的语言,而且每当发布一个新版本时,它都会因为能够解决更多的问题而变得越来越具有吸引力。1.3 可行性的分析可行性研究的目的,就是用最小的代价在尽可能短的时间内确定问题是否能够解决。要达到这个目的,必须分析几种主要的可能解法的利弊,从而判断原定的系统规模和目标是否现实,系统完成后所能带来的效益是否大到值得投资开发这个系统的程度。因此,可行性研究实质上是要进行一次大大压缩简化了的系统分析和设计的过程,也就是在较高层次上以较抽象的方式进行的系统分析和设计的过程。1.3.1 技术可行性本游戏是在Windows XP环境下开发的,一般的机器配置就可以了,对机器本身没有太高的要求,一般当前学校或个人电脑完全可满足要求,环境只需装上jdk 1.4或以上版本就行了,Java是现在全球最时髦的开发工具之一,它拥有一套庞大且完善的类库,内置了其他语言需要靠库甚至是操作系统才能支持的功能,拥有一个虚拟机。NeatBeans IDE 5.5是SUN公司开发的Java可视化集成开发工具,是目前最优秀的Java集成开发工具之一。1.3.2 经济可行性由于本系统使用到的工具一般机器都具备,使用环境也很简单,开发成本低,本课题研究的内容是涉及网络的游戏对战。当今形式下网络游戏俨然已经成为年轻人最时兴的消费方式之一,JAVA一直以来由于其可以“跨平台”以及“一次编译,到处运行”等特点,许多人直接它为网络编程语言,且由于JAVA游戏一般来说简单有趣,并且对用户硬件要求极小,所以JAVA游戏通常对85%的计算机用户都有吸引力。且政府态度和政策都是一种信号,表明2005年对本土网络游戏的扶持力度将加大;国内游戏厂商将可获得发展的核心技术平台;政策有利于保护中国游戏软件的自主知识产权;这为网络游戏发展创造了良好的政策环境。1.3.3 操作可行性由于在整个系统的开发过程中从操作简便、界面美观、灵活实用的用户要求为出发点,界面设计时充分考虑玩家的感受,界面比较直观,交互性很好,所以操作起来简单明了。1.3.4 法律可行性信息产业部已将网络游戏通用引擎研究及示范产品纳入国家“863计划”,这是中国首次将网络游戏技术纳入国家科技计划。文化部也向国内12家在网络游戏业的实力厂商首批颁发了网络文化经营许可证,加大对网络游戏的监管力度,进口游戏审查制,限制国内对国外的受理措施。科技部制定科技发展规划,将把网络游戏纳入现代服务业并加以扶持。政府态度和政策都是一种信号,表明2005年对本土网络游戏的扶持力度将加大;国内游戏厂商将可获得发展的核心技术平台;政策有利于保护中国游戏软件的自主知识产权;这为网络游戏发展创造了良好的政策环境。2 需求分析所谓系统分析,就是指在整个系统开发工程中,解决“做什么”的问题,把要解决哪些问题,满足用户哪些具体的信息需求调查分析清楚,从逻辑上或是说从信息处理的功能需求上提出系统的方案,即逻辑模型,为下一阶段进行物理方案设计,解决怎么办提供依据。2.1 系统初步分析2.1.1 用户需求分析随着Internet的发展,进入信息时代后快速获得网络共享资源成为很简单的事情,人们对互联网也有了很大的依赖性。网络的普及化使得原本单人的游戏已经不能适应人们的需要,广大的游戏者迫切需要能够和身在异地的朋友一起享受游戏的乐趣。在这种环境下,网络游戏应运而生,越来越多的游戏者投身到网络游戏中。这样带来的问题自然成为越来越多的游戏研究者将研究方向转为网络游戏的研究。据目前的网络游戏的调研来看,以运动休闲为主的运动类游戏正在受到越来越多玩家的支持和爱戴。但是此类网络游戏中,由Java开发的网络游戏仍然是一个空白页,但是它却是一个迫切需要填补的空白页。而Java由于其天生的语言特性(请见1.2节),很适合用于开发网络游戏,但由于系统环境的问题使得它一直以来未能用于游戏开发,而近来由于Java的发展,它已经摆脱了束缚,浮出了游戏开发的水面,若能在网络上出现高要求多人互动的Java游戏,它将是一项极为伟大的发展。这也正是现在许多玩家迫切要求的。2.1.2 功能需求分析系统功能的需求指定系统必须提供的服务。通过需求分析应该划分出系统必须完成的所有功能。本作的功能模块主要包括游戏的引擎设计,游戏的界面设计。1.游戏的引擎设计的需求分析:游戏引擎是游戏的灵魂,也就是这个游戏的框架,它的好坏直接决定着游戏的质量。它是控制所有游戏功能的主程序,包括画面的处理,人工智能的实现,接受玩家的设置,以及网络联机的实现等等。所以鉴定一个游戏的好坏,从内部设计的原因上说来,是从游戏的引擎设计体现出来的。一个游戏的引擎设计,直接关系到游戏设计的其他方面,诸如游戏的图形系统、声音系统及设计的物理模块等等各个方面。就如一台电脑需要CPU一样,游戏的引擎也是直接牵制着整个游戏的设计。它的主要作用就是处理游戏中的事件,运行游戏中的图象,输出声音及画面,调整游戏的节奏,响应玩家的游戏监听事件等等。所以,游戏的引擎设计是必要的功能模块,而且游戏的引擎设计必须做好,以使得游戏更具有可玩性。游戏程序是一项精度要求很高的程序系统,因为其代码利用率很高。一个实时运行的最终作品,每秒都会运行成千上万行程序,绘图事件等都会以极高的频率在后台等待响应,若有丝毫的差别都将很容易导致程序在运行不久后可能出现严重错误,甚至死循环。因此,其逻辑设计应当相当严谨,需将所有可能发生的事件及意外情况考虑在设计中。2游戏界面设计的需求分析:作为一个游戏吸引玩家的重要方面,游戏的界面要很漂亮,图形动画的设计是非常必要的。本作将采用模拟动画的方式将战争展现在玩家眼前。设计出丰富的战争环境,游戏中为了美观,适用性强,需要采用外部文件引入的图片贴图,而Java中提供了用于处理图片的功能包,使得解决静态或动态、画面背景、屏幕刷新的双缓冲等都有较好的解决方案。2.1.3 系统的可靠性和可用性需求分析可靠性需求定量地指定系统的可靠性。例如,游戏在运行过程中不能频繁发生错误而不得不终止游戏。可用性则与可靠性密切相关,它量化了用户可以使用系统的程度。例如,游戏的运行必须保证随时可以,不能在一段不使用的时间内,游戏产生不可预见的错误而致无法运行等等。2.2 数据流分析数据流程分析主要包括对信息的流动、传递、处理、存储等的分析。数据流程分析的目的就是要发现和解决数据流通中的问题。通过对本系统的需求分析,确定了系统的基本功能。整个系统的数据流图如图2-1所示: 图2-1 系统数据流程图3总体设计总体设计过程通常由两个主要阶段组成:系统设计阶段,确定系统的具体实现方案;结构设计阶段,确定软件结构和功能模块。3.1 系统开发3.1.1系统开发的原则经过需求分析阶段的工作,系统必须“做什么”已经清楚了,现在是决定“怎么做”的时候了。总体设计的基本目的就是回答“概括地说,系统应该如何实现?”这个问题,因此,总体设计又称为概要设计或初步设计。通过这个阶段的工作将划分出组成系统的物理元素程序、文件、数据库、人工过程和文档等等,但是每个物理元素仍然处于黑盒子级,这些黑盒子里的具体内容将在以后仔细设计。总体设计阶段的另一项重要任务是设计软件的结构,也就是要确定系统中每个程序是由哪些模块组成的,以及这些模块相互间的关系。总体设计过程首先寻找实现目标系统的各种不同的方案,需求分析阶段得到的数据流图是设想各种可能方案的基础。然后从这些供选择的方案中选取若干合理的方案,为每个合理的方案都准备一份系统流程图,列出组成系统的所有物理元素,进行成本/效益分析,并且指定实现此方案的进度计划。通常,设计出初步的软件结构后还要多方改进,从而得到更合理的结构,进行必要的数据库设计,确定测试要求并且制定测试计划。基于上面的叙述,在详细设计之前先进行总体设计的必要性:可以站在全局高度上,花较少成本,从较抽象的层次上分析比对多种可能的系统方案和软件结构,从中选出最佳方案和最合理的软件结构,从而用较低成本开发出较高质量的软件系统。3.1.2 系统设计阶段系统设计阶段的主要目的就是确定软件如何做的问题。主要任务就是确定系统中的大模块和设计方法,确定软件的功能模块和模块的作用,组成,关系等等。本系统是一款希望可以基于网络的多人对战游戏,当游戏者打开游戏,游戏界面打开,然后玩家可以选择是进行一轮新的游戏,还是选择接着玩上次没玩结束的游戏(如果先前已经玩过该游戏,但没有玩结束,有事了,并且保存了),只需要选择载入游戏就可以;玩家还可以选择是进行单机游戏或是联机游戏,如果选择网络联机玩的话只需要启动服务器等待其他玩家加入就可以了;如果选择了单机游戏,并选择了进行一轮新的游戏,则游戏会出现游戏设置界面,通过该界面玩家可以设置游戏的玩家数量(2-6个)以及游戏的难度,电脑玩家有简单智力的和高智力的,然后玩家可以选择不同的卡片模式和不同的游戏模式(分为统治型、首都型和任务型),并且玩家可以选择不同的游戏地图,游戏的目标是统治全世界,当玩家设置好一切后,可以点击开始游戏,则游戏开始。游戏开始,游戏画面是一张被分割成多个国家的地图,每个玩家可以轮流在地图上选择自己的地盘和军队的布置,而电脑玩家也会自动放置军队,当每个国家都被放上军队后,才可以重复在一个国家放置多余的军队,当默认的所有军队全都放置好,然后玩家就可以开始统一全球的战争游戏了,而当一方的军队侵略另一边时,游戏程序通过一定的人工智能算法让战争的双方分别产生随机数,然后进行比较,大的一方胜利,而当进攻者与防守者产生的数字一样大时,算是进攻失败,如果进攻胜利,则胜者将占领该国家,并可以选择留守该国家的军队数,而等到下一轮到该玩家进攻时,可以根据该玩家在占领的领土来决定你可以增加多少军队,以及你可以获得的卡片,获得的卡片可以用来交换军队,最后占领全世界(消灭了其他两个玩家)的为胜利者。在游戏过程中如果玩家突然有事无法继续游戏,本游戏可以保存当前游戏状态,当玩家有时间时可以接下去游戏,而无需重新开始,玩家也可以将自己的机器作为服务器,通过网络与网络上的其他玩家一起游戏。本游戏还具有统计的功能,在你游戏过程中或则游戏结束后你可以查看在本局游戏中各个玩家各个方面的战绩的统计(例如每个玩家在游戏过程当中所占领的国家数、军队数、摧毁数、伤亡数、受到进攻的次数等等),游戏中还设置了控制台,玩家可以通过图形显示的按钮进行游戏,也可以通过命令来进行游戏,在游戏菜单栏的帮助中,玩家可以选择命令按扭来显示出游戏中可用的命令菜单,玩家可以通过选择其中的关于了解本游戏的一些信息。当你赢的了游戏,游戏会告诉你,你胜利了!关于线程:对象技术提供了一种把程序划分成若干独立部分的方式。通常,还需要把程序转换成彼此分离的、能独立运行的子任务。每一个这样的独立子任务都被称为一个“线程”。每个线程都好象是在独立运行并且有自己的CPU。CPU时间确实是通过某些底层机制进行分配的,不过你一般不考虑这些,这使得编写多线程程序的任务变得容易得多了。多线程有多种用途,不过通常用法是,程序中的某个部分与一个特定的事件或资源联系在一起,而又不想让这种联系阻碍程序其余部分的运行。这时候,可以创建一个与这个事件或者资源相关联的线程,并且让此线程独立于主程序运行。使用并发的最引人瞩目的理由之一就是,产生一个可作出响应的用户界面。考虑一个程序,它要执行某项强烈需用CPU的计算,这样就会导致用户的输入被忽略,也就无法作出响应。问题的实质是:程序需要一边连续进行计算,同时还要把控制权交给用户界面,这样程序才能响应用户的操作。并发还可以用来优化吞吐量。比如,在等待数据到达输入/输出端口的同时,可以进行其他重要的工作。要是不用线程的话,唯一可行的办法就是不断查询输入/输出端口,这种方法不仅笨拙,而且很困难。线程模型为编程带来了便利,它简化了在单一程序中同时交织在一起的多个操作的处理。在使用线程时,CPU将轮流给每个线程分配其占用时间。每个线程都觉得自己在一直占用CPU ,但事实上CPU时间是划分成片段分配给了所有线程。例外情况是程序运行在具多个CPU的机器上,但线程的一大好处是可以使你从这个层次抽身出来,即代码不必知道它是运行在具有一个还是多个CPU的机器上。所以线程是一种透明的、可扩展的程序方法,如果程序运行的太慢,为机器增添一个CPU就能很容易地加快程序的运行速度。多任务和多线程往往是使用多处理器系统的最合理方式。游戏中将在很多地方用到多线程,像在进行网络联机时将会使用多线程来是两个玩家可以同步进行游戏,而图形界面也通过多线程同时进行多的程序的进行。3.1.3 结构设计阶段1. 经过系统设计阶段的思考和实践,需要对功能结构进行细致的划分。一个程序的结构设计的好坏也是决定其发展的重要指标。对一个程序的模块划分往往也能使程序设计变得简单。本游戏的模块大致分为游戏引擎和用户界面两大模块而,游戏引擎模块又分为核心包、ai包、网络包、本地翻译包、游戏控制类等等,其功能模块图示如下:King游戏 游戏引擎用户界面网络模块核心模块游戏控制模块AI模块本地翻译模块图3-1 系统功能模块结构图功能模块介绍:king.engine.core包:其中包括了一些基本核心的类,例如像表示一个国家的Country类,表示一个卡片的Card类,表示一个版块的Continent类,表示一个玩家的Player类以及表示一个任务的Mission类等等。king.engine.ai包:其中包括了玩家可选择的简单人工智能的电脑玩家和复杂人工智能的电脑玩家以及不同游戏类型的不同玩家的人工智能。king.engine.translation包:其中包括了用于将游戏中的语言根据计算机所处的不同的国家翻译成不同的语言的类。包:其中包括了将游戏用于网络联机玩用到的类。游戏控制模块:主要包含一些我自己定义的一些接口和过滤器类等工具类。系统用例图见下页:图3-2 系统用例图游戏设置用例图:图3-3 游戏设置用例图网络联机用例图:图3-4 网络联机游戏用例图游戏用例图:图3-5 游戏用例图2. 系统的主要UML图见下页:图3-2 Risk类的依赖关系图图3-3 SwingGUIPanel类的依赖关系图图3-4 RikGame类的依赖关系图4 详细设计详细设计阶段的根本目标是确定应该怎样具体地实现所要求的系统,也就是说,经过这个阶段的设计工作,应该得出对目标系统的精确描述,从而在编码阶段可以把这个描述直接翻译成用某种程序设计语言书写的程序。详细设计的结果基本上决定了最终程序代码的质量。详细设计的目标不仅仅是逻辑上正确地实现每个模块的功能,更重要的是设计出的处理过程应该尽可能简明易懂。结构程序设计技术是实现上述目标的关键技术,因此是详细设计的逻辑基础。4.1 核心包的设计游戏中需要经常用到的常有名词有卡片、国家、任务、玩家、版块、统计资料等等,所以我们由此可以确定这些基本的核心类:Card、Continent、Country、Mission、Player、Statistic;4.1.1 Card类的设计与实现:在游戏过程中某一些国家中会有卡片,当你没占领了这样的国家的时候,你就能获得卡片,当你获得了几张放在一起可以交易的卡片的时候你就可以用卡片换军队了,所以在该类中有卡片的名字,所属国家等属性,该类的类图如下所示:图4-1 Card类的类图Card类的主要代码如下:public class Card implements Serializable public Card(String n, Country t) name = n; Country = t; public String getName() return name; public Country getCountry() return Country; 4.1.2 Continent类的设计与实现:游戏中的图片都是世界地图,其中包括几个洲,这些洲再分成一个一个国家,洲有自己的名字和颜色,并且每个洲都有它的对应的价值的军队数,当你占领了一个洲的时候,当下一轮到你进攻的时候,你可以获得相应数目的军队,在其他对象访问该对象时,可以获得它的名字,颜色,价值军队数和所属的玩家,其类图见图4-2所示:图4-2 Continent类的类图Continent类的主要代码如下:public class Continent implements Serializable public boolean isOwned(Player p) int ownedByPlayer=0;for (int c=0; c territoriesContained.size() ; c+) if ( (Country)territoriesContained.elementAt(c).getOwner() = p ) ownedByPlayer+;if ( ownedByPlayer=territoriesContained.size() ) return true;else return false;if ( ownedByPlayer=territoriesContained.size() ) return true;else return false; 4.1.3 Mission类的设计与实现:Mission类主要用来代表在不同模式的游戏当中你的任务,其类图如下所示:图4-4 Mission类的类图4.1.4 Country类的设计与实现:在本游戏中就是以国家为基本单位的,所以它为最核心的类,大部分其他类都需要访问它,其类图如下: 图4-3 Country类的类图其中该类通过其构造函数构造一个任务对象,传递的参数有:任务要消灭的敌人,需要占领的的国家数,在一个版块上需要的最少军队数,第一个需要占领的国家,第二个需要占领的国家,第三个需要占领的国家以及任务的描述,其构造函数代码如下: public Mission(Player p, int noc, int noa, Continent c1, Continent c2, Continent c3, String d) player = p;noofcountries = noc;noofarmies = noa;con1 = c1;con2 = c2;con3 = c3;discription = d; 4.1.5 Player类的设计与实现:玩家用来代表一个玩家对象,该类也是游戏程序中所要用到的最基本的类,其中玩家的属性有:名字,颜色,玩家任务,玩家类型等,为了后面的统计功能的实现,还在其中增加了已经消灭的敌人向量,所拥有的卡片,所拥有的版块数等等,为了实现网络联机的功能,还增加了玩家的网络地址等等。而玩家类中有一些重要的方法,像在后面要实现卡片交易,必要能获得玩家所拥有的卡片,还要判断一下玩家多拥有的卡片是否可以进行交易,以及为了实现网络联机要统计功能,必须要获得一些统计数据和玩家的网络地址,具体代码如下: public Card takeCard() Card c=(Card)cardsOwned.firstElement();cardsOwned.removeElementAt(0); return c; public void tradeInCards(Card card1, Card card2, Card card3) int noaFORcard = 2;/ 看看你是否可以从拥有的国家中获得额外的军队if (territoriesOwned.contains( card1.getCountry() ) ) (Country)card1.getCountry().addArmies(noaFORcard); currentStatistic.addReinforcements(noaFORcard);else if (territoriesOwned.contains( card2.getCountry() ) ) (Country)card2.getCountry().addArmies(noaFORcard); currentStatistic.addReinforcements(noaFORcard);else if (territoriesOwned.contains( card3.getCountry() ) ) (Country)card3.getCountry().addArmies(noaFORcard); currentStatistic.addReinforcements(noaFORcard);cardsOwned.remove(card1);cardsOwned.remove(card2);cardsOwned.remove(card3);cardsOwned.trimToSize(); public void addPlayersEliminated(Player p) playersEliminated.add(p); public Vector getPlayersEliminated() return playersEliminated; 4.1.6 Statistic类的设计与实现:统计类主要是用来实现游戏的统计功能而设计的类,每个玩家拥有一个统计向量用来记录一些数据,给类里面只要一个包含记录各种数据的整形数组statistic属性,统计数据有国家数,军队数,毁灭数,伤亡数,增强过程,大陆数,国家数,进攻次数,撤退次数,胜利次数等等,该类的类图如下所示:图4-5 Statistic类的类图其中的重要方法有结束一轮进攻进行统计endGoStatistics(int a, int b, int c, int d),向量中其他一些数据的计算方法,具体代码如下:statistics向量中0位置记录国家数,1记录军队数,2记录毁掉数,3记录伤亡数,4记录增强数,5记录大陆数,6记录帝国数,7记录进攻次数,8记录撤退次数,9记录胜利的次数,10记录战胜次数,11记录受到进攻的次数: public void endGoStatistics(int a, int b, int c, int d) statistics0 = a;statistics1 = b;statistics5 = c;statistics6 = d; public void addReinforcements(int a) statistics4 = statistics4 + a; public void addKill() statistics2+; public void addCasualty() statistics3+; public void addAttack() statistics7+; public void addAttacked() statistics11+; public void addRetreat() statistics8+; public void addCountriesWon() statistics9+; public void addCountriesLost() statistics10+; 4.2 本地翻译包的设计本包的设计是为了本游戏的国际化,在游戏过程中可以通过本包中的类实现语言的本地化,本包中包括两个类:TranslationBundle和MapTranslator。4.2.1 TranslationBoudle类的设计与实现该类主要是用来获得编写的资源包(这指语言包),然后该类可以通过Java API中的一些方法获得该游戏所处系统的语言环境,然后将游戏中的语言变换成本地语言;该类中主要用到了java.util.ResourceBundle类,资源包包含特定于语言环境的对象。当程序需要一个特定于语言环境的资源时(如 String),程序可以从适合当前用户语言环境的资源包中装入它。以这种方式可以编写很大程度上独立于用户语言环境的程序代码,它将资源包中大部分(如果不是全部)特定于语言环境的信息隔离开来。 这就使您所编写的程序可以: 轻松地本地化或翻译成不同的语言 一次处理多个语言环境 以后可以轻松地进行修改,支持更多的语言环境 资源包属于这样的系列,其成员共享一个公共的基本名称,但是名称中还有标识其语言环境的其他组件。例如,某个资源包系列的基本名称可能是 MyResources。该系列应该有一个默认资源包,其名称与其系列名相同( MyResources),并且如果不支持指定的语言环境,则此资源包应该用作最后的手段。然后,此系列可根据需要提供特定于语言环境的成员,例如一个名为 MyResources_de 的德语资源包。 某个系列中的每个资源包都包含相同的项,但是已经针对该资源包所代表的语言环境翻译了各项。例如,MyResources 和 MyResources_de 可能有用在取消操作按钮上的 String。在 MyResources 中,String 可能含有 Cancel,而在 MyResources_de 中则可能含有 Abbrechen。 如果不同的国家/地区有不同的资源,则可以进行限定:例如,MyResources_de_CH 是瑞士 (CH) 中包含德语 (de) 的对象。 Translation类中主要的方法有获得资源包和载入资源包,具体实现代码如下:public class TranslationBundle static public ResourceBundle getBundle()if (TranslationBundle.resBundle = null) TranslationBundle.loadBundle();return TranslationBundle.resBundle;static private void loadBundle()if (TranslationBundle.strLanguage = null) loc = Locale.getDefault(); else loc = new Locale(TranslationBundle.strLanguage);try TranslationBundle.resBundle = ResourceBundle.getBundle(king.engine.translation.Risk, loc); catch( java.util.MissingResourceException e) System.out.println( Error: Cant find a translation file. Exiting. );System.exit( 2); static private void setLanguage(String strLanguage)TranslationBundle.strLanguage = strLanguage;4.2.2 MapTranslator类的设计与实现该类主要是用来将游戏中图片显示中的语言变换成本地语言;具体实现代码如下:public class MapTranslatorprivate static ResourceBundle MapResb = null;private static ResourceBundle CardsResb = null;public static void setMap(String strFile) String strName = strFile.substring( 0, strFile.lastIndexOf( .);strFile = strName + _ + TranslationBundle.getBundle().getLocale().getLanguage() + .properties;try MapResb = new PropertyResourceBundle( (new URL(king.engine.Risk.mapsdir,strFile).openStream() );catch( IOException ioe ) try catch( MissingResourceException e) MapResb = null;public static String getTranslatedMapName(String strOriginal)if (MapResb = null) return strOriginal;String strReturn;try strReturn = MapResb.getString( strOriginal); catch(MissingResourceException e) strReturn = strOriginal;return strReturn;public static void setCards(String INstrFile) String strName = INstrFile.substring( 0, INstrFile.lastIndexOf( .);String strFile = strName + _ + TranslationBundle.getBundle().getLocale().getLanguage() + .properties;try CardsResb = new PropertyResourceBundle( (new URL(king.engine.Risk.mapsdir,strFile)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论