1、本论文着眼于J2ME技术的应用,开发一款可商用的手机游戏程序坦克大战。本程序的界面和运作方式继承于日本任天堂公司在20世纪80年代开发的Battle City游戏,将老少皆宜的经典作品移植到手机上来,为更流行的硬件平台提供应用软件。本游戏中设计的主要研究的内容:敌我双方的坦克以及子弹均以图片方式显示,并且添加游戏包含河、墙、草等环境元素。使用多线程来控制坦克的动作同时使用缓冲技术来减少游戏过程中屏幕的闪动率,游戏的难度会随杀死敌人数量的增加而自动提高。敌人中包含特殊坦克,杀死后会随机出现奖励物品,我方坦克是有生命值控制的,共三条命。本游戏采用版本升级的方式逐步完善游戏功能。本游戏中包括游戏主窗
2、口程序模块,坦克类模块,子弹模块,河流模块,墙壁模块,及容纳这些物体的父类容器模块,奖励模块,爆炸显示模块,配置读取模块,这些模块之间相互联系。关键词 多线程双缓冲技术容器AbstractThis paper focuses on the application of J2ME technology, developed a commercial mobile phone games - tank war. The program interface and operation mode of inheritance in the Nintendo Co of Japan in t
3、he nineteen eighties developed Battle City game, the ages of classics ported to mobile phone, for more popular hardware platform to provide application software.The main research content of the game design:the bullets between us and the enemy displayed in picture, and the game contains river, wall,
4、grass and other environmental elements. The use of multiple threads to control the tank action, at the same time using buffer technology to reduce the course of the game screen flicker rate.The difficulty of the game will raise automatically with the increase of the number of the killed enemy.The en
5、emy has special tanks,and it will randomly appear rewards after killing enemys,and our tanks has the life value control. The game uses the method of version upgrading to perfect game features gradually.The game includes a main program module, tank module , bullet module, river module, wall module, a
6、nd the parent container module which accommodates these objects , reward module, display of blast module, configured module, these modules are interconnected with each other.Keywords:multiple threads,buffer technology,container目 录摘要1ABSTRACT2第1章绪论3项目背景31.1.1 国内背景31.1.2 国外背景4项目来源5设计
7、游戏的必备知识51.3.1 JAVA语言程序设计的基本知识点51.3.2 JAVA语言的特性7第2章需求分析8系统需求分析8用况建模9活动建模10开发环境102.5 J2ME概况及应用112.5.1 JAVA平台的四个版本112.6 本章小结11第3章游戏设计133.1 游戏结构设计133.2数据结构设计143.3算法设计153.4 本章小结23第4章游戏详细设计244.1 游戏功能设计24类模型254.3 玩家坦克的功能属性264.4 敌人坦克的功能属性264.5子弹的运行和控制274.6 坦克的控制和敌方的智能运行284.7 本章小结30第5章游戏实现31游戏规则及运行界面315.1.1
8、游戏步骤315.1.2 操作315.1.3 游戏规则及运行界面31本章小结36第6章本游戏中关键技术和要改进的地方376.1 有关绘图的关键技术376.2 GRAPHICS类376.3 文件系统37利用缓冲技术消除闪烁现象38本程序要改进的地方39本章总结40第7章总结417.1 本程序的总结417.2 经验和感想41参考文献42第1章 绪论1.1项目背景1 国内背景早期的游戏不能被广泛接受最主要的就是该引擎没有具备广泛的硬件支持幅度,不能够自上而下充分发挥各等级硬件的运算资源。目前PC游戏销量萎靡(相对于游戏机)的主要病根之一就是PC平台不同等级的硬件性能相差甚巨,而大部分PC游
9、戏对不同级别的硬件支持范围又不够广,所以往往要么是配置需求过高,要么就是画质跟不上时代,导致玩家接受面小而严重影响销量。而过去暴雪的游戏之所以能够赢得如此庞大的玩家追捧,除了作品本身的优秀质量以外,相对较广的硬件支持同样功不可没。能够很好兼顾当时高配置下的优秀画质以及低端配置下同样能够提供流畅的游戏体验而闻名。国内大多数玩家接触的坦克大战,都是经傅瓒改造后的版本,经典坦克游戏的编程:原版坦克大战一共35关,玩家的任务是保住己方司令部,并消灭敌方20辆坦克。傅瓒对原版的地图和参数进行修改,增加了一系列新关卡,这就是最早的“烟山版”坦克大战坦克7(进入游戏后有“TANK A”至“TANK G”七个
10、选项,因此得名)。之后他又陆续制作了坦克14、坦克28、89坦克和90坦克等版本,加入了敌方坦克吃宝物、双打时互借坦克等功能,以及水陆两用坦克(可渡河的船)和火焰喷射器(可削草的手枪)等宝物,这些内容都是原版没有的。作为这一系列的集大成者,90坦克是其中流传最广的一款。其辨识方法也很简单,90坦克在B3、B5、B6和B7四版的地图上,分别有“福州”、“烟山”、“软件”和“542408”(电话号码)的字样,这大约是国内最早的游戏内置广告。凭借“坦克”系列,烟山软件的营业额再次翻番,1989年突破200万元,又推出了导弹坦克。导弹坦克已不再满足于对地图和参数的简单编辑,还对游戏程序做了修改,增加了
11、发射导弹、加固工事等新玩法。玩家发射的导弹可以越过地图上的所有障碍,还可以转弯;导弹用完后,玩家可以用A键加固工事或设置路障,将坦克开到砖或石头前,按A键举起砖石,到需要加固或设置路障的地方,再按A键放下。导弹坦克,连同烟山软件汉化的烟山杯围棋、中文麻将和中国象棋等另外三款游戏,被制作成四合一卡带,这盘卡带的母片(未加密的芯片)后来被卖给了一家台湾公司,这也使烟山软件无意间成为了国内第一家“进军海外”的游戏公司。.2 国外背景FC(Family Computer)主机在欧美又称Nintendo Entertainment System(可译作任天堂娱乐平台即NES)。FC主机在游戏业界造成的巨
12、大冲击众所周知,这款主机在当时事实上几乎占领了世界各地多个国家的整个游戏市场,并使得逐渐没落的北美游戏市场再度复苏。这款主机的性能比当时的多数主机都要强大,而价格上却便宜得多。主机所采用得处理器为CMOS 6502,一款已经淘汰的70年代中期产品。由于其价格便宜且极易使用,经过任天堂的改造后又焕发了全新活力。6502 芯片 主频为8 bit,12 MHz,内存8k,画面 52色,同屏最多显示其中的13色,声音2个矩波,1个三角波,1个杂音,1个PCM音频(见图1-1)。
13、Battle City是其发售卡带中的一款力作,设置了35个关卡,可以双人操纵,画面设置了若干种类的建筑物和阻挡物,以消灭所有敌人为通关条件,并有接宝物等增加游戏效果的设置,画面精美,音效杰出,在PC机的80386处理器仍未面世的当时,能在硬件上运行这样的2D程序不得不令人惊叹,难怪常有人说游戏程序是最大限度发挥硬件水平的载体。其游戏界面如图1-2所示。图1-2Battle City的界面图1-1 80年代中期的FC机器早期的游戏难免粗陋和简单,因为现在发展太快的游戏行业正缺少了那些让我们初次就爱上的游戏。还有技术性封闭测试主要是以测试版本稳定性为主,测试期间可能出现各类技术问题。暴雪这种精益
14、求精的公司,实际上游戏开发人员的第一个内部开发版本就因为画风太过于类似魔兽而被彻底推翻重来,而如今面对这个十年磨一剑的续作,我们不难猜想暴雪对其重视程度已经达到呕心沥血的程度!这款继承经典的游戏,给国人重铸的玩家带来网游的新天地。所以玩家全心关注,官网急速启动,研发部门日夜奋斗,只为一个目标:在第一时间开启坦克大战这款世纪经典游戏的网游增强版。其中坦克与技能卡都能得到升级的机会,经过强化与改造,能让一辆坦克产生翻天覆地的变化。纵观IT产业的历史,就像军事的发展时常推动计算机的演化一样,计算机游戏已经成为技术创新背后的动力之一。计算机游戏者渴望更加强大的硬件计算能力;渴望不受不同的软件的限制无论
15、是将图形强制在人工智能(AI)上 还是网络安全性上。游戏开发者和玩家常常是前沿计算机技术的最早的采用者。由于他们的创新天性,游戏不再是由大型采购公司控制的技术产品游戏领域总是有充足的空间给那些在这方面有天分的单个创新者。项目来源进入21世纪,社会竞争日趋激烈,同时人们的生活压力日益增大,为了在紧张的社会环境给人们带来休闲的快乐,各大游戏公司相继开发种种其乐无穷的游戏。其中坦克大战就是其中的一款。坦克大战早在上世纪是由日本专家任天堂的开发的,后流传到中国福建,在福建的一所高校中,由一位物理老师傅瓒修改后流行于整个大陆,现在人们所玩的坦克大战游戏大部分都是在傅瓒的基础上修改的,出于对游戏开发的兴趣
16、与好奇,便尝试开发了此游戏1.3.1 Java语言程序设计的基本知识点1java语言支持面向对象程序语言的三个关键特性(1)封装将对象的数据与操作数据的方法相结合,通过方法将对象的数据和实现的细节保护起来。(2)继承当一个类是另一个类的特例时,这两个类之间具有父子关系。子类就可以继承了父类的状态(变量)和行为(方法),子类可以重用父类的这部分代码。继承关系减少了程序中相似代码的重复说明。程序员可以再父类中对一些共同操作与属性只说明一次,而在子类中,基于子类的特性再进行扩展或是改变。并且继承具有传递性。(3)多态多态可以表达为,对外一个接口,内部多重实现。Java语言支持2种形式的多态。运行时多
17、态,和编译时多态是通过方法的重载实现编译时的多态,而遇到类之间的继承性,方法的重实现运行时多态。2类和对象的基本概念类和对象是java中的基本组成要素。类描述了同一类对象都举要的数据和行为。创建一个新类,就是创建了一种新的数据类型。类有两种基本成分:变量和方法,成为成员变量和成员方法。(1)public 说明了类的属性。Extend表示类继承了superclassname为父名的父类,implements关键词表示类实现了interfacenamelist中列出的各个接口。(2)public的属性表明任意类均可以访问这个类,如果类声明中没有public,则只有定义在同一个包中的类才能访问这个类
18、。(3)类体。类体提供了这个类的对象在生命周期中需要的代码, 构造和初始化新对象的构造方法。(4)类的封装与隐藏 Java中类成员的访问权限有: public , private,以及默认权限(是没有任何定义符的)。利用这种访问权限可以控制类中的信息的隐藏程度。(5)方法体中可以声明方法中所用到的局部变量,它的作用域只在该方法的内部,如果局部变量的名字和类的成员变量的名字相同,则成员变量被隐藏。如果要将该成员变量显露出来,则需要在该变量前加修饰符this。在类的层次结构中,当子类的成员变量与父类的成员变量同名时,子类的成员变量会将父类的成员变量隐藏。方法重写:子类可以改写父类方法所
19、实现的功能。4.static关键词在成员变量声明是用static,是是该变量声明我静态变量。静态变量只是在系统加载所在的类时,分配空间并初始化。main方法是一个静态方法,它是程序的入口点。与类相比,接口只是规定了一个类的基本形式,不涉及什么实现的细节。接口只是进行方法的声明,不提供任何方法的实现接口中的所用方法都是抽象的,一个类可以显现多个接口, 的泪但是只能继承一个抽象的父类接口与显现它的类不构成继承体系。为了使类易于查找和使用,为了避免命名冲突,我们将一组相关类和接口包裹在一起形成包。7.子类和父类,而没有说明抽象类的作用。抽象类是据有一个或多个抽象方法的类,必须声明为抽象类。抽象类的特
20、点是,不能创建实例上面讲的只是子类和父类。而没有说明抽象类的作用。抽象类是据有一个或多个抽象方法的类,必须声明为抽象类。8.抽象类与接口紧密相关。然而接口又比抽象类更抽象,这主要体现在它们的差别上:类可以实现无限个接口,但仅能从一个抽象(或任何其他类型)类继承,从抽象类派生的类仍可实现接口,从而得出接口是用来解决多重继承问题的。抽象类当中可以存在非抽象的方法,可接口不能且它里面的方法只是一个声名必须用public来修饰没有具体实现的方法。抽象类中的成员变量可以被不同的修饰符来修饰,可接口中的成员变量默认的都是静态常量(static final)。这一点也是最重要的一点本质的一点"抽象
21、类是对象的抽象,然接口是一种行为规范。 1.3.2 Java语言的特性1平台无关性Java引进虚拟机原理,并运行于虚拟机,实现不同平台之间的Java接口。使用Java编写的程序能在世界范围内共享。Java的数据类型与机器无关。2安全性Java的编程类似C+,但舍弃了C+的指针对存储器地址的直接操作,程序运行时,内存由操作系统分配,这样可以避免病毒通过指针入侵系统。它提供了安全管理器,防止程序的非法访问。3面向对象 Java吸收了C+面向对象的概念,将数据封装于类中,实现了程序的简洁性和便于维护性,使程序代码可以只需一次编译就可反复利用。4健壮性Java致力与检查程序在编译和运行时的错误,并自动
22、回收内存,减少了内存出错的可能性。Java取消了C语言的结构、指针、#define语句、多重继承、操作符、重载等不易被掌握的特性,提供垃圾收集器自动回收不用的内存空间。第2章 需求分析需求分析即是分析用户的需求,是软件计划时建立的可行性进行细化与精确,分配软件元素,是软件定义时期的最后一个阶段,它的基本任务是确定系统必须做什么。是对要做的系统确定一个完整的、具体的、清晰的、准确的要求。可以分为需求的提出,需求的描述,需求的评审等阶段。需求分析也是设计数据库的起点,需求分析的结果是否准确地反映了用户的实际要求,将直接影响到后面各个阶段的设计,并影响到设计结果是否合理和实用。需求分析的任务是通过详
23、细调查现实世界要处理的对象(坦克、子弹、墙等),充分了解游戏的运行概况,明确开发游戏的各种需求,然后在此基础上确定游戏的功能。调查的重点是“数据”和“处理”,通过调查、收集与分析,获得开发游戏的如下要求:信息要求、处理要求、安全性与健壮性要求。2.1系统需求分析坦克大战主要需要我方坦克和对方坦克,还有我的基地,砖墙,铁墙,水,绿草,开始背景,游戏胜利背景,游戏结束背景,以及各种事件触发音乐。我方坦克和对方坦克都可以上下左右移动,游戏的玩家通过相应的键来控制坦克的移动和发射子弹,对方坦克在创建的时候就能够发出子弹。当我方子弹与敌军坦克相碰时会有爆炸效果产生。当我方坦克被对方的子弹打中,或者总部被
24、毁时或者我方坦克打中对方坦克的数目达到某个值时游戏结束。2.2用况建模图2-1游戏用例图游戏中敌我双方坦克均可完成射击,开动的功能,但己方坦克的运行是通过键盘响应事件控制,而敌方坦克是根据设定相应的休眠周期来控制运行的。同时,出现在屏幕上的敌方可能会有较多的数量,这需要为每个敌方开辟一个线程以便能让其独立运行。Java的多线程能力为实现这样的游戏提供了可能。敌人坦克的运行算法也需要进行适当的设置,以免游戏过于简单,单调。2.3活动建模图2-2游戏活动图游戏没开始前是一个由玩家确定是否开始的界面,玩家输入1开始游戏,每一关坦克数量不同,随着关数的增加,坦克数量也在不断增加,我方坦克不关在哪一关生
25、命值用完了游戏便结束,但只有游戏进行到最后一关并将最后一关的坦克全数歼灭我方才算取得胜利。2.4开发环境操作系统:Microsoft Windows XP程序语言:Java 2开发包:Java(TM)2 Standard Edition (build _02-b06) IDE: 2.5 J2ME概况及应用2.5.1 Java平台的四个版本虽然 Java 已经被用到许多企业级软体上,可是其实骨子里面还是非常适合用在嵌入式系统之中。Java平台演进到Java2后,Java平台分别针对不同领域的需求被分成四个版本,亦即J2EE、J2SE、J2ME以及Java
26、Card,其结构示意图见图2-3。J2eeJ2seJ2meSmart card图2-3 java版本J2EE是Java2的标准版,其核心是一组技术规范与指南,其中所包含的各类组件、服务架构及技术层次,均有共同的标准及规格,让各种依循J2EE架构的不同平台之间,存在良好的兼容性,解决过去企业后端使用的信息产品彼此之间无法兼容,企业内部或外部难以互通的窘境。J2SE是Java2的标准版,是J2EE的基础,定位在客户端,主要用于桌面应用软件的编程,它大量的JDK代码库是每个要学习J2EE的编程人员必须掌握的,它包含那些构成Java语言核心的类。 比如:数据库连接、接口定义、输入/输出、网络编程 J2
27、ME是为机顶盒、移动电话和PDA之类嵌入式消费电子设备提供的Java语言平台,包括虚拟机和一系列标准化的Java API。Java Card技术主要是让智慧卡或与智慧卡相近的装置上,以具有安全防护性的方式来执行小型的Java Applet,此技术也被广泛运用在SIM卡、提款卡上。2.6 本章小结本章主要讲述坦克大战游戏所需要的元素以及国内外游戏的发展背景。以及介绍了国外任天堂(Nintendo)的8位FC机器和Battle City游戏程序,同时介绍了java语言的特性和关键知识点和开发环境,由于J2ME平台的好多特征对企业组织发展都有益,所以它被广大设备制造商、网络通信公司和消费者广泛接受。
28、所以J2ME平台是未来Java平台发展的重点项目。另外因为J2ME应用在不同设备上都是便携式的,他们常常可在网络上下载和执行。Java被设计成一种安全的语言。所有字节码应用在执行之前都要校验;JVM在执行过程中监督应用的安全性。第3章 游戏设计本游戏中设计的主要研究的内容:敌我双方的坦克以及子弹均以图片方式显示,并且添加游戏包含河、墙等环境元素。使用多线程来控制坦克的动作同时使用缓冲技术来减少游戏过程中屏幕的闪动率,当游戏的难度会随杀死敌人数量的增加而自动提高。敌人中包含特殊坦克,杀死后会随机出现奖励物品,我方坦克是有生命值控制的。本游戏采用版本升级的方式逐步完善游戏功能。3.1 游戏结构设计
29、本游戏中有游戏主窗口程序模块,坦克类模块,子弹模块,河流模块,墙壁模块,及容纳这些物体的父类容器模块,奖励模块,爆炸显示模块,配置读取模块,这写模块之间相互联系,如图3-1所示。图3-1 游戏结构图3.2 数据结构设计游戏中各个元素定义成线程类,并且在一定的条件下某些元素随机消失,随机出现,因此为了操作的方便,将这些元素均存放在链表中,采用链表而不采用数组是因为对链表的插入和删除操作容易,且其占用内存的空间是可变的,不用像数组那样事先需要为其分配一定的存储空间,因此链表还节省了空间。此外,还用到了泛型,将泛型和链表结合使用,是为了方便在从链表中取出元素时无需强制转换。各元素的数据结构如下表所示
30、:表3.1 数据结构类名属性类型属性名属性意义默认值Tank,SpeedTank,FinalTank敌方三个等级不同的坦克intlevel坦克等级0intTank_direction默认的方向0intx坦克横坐标0inty坦克纵坐标0intMoving是否改变方向0intspeed_x横向速度3intspeed_y纵向速度3booleanRuined是否被摧毁falseintcount是否射击0Shoot敌方子弹intx子弹横坐标0inty子弹纵坐标0intdirection子弹飞行方向0intspeed_x子弹横向速度20intspeed_y子弹纵向速度20PlayerTank玩家坦克boo
31、leanRuined是否被摧毁falseintTank_direction默认的方向1intlevel坦克等级0intx坦克横坐标0inty坦克纵坐标0intspeed_x横向速度5intspeed_y纵向速度5PlayerBullet玩家子弹intx子弹横坐标0inty子弹纵坐标0intdirection子弹飞行方向0intspeed_x子弹横向速度15intspeed_y子弹纵向速度15Bang爆炸效果intx爆炸地点横坐标0inty爆炸地点纵坐标0intnumber第几张爆炸图片0booleandisapear是否消失falseHome,Bride,Fe,Grass,Riverintx元
32、素横坐标0inty元素纵坐标03.3 算法设计本游戏中每个可以移动的对象都将其设置成一个线程,即敌我双方坦克,子弹均是以线程的形式出现在游戏中的,此外游戏中还设置了砖墙,河流,草皮,钢铁奖励物品等元素,这些元素都是以图片的形式出现在游戏中,并且存放在列表中。游戏过程中,坦克和子弹有时会碰撞到这些元素,当坦克碰撞到墙,河流,钢铁时就会改变方向,而子弹可以击碎砖墙无法击碎钢铁,关于碰撞都是通过难证坐标是否重合实现的,以下是具体实现。我双方坦克在界面中是以图片的形式呈现的,并存放中定义好的链表中,游戏中为其定义了全局变量ruined,类型为布尔型的,用来判断坦克是否被摧毁,当其值为true说明坦克被
33、摧毁,此外还定义了函数Stop_down(),Stop_up(),Stop_right(), Stop_left()来判断坦克是否撞击了墙,其返回类型同样是布尔型,最后我方坦克定义了fire()函数用来射击,敌方坦克定义了shoot()函数射击子弹,在游戏中的运行情况如图3-2图3-2敌我双方坦克当敌人坦克完全死亡时,即tanks.size()为0且flag达到相应的值,需调用clear()函数清空桌面上的敌我双方子弹和其它元素,然后进入下一关,重新转回画面。当然,如果当前已是最后一关,就不会再转回。进入下一关时,许多变量需要重新被初始化,如地图的绘制、敌人出现位置的重置、敌人的数量、玩家坦克
34、的当前位置。如果游戏未结束,则需判断屏上坦克是否已小于还剩坦克的总数,如果是这样,就需要再提供一批坦克。2.敌军子弹的线程在敌军坦克出现时就启动了,为了让子弹移动并且给玩家在视觉上达到子弹移动的效果,将子弹线程的休眠时间设为200毫秒。敌我双方子弹同样是放在列表中,并且每颗子弹都有属主,当子弹的属主被摧毁时,即ruined的值为true时,子弹也会死亡,也就是说存放子弹的链表将被清空,最后定义函数shoot_fe(),shoot_bride(),shoot_home(),succeed()来判断子弹是否击中相应的墙和对方坦克,其类型都是布尔类型,当子弹击中墙或对方坦克时就会通过start()函
35、数来启动爆炸效果线程,子弹在游戏中的运行情况如图3-3图3-3子弹的运行子弹是一个继承了Thread类的可运行单独线程的对象,在其出现在屏幕上的运行周期中,每一步都需要循环检测以下条件:是否与某坦克发生了碰撞,即击中了这辆坦克。子弹使用的是象素级的碰撞检测,因为子弹的图片形状不规则,如果使用矩形碰撞检测,将有可能在子弹尚未接触到物体时就已返回碰撞的真值。3.敌军坦克在游戏一开始时就通过strat()函数启动线程,之后坦克就会向着随机产生的方向前进,方向是通过random()函数产生的,0,1,2,3分别表示上下左右,坦克的移动步数是根据坦克的等级不同而定,定义level来表示坦克的等级,其中坦
36、克的移动步数和level之间在的关系为moveing=level * 2 + 6,敌军方向的控制如图3-4图3-4敌军坦克的控制让敌军坦克更加智能,同时动起来,构造函数中可以指定方向,new敌军坦克的时候指定敌军坦克的方向,让敌军坦克向随机方向移动。每次碰撞到墙时,都会产生一个随机方向,以便避开障碍物。4我方坦克的移动是通过玩家敲击键盘来控制的,程序中对玩家是否敲击键盘加了监听,当程序监听到玩家敲击键盘时,就响应该事件,并在keyPressed()函数中判断玩家按下的是哪个键,从而确定坦克的移动方向和是否射击子弹,当监听到坦克需要射击时,调用fire()函数进行射击,如果我方坦克被击毁时,我方
37、的坦克所分配的子弹也会从链表中清空,并且我方坦克分配子弹也是根据坦克的等级进行分配的,等级越高分配的子弹也就越多,如图3-5所示图3-5 我方坦克KeyBoardLis类继承了KeyListener类,采取响应键盘事件的方法,每次执行周期时会读取KeyPressed()函数中需执行的代码。本程序为坦克定义了4个方向(上下左右),先定位坦克的初始方向。根据按键状态确定坦克的方向是用key pressed ()这个方法来实现的。其中定义了x轴和y轴,按下A键,横坐标减少相应的值,按下D横坐标增加相应的值,按下W键纵坐标减少相应的值,而按下S键纵坐标增加相应的值,具体的值根据坦克的等级而定。5本游戏
38、共设为三关,随着关数的递增,每关的坦克数量也会增加,也就是说游戏的难度会逐渐加大,敌军坦克分批出现在屏幕上,每批五个,在程序中定义变量flag用作标志,用来控制每关应该出现多少批,每歼灭敌军一批坦克,就再增加五个并且flag自增,每关的自增的次数不一样,自增的次数决定了坦克的批数,每一关过到规定的批数时就通关,如果当前是最后一关并全歼敌军,那么就显示you win 的画面,游戏也随之结束,如图3-6所示图3-6 游戏通关游戏的每一关的敌军坦克数量都不一样,随着关数的增加,敌军坦克的数量也在不断增加,每一关结束时都判断当前是否处于最后一关,如果是则显示YOU WIN的字样,如果不是则自动转到下一
39、关继续游戏,直到最后一关。如果玩家在任何一关不辛阵亡,则游戏也结束,只不过显示的是GAME OVER的字样。6为了增加游戏的趣味性,游戏过程中会随机出现奖励物品,游戏中设置了三种奖励物品,当坦克的坐标和这些物品的坐标重合时,坦克就可以捡到这些物品,奖励出现与消失如图3-7所示图3-7奖励出现与消失游戏中设置了奖励道具,当count的值等于100时,就会在屏幕上随机出现一个奖励道具,每个道具都会有自己的生命值,定义道具生命值life为100,从道具刚出现时,life就做自减操作,当life的值为0时,道具就从屏幕上消失,在道具消失前如果坦克捡到道具,坦克就会有相应的变化。其中道具有三种,生命坦克
40、、手枪、炸弹。玩家捡到生命坦克时,生命值会增加;敌军捡到生命坦克时,我方坦克生命值减少。双方坦克捡到手枪时,坦克速度都会增加,子弹的威力也会增加。我方坦克捡到炸弹时,敌军就会有一辆坦克爆炸,反之亦然。7用文件保存玩家击毁敌军坦克的数量如图3-8所示图3-8保存击毁敌军数量每一关击毁多少量敌军坦克都以文件的形式保存在record中,这样便于统计玩家的最好成绩,这样增加了游戏的挑战性8用文件保存屏幕上所有的元素坐标如图3-9所示图3-9保存屏幕上所有元素坐标从当前关卡退出游戏时,屏幕上所有元素的坐标都以文件形式的保存起来,这样便于一次可以继续本次退出的位置,进一步增加了游戏的友好性。9读取文件中的
41、信息如图3-10所示图3-10读取文件中的信息Record是以字节为基本单位来存放的,所以所有要写入record的数据都必须先将其转为字节才能写入,从record所读出来的数据也是字节,必须将其转换为原先写入时的数据类型才有意义。3.4本章小结本章主介要绍了游戏的结构,即游戏的主成模块,以及游戏中主要功能的算法设计,通过对每个功能的分析和设计最终完成了整个游戏的设计。游戏开发过程中遇到很多困难,但只要专心,坚持,一切困难都会解决的。第4章 游戏详细设计4.1 游戏功能设计游戏中敌我双方坦克均可完成射击,开动的功能,但己方坦克的运行是通过键盘响应事件控制,而敌方坦克是根据设定相应的休眠周期来控制
42、运行的。下面是对本系统的主要功能模块的功能进行介绍1、我方坦克的功能为了满足游戏的友好性,我方坦克必须能够射击和移动,只有通过射击才能击败敌军,也只有移动才能躲避敌军的子弹和吃到奖励的物品,这样才能达到游戏的真正的目的。我方坦克的射击和移动都是通过响应键盘事件来实现的,在玩家的操纵下向敌军发动进攻。2、敌方坦克的功能敌军能够移动和发射子弹,但他们的移动和射击都是随机的,并且不需要玩家的操纵,它们是通过线程设定相应的休眠周期来控制移动和射击,敌军会向四个不同的方向移动特定的步数和射击,其中方向是通过随机函数生成的。3、敌军子弹敌军子弹也被设计成一个线程,敌军每隔一段时间就会发射子弹,子弹也设定了
43、休眠周期来控制自身的移动,当子弹击中墙时就会出现爆炸效果,子弹也随之消失,击中的墙如果是砖墙刚砖墙也消失,如果是铁墙则只有子弹消失,如果击中的是草和河流,则子弹可以通过,直到撞到边框才消失,如果击中我方坦克,程序会根据敌军坦克的等级做出相应的处理。4、我方子弹我方坦克子弹也是被设计成了一个线程,但是该线程的启动是在玩家敲击键盘的条件发生的,当玩家敲击键盘时线程启动,子弹的就会以一定的速度向坦克的枪口的方向移动,当子弹击中墙时就会出现爆炸效果,子弹也随之消失,击中的墙如果是砖墙刚砖墙也消失,如果是铁墙则只有子弹消失,如果击中的是草和河流,则子弹可以通过,直到撞到边框才消失,如果击中敌军坦克,程序
44、会根据敌军坦克的等级做出相应的处理。5、爆炸效果每一颗子弹在消失时都会出现爆炸,爆炸也是一个线程,只有当子弹消失才能启动该线程,并且为了防止屏幕刷新时效果不佳,为此采用了双缓冲技术,双缓冲主要就是去重写update方法,在更新窗体时把下一个要显示的图片整体的画到窗体上去。这样更增加了游戏的友好性和趣味性。6、奖励道具将每一个道具设置成一个线程,设置两个计数器count和life,其中life的初值设为100。count从游戏开始时就开始计数,用来控制道具的出现,当count的值为100时,采用随机函数在屏幕上随机产生一种道具。Life用来控制道具的消失,当道具出现时life就开始做自减操作,当
45、life的值为0时,道具就从屏幕上消失。在道具消失之前坦克可以拾捡道具,捡到道具后坦克会有相应的变化。4.2类模型图4-1设计类图Monitor主管着所有类之间的协调,决定何时死亡,何时转入下一关,及游戏进入界面、游戏结束后的Game over字样。它运行在独立的线程中,以恒定的频率刷新画面。刷新速度需大于30/秒才能使画面显示因人眼的暂时停留效应流畅运行,在Tank类中定义了所有敌军坦克的行为和属性,在PlayerTank类中定义了玩家的坦克的行为和属性。game over字样、生命值和关卡统计画面也都需在此主逻辑中建立相应对象。还需保存的变量有:游戏开始时间、敌人的总数、屏幕上敌人的数量,
46、游戏是否已成功结束或是否已死亡。由于敌人将非一次性出现在屏幕上,同时出现的数量应当受控制。所以在构造函数中,也应当分配对象的内存空间。创建坦克时,仅调用Tank(int x,int y)实现。在构造函数自己调用了线程的start后,程序将开始循环运行,直至跳出while的循环。每次循环中将检测是否死亡,屏幕上坦克的数量,是否该过关。KeyBoardLis类检测用户输入的keyPressed(KeyEvent e)函数中,当按方向键时,玩家坦克就将向不同的方向运行;当开炮时,就调用其shoot()函数,作出相应的行为。在绘图的过程中,除了要重绘坦克、地图、子弹外,还要在左下角和左上角处绘出一个生
47、命统计栏和关卡显示栏。构造函数中创建了每个坦克必须拥有的一颗子弹,这些子弹就将只跟随自己的坦克调动。4.3 玩家坦克的功能属性构造函数中需要将坦克方向设置为向上,因为刚出现时就是这样的状态。当开炮时,需要联系的还有自身坦克、地图。这些都由坦克传递给子弹。因为子弹是属于坦克的,它的属性需要跟当前的坦克保持一致。接着将子弹贴显示出来。最终调用其start()开始子弹自己的线程。子弹一旦开始运行,就脱离了当前坦克的控制,直到其生命周期终止。无论子弹是属于敌人还是玩家的,它都必须记录自己的来源和攻击的对象。在玩家坦克发射的子弹中,就必须将攻击对象设置为所有的敌人。这样,它才能有扫描的目标。但却提供必不可少的功能。他们可被外部调用,以取得生命值、死亡记数、重置位置。事实上,敌人坦克此时并没有阻碍玩家前进。这样的判断必须排除在考虑范围外。当然,在设置完成后,必须将将检测区域设置回原先的状态,否则敌人在往后自己的检测中将发生错误。4.4 敌人坦克的功能属性首先,Tank继承了Thread类。因为敌人的运行是自动的,需要有设定的程序让它可自己控制,而不像玩家坦克完全通过每次
©2010-2024 宁波自信网络信息技术有限公司 版权所有
客服电话:4008-655-100 投诉/维权电话:4009-655-100