基于Java的飞机大战游戏的设计与实现

攻城狮0829

发布日期: 2020-07-25 15:58:31 浏览量: 1318
评分:
star star star star star star star star star star_border
*转载请注明来自write-bug.com

摘 要

现如今,随着智能手机的兴起与普及,加上4G(the 4th Generation mobile communication ,第四代移动通信技术)网络的深入,越来越多的IT行业开始向手机行业转移重心。而手机行业中游戏方面的利润所占比重较大,并且手机游戏大多数则是由Java语言开发研制的。所以我想顺应时代发展,用学到的Java知识对游戏进行一次深入的了解与创作。

Java语言在我们大学学习中占了很大的比重,其优点甚多:面向对象,可靠,安全,多平台可移植,高性能,多线程等。面向对象是相对于c语言的面向过程来说的,在面向对象编程中,我们用Java去新建一个对象,调用其方法就能实现我们的目标,并不需要了解这个对象的方法的具体实现过程;Java的可靠安全特点体现Java不支持指针,禁止第三方访问,杜绝了外部风险。所以使用Java开发游戏,是一个正确的选择。

大学学习即将结束,在毕业之际,我想用我4年里学习的知识为自己编写一个属于自己的游戏——飞机大战游戏,为我的大学生活画上圆满的句号。

关键词:Java游戏;面向对象;可靠安全;多线程

Abstract

Nowadays, with the emergence and popularization of smart phones, plus 4 g (the 4 th Generation mobile communication, the fourth Generation mobile communication technology) the development of the Internet, more and more in the IT industry began to shift to the mobile phone industry center of gravity. Aspect of the game of the mobile phone industry profits account for a large proportion, and most mobile game is developed by Java language. So I want to keep up with the development of The Times, use Java knowledge for an in-depth understanding of the game and creation.

Java language learning in our universities accounted for a large proportion of its many advantages: Object-oriented, reliable, secure, multi-platform portable, high-performance, multi-threading. Object-oriented process-oriented with respect to the terms of the c language, object-oriented programming, specifically we use Java to create a new object, call its methods will be able to achieve our goal, we do not need to know the object’s method of implementation ; reliable safety features reflect Java Java does not support pointers to prohibit third-party access, to eliminate the external risk. Therefore, the use of Java development aircraft war game, is the right choice.

University coming to an end, on the occasion of the graduation, I want to use my four years studying knowledge and made themselves a game of their own - Aircraft war game for my college life painting satisfactory conclusion.

Keywords: Java game; object oriented; reliable and secure; multi thread

1 引言

1.1 项目背景

90后的我们,童年最开始接触电子游戏是在游戏厅,那时候的飞机大战游戏机前,往往人山人海,绚丽多彩的画面,带感操作让人沉醉不能自拔。再后来,珍珠港(Pearl Harbor),虎虎虎(Tora! Tora! Tora!)等空战电影中激烈的空战和飞机在天空中的英姿让我彻底爱上了空战,所以毕业设计我选择了与飞机战斗有关——基于Java的飞机大战游戏的设计与实现的毕业设计。

而选基于Java的飞机大战游戏的设计与实现为题,是对大学期间学到知识的一次实践运用,也是对自己大学四年学习成果的一次检验。

柏拉图:“游戏是一切幼子生活和能力跳跃需要而产生的有意识的模拟活动。”亚里士多德给游戏的定义是:“游戏是劳作后的休息和消遣,本身并带有任何目的性的一种行为活动。”可以说,游戏是一种一直存在的社会现象,有了人类就有了游戏,人类与游戏息息相关。游戏也随着人类的进步有了新的发展。

PC机刚开始普及的时候,游戏并不能被广泛接受。最主要的原因就是不能充分发挥PC机的性能,即游戏程序不能最大化使用PC机的硬件资源,导致PC机的早起游戏画面差,操作感僵硬,可玩度不高,所以不被人们所接受。但是随着切硅的技术的提升导致CPU性能的飞跃及Java语言的开发,游戏程序对硬件资源的利用率的提高,现在游戏的各个方面都有了质的飞跃。比如20世纪末,暴雪公司下的《星际争霸1》掀起全球星际流,其操作感和画面打击感及游戏可玩性都有很大的提升。当然,除了游戏本身的优秀质量以外,可以较广的支持不同的硬件设备的功能也不容忽视,高中低端PC机都有不错的流畅度。

而飞机大战类游戏中起步较早的还要数由日本公司Cyber Front研制并发行的雷电系列,该系列操作简单,节奏明快,因此,可以说成是飞机大战游戏类的经典之作。该系列下的《雷电3》在2016年中旬从PS2平台移植到PC机平台上后,更成为当时风靡一时的游戏。

《雷电3》一共有8个关卡,分别是病变的森林,玄武岩城市。岩石港湾,金色的沙漠,原子核工厂,小行星带,大型宇宙舰和地方总部。雷电3的关卡不多,而且流程比较短,所以主要还是以刷新分数上限,挑战操作极限的目的为主,考验玩家的手速和反应能力,是一款极为经典的游戏,即使过去了十几年,《雷电3》仍然广受欢迎,各大应用商店的点击下载量还是很高,衍生出来的游戏更是数不胜数。

1.2 国内外研究现状

Java语言经过多年的发展,已经十分成熟。Java语言称霸企业级应用这门多年的事实证明了这门语言适合开发各种项目。当Java语言的运行效率随着发展再次提升了一大截后,Java语言的一系列优势就更加明显的体现出来了,比如:语言严谨,高抽象,可读性强等。

对于游戏开发,由于涉及到各种复杂的问题情况,经常遇到新的问题,所以在开发过程中,需要进行对代码进行不断的修改添加,这就需要可以随时随地的修改代码。而Java具有虚拟机特性,Java游戏本身也可以用Java来写,例如,目前的BeanShell,Groovy和其他脚本语言可以很容易地,无缝地与Java语言的互动,我们可以通过脚本随时对游戏进行添加与删除,不必要重新开发某个模块。这是大大方便了Java游戏编程。

在游戏的发展中涉及到了大量的Java技术,某些技术现在已经淘汰,但是也有些技术一直在使用。如Sun公司较早推出了3D技术— Java3D,是一个高度封装的API,OpenGL和Direct 3D都是基于Java3D的,可以说是最有名的3D Java技术;Jogl函数则是opengl接口对Java的实现;lwjgl函数(light weight Java game library)是将游戏图形(opengl)、音效(openal)、控制输入集合为一,以成为Java界的directx(不是direct3d)而努力;joal函数则是Java对openal的一个绑定,是Java音效的一个解决方案;jinput函数是Java对非标准输入设备(游戏手柄,操纵杆)的解决方案; Project Wonderland是Sun开发的一个3d虚拟世界构建工具等。

由于VR(Virtual Reality)虚拟现实的发展,对游戏的发展影响巨大。科幻电影小说中的科幻游戏玩法有可能成为现实,未来游戏也许不需要鼠标键盘,只需要一个类似VRBox的头盔设备即可完成指令的输入与输出。

1.3 项目主要工作

本次项目的题目——基于Java的飞机大战游戏的设计与实现,主要目的是实现飞机大战这个游戏。期望结果:游戏无BUG(现在人们将在电脑系统或程序中,隐藏着的一些未被发现的缺陷或问题统称为BUG——漏洞),简单易上手,老少皆宜,让玩家“玩不释手”。

从游戏的玩法来说,主要就是我方飞机(Hero airplane)和敌方飞机(Enemy airplane)的对决,首先是游戏的开始界面与结束界面,然后就是我方飞机(Hero airplane)的移动方式(鼠标移动或者键盘移动,我打算选择鼠标移动,因为鼠标移动可以转移到手机上,现在大多数手机都没有键盘,基本靠手指滑动操作),接下来就是我方飞机(Hero airplane)子弹的生成,然后是敌方飞机(Enemy airplane)的出现坐标的选择,然后飞机与子弹防碰撞,飞机与飞机的防碰撞,最后是我方飞机(Hero airplane)与敌方飞机(Enemy airplane)的对战结果。

该游戏要满足以下功能性需求:

  • 游戏状态控制功能:游戏的状态控制包括运行、暂停、恢复及结束游戏,首先是游戏的开始页面,在游戏正在进行时,如果你有其他的事情又不想结束游戏你可以将鼠标移出游戏界面或者鼠标在游戏界面单击即可暂停游戏,当你的其他事情解决后你还可以选择恢复游戏,继续玩下去,当游戏结束时会显示游戏结束界面

  • 游戏难度的调整:玩家随着玩游戏的时间的增加,敌方飞机的数量会增加,出现的频率会有所提高,移动速度也会提高

  • 游戏界面绘画功能:在右上角显示游戏时间(游戏难度于时间成正比,即游戏时间越长难度越高),玩家游戏得分,与我方飞机生命值,游戏主屏用来显示玩家对我方飞机(Hero airplane)的控制与敌方飞机(Enemy airplane)的出现及移动的显示

  • 玩家游戏控制功能:玩家可以通过控制移动鼠标或者键盘来控制友机的移动

1.4 本文组织结构

本文的组织结构如下:

  • 第一部分介绍了本文的国内外背景

  • 第二部分介绍了开发游戏项目涉及到的软件平台与开发语言

  • 第三部分介绍了项目的需求分析

  • 第四部分介绍了项目各个模块的实现

  • 第五部分介绍了对软件测试的过程及结果,找到项目的优缺点

2 开发平台与开发技术

本章主要介绍软件开发平台如何选择。本软件涉及到的开发平台是IntelliJ IDEA,开发技术是Java技术。下面将会介绍一下选择IntelliJ IDEA的理由。

2.1 IntelliJ IDEA简介

IntelliJ IDEA是一个Java的 集成开发环境(IDE),用于开发各种项目的计算机软件。它是由JetBrains公司(原名的IntelliJ)开发的,个人版被Apache 2授权许可,商业版则是作为专业版,可以用来进行大型的商业开发。

IntelliJ IDEA的第一个版本发布于2001年1月,并且是第一个具有先进的代码导航和一个代码重构的综合能力的Java IDE。

IntelliJ IDEA对于系统的要求:微软的Windows 10/8/7 / Vista/ 2003 / XP(incl.64位),最少1 GB内存,2 GB RAM(推荐),300 MB硬盘空间+至少1 GB的高速缓存,1024×768的最小屏幕分辨率。

IntelliJ IDEA特点:

  • 编码提示:IDE可以进行代码提示,比如:结合上下文对当前代码进行补充;代码导航,可以快速定义到某个声明过的类;代码错误提示,对于代码错误的地方进行提示并且提供有效的解决方案

  • 内置工具和整合:IDE提供了构建与打包工具,如grunt , bower , gradle , 和 SBT 。它支持各个版本的控制系统,如 GIT , Mercurial , Perforce , and SVN 。可以直接从IDE对SQL Server,ORACLE,PostgreSQL和MySQL数据库进行访问

  • 各种各样的插件系统:IntelliJ IDEA支持插件,通过插件可以对IDE添加额外的功能。无论是从IntelliJ IDEA的插件库网站或通过IDE的内置插件,都可以进行搜索插件和插件的安装。目前的IntelliJ IDEA个人版则拥有1495个可用的插件,其中IDE的旗舰版则拥有1626个可用的内置插件

2.2 IntelliJ IDEA与Eclipse 的比较

我们大学学习中,对于Java的开发工具一般都是选择 Eclipse,MyEclipse开发工具。Eclipse是Sun公司自己开发的Java开发工具,优点在于简洁没有插件,用户可以根据自己的需求自己寻找安装合适的插件,同时这也是它的缺点,没有提供插件,某些开发就会让人感觉不方便,并且插件都是个人开发,并不是适合所有人。MyEclipse则需要收费(虽然网上有破解版,但是并不提倡,支持正版从你我做起),它实际上是将eclipse和其他常用插件集成在一起的一个庞大开发工具,优势就是常用插件齐全,不用自行下载安装,当然支持自己扩展,劣势就是插件太多导致软件繁重,运行时占用系统太多资源,当然他是收费的(对于学生来说这个是致命的)。

IntelliJ IDEA更为优秀的原因是:IntelliJ IDEA更为智能,更贴合用户。以下进行详细说明。

  • 调试:作为调试过程的一部分,我们通常希望选中一些表达式来查看它的值。在Eclipse中,你需要选择这种表达,并且准确选择整个表达式是很重要的,否则在Eclipse中无法评估它。在IntelliJ IDEA中,你只需按下有关快捷键,即可看到表达式的值

  • 自动完成:自动完成功能的好坏是区分任何IDE的标杆。在这方面的感觉的背景下,IntelliJ IDEA则有一个定性的优势。IntelliJ IDEA不等待任何按键,比如,当你输入一个方法函数是,它立刻会明白方法函数希望将某个定义过的类作为第二个参数,这时会有一个静态变量在类名处呈现可见状态。对于用户来说,提供建议和想法是一个的确不错的做法。但是Eclipse做不到,Eclipse只能理解你当前输入的字符,并不能与前边的联系起来

  • 重构:专业编程人员如果利用IntelliJ IDEA的IDE提供的重构将会事半功倍。所有IDE提供了一个用处非常大的重构。但话又说回来,IDEA的重构是非常智能的。它知道你想要什么,并提供了大多数情况下适用的不同的建议选项

如果我们选择一个Java IDE作为开发工具,那么IntelliJ IDEA肯定比Eclipse的更好。这不只是一个个人品味的问题。客观来说IDEA的确是第一选择,它可以让你快速,方便地编写和修改代码,建议适当的函数,提供适当的方法。它不要求你准确选择表达式,但会猜测你想要做什么。

2.3 Java

Java是一个通用计算机编程语言,是并发的,类型,面向对象的。它的目的是让应用程序开发者“一次编写,到处运行”,也就是说Java可以在任何设备上开发,也可以在任何装有Java虚拟机(JVM)设备上运行,而无需再次编译。

Java应用程序通常被编译成字节码可以在任何装有Java虚拟机上(JVM)的计算机体系结构上运行。截至2016年,Java是最流行的编程语言之一,特别是对于客户端,服务器的Web应用程序,有报道称有900万开发者在使用Java语言进行开发。Java是由詹姆斯•高斯林在Sun Microsystems(这已经被甲骨文公司收购)创造的,并于1995年发布,作为Sun Microsystems的Java平台的核心组件开发,Java语言多从C和C ++中语法派生出来的。

最初有Sun公司对参考实现Java的编译器,虚拟机和类库下发专用许可证。截至2007年5月,按照Java社区进程的规章制度,SunRelicensed GNU下大部分的Java技术都在通用公共许可证下。其他人也开发了Java软件替代和实现了Sun公司下的一些技术,如GNU Java编译器(字节码编译),GNU Classpath(标准库)和IcedTea项目的Web(浏览器插件小程序)。

目前(2016年6月)Java的最新版本是第8个版本,这是目前Oracle支持免费的唯一版本,单早期版本都是由甲骨文等公司在商业基础上的支持的。

詹姆斯•高斯林,迈克•谢里登和帕特里克•诺顿启动Java语言项目是在在1991年6月,Java最初设计则是用于交互式电视,但它相对于在当时的有线数字电视产业过于超前。后来该项目又由名称Green并最终改名的Java,从Java咖啡(来自爪哇的一种咖啡)得名。高斯林设计的Java与C / C ++ 语法风格相似,系统和应用程序的程序员会发现二者有很大程度的相似点。

Sun Microsystems公司在1995年发布了第一个公开的实行版本Java 1.0,它承诺“一次编写,到处运行”(WORA)。其相当安全,并设有配置的安全标准,它对网络和文件实行访问限制。主流浏览器很快将Java程序的能力纳入到网页中运行,导致Java迅速走红,然而大多数是外面的浏览器,但是这并不是原来的计划,所以在2016年1月,甲骨文宣布,基于JDK 9 Java运行时环境将不再支持浏览器插件。Java 1.0编译器由亚瑟•范•霍夫重新用Java编写,严格遵守Java 1.0语言的规范。Java 2,新的版本可以在不同类型的平台搭建不同的配置。 J2EE包括面向企业级应用的技术和通常在服务器环境中运行的API,而J2ME对API功能的移动应用进行了优化,桌面版改名为J2SE。在2006年,出于营销目的,将新版本J2分别命名为Java EE,Java ME,和Java SE。

1997年,Sun Microsystems加入ISO/ IEC JTC 1标准组织,后来的ECMA国际组织要求Java正式化,但它很快就从组织中退出了。但Java仍然是一个事实上的标准,控制Java社区的标准。2006年11月13日,Sun在GNU通用公共许可证(GPL)条款支持下将其Java虚拟机(JVM)公布于众。2007年5月8日,Sun完成了开源的所有过程,在自由软件/开源分发条款下放出了它所有的JVM的核心代码,除了从Sun未持有版权的小部分代码。2010年4月2日,詹姆斯•高斯林(Java的主要创始人)从甲骨文公司辞职。

3 可行性研究

可行性研究顾名思义,研究其的可行性。可行性研究是项目开发之前的重要阶段。在软件开发实践中,软件开发人员或者用户对市场的了解不充分,对技术的掌握不好,对进行开发的各项风险评估不足等因素,有些问题不能再预期下得到解决,造成不可预估的损失,为了避免盲目的软件开发和不必要的损失,相关人员需要对开发特定软件项目的可行性进行研究,结合资金、时间和环境等各方面的制约条件,对该软件产品是否能够解决存在的问题,是否能够带来预期的效果和价值做出评估。

3.1 技术可行性

现在开发游戏的语言一般都是Java语言,为了保证开发出来的游戏可以在手机、Web浏览器、PC客户端等平台使用,所以就要求开发语言可以在多平台移植,而Java语言刚好符合这个特性。开发工具IntelliJ IDEA可以下载并且可以免费使用,Java的编译工具JDK也可以在Sun官网上直接下载安装,其过程十分简单。

3.2 经济可行性

配置较低的电脑也能进行Java游戏的开发,一台电脑就行,开发成本低。由于Java具有跨平台以及一次编译,到处运行的特点,开发出来的游戏可以放到各大游戏平台上发售,玩家可以在电脑,浏览器,手机等各种平台运行。而且软件维护简单,实用性强,一次开发使用,即可长久使用,当软件满足不了用户需求时,只需对用户的需求进行添加即可。

3.3 操作可行性

本游戏操作简单,在电脑和浏览器上可以用鼠标键盘操作,在手机上可以用手触摸屏幕运行。

3.4用户使用可行性

本软件操作简单,对用户的要求,不需要多强技术能力。

3.5 法律可行性

信息产业部已将游戏通用引擎研究及示范产品纳入国家“863计划”,这是中国首次将游戏技术纳入国家科技计划当中。

4 需求分析

需求分析是对即将开发的系统确定一个完整的,准确的要求。需求分析的结果是否完美解决了用户的问题,将直接影响到后面的进程,并影响到设计结果是否能让用户接受。软件需求分析对软件系统提出了清楚、准确、全面而具体的要求,是对软件使用者意图不断进行揭示与准确判断的过程,它并不考虑系统的具体实现,而是严密地、完整地描述了软件系统应该做些什么的一种过程。

4.1 系统需求概述

飞机大战主要需要我方飞机和敌方飞机,还有子弹,特殊nPC,开始背景,结束背景,以及背景音乐。我方飞机可以随意移动,敌方飞机无规律出现。游戏玩家通过鼠标移动控制飞机移动,我方飞机在游戏开始时就一直能发射子弹,当我方子弹碰到敌方飞机时,敌方飞机消失。当玩家飞机碰到敌方子弹时,生命值减一,直到玩家飞机生命值为一时,游戏结束。

基于Java的飞机大战游戏的设计与实现有以下几个模块:

  • 游戏状态控制功能模块

  • 游戏难度的调整模块

  • 游戏界面绘画功能模块

  • 玩家游戏控制功能模块

4.2 功能模块设计

4.2.1 游戏状态控制功能模块

游戏的状态控制包括运行及结束游戏,首先进入游戏的开始页面,在游戏进行时,玩家必须躲避或者击落敌方飞机,玩家飞机的生命值降低为0的时候游戏就会结束,弹出游戏结束界面。

4.2.2 游戏难度的调整模块

玩家玩的时间越长游戏的难度越高,敌方飞机的数量越多、敌方飞机出现的频率越高,玩家保证飞机的存活的难度越高,操作难度相应也高。

4.2.3 游戏界面绘画功能模块

左上角会显示玩家飞机当前生命值,游戏时间,当前分数,其他地方用来输出玩家对我方飞机的控制与敌方飞机的动作显示。

4.2.4 玩家游戏控制功能模块

玩家可以通过控制鼠标或者键盘来控制方飞机(Hero airplane)的移动。

4.3 游戏难点分析

4.3.1 绘图美化

清新靓丽的游戏界面将给用户带来愉悦的美感。因此,在这个游戏中,主要参考原始的游戏画面,敌我飞机的形象也应该是美丽的。

4.3.2 多线程技术的实现

应用程序线程机制的基石,实现了游戏,游戏的刷架的控制,装上各种角色的资源和背景(如飞机,机友)的要求,以实现整个游戏实现自动控制线程 控制。

4.3.3 防碰撞问题的解决

例如,敌方飞机与玩家飞机防碰撞,敌方飞机与玩家飞机防碰撞,等等。防碰撞检测技术实现在不同情况下,有不同的防碰撞检测方法。

4.3.4 动画的实现

用图片的阵列,动画切片变换形成。图像阵列,千变万化的图像画在画布标,使动画,这是一个图像的形成阵列。使用切片来实现动画,所有的帧都放置在相同的图像中,以达到爆炸的效果。

5 飞机大战功能实现

5.1 模型图

5. 2 软件功能模块

5.3 游戏首页的实现

5.3.1 界面实现

飞机大战的界面如图1-3所示。

5.3.2 流程图

游戏开始的流程图如图1-4所示。

5.3.3 核心代码

游戏初始化代码

  1. \*
  2. * 写于320日,主要目的:完成游戏的初始化过程
  3. *\
  4. public final void paint(Graphics g) {
  5. g.setColor(this.bgColor);
  6. g.fillRect(x, y, width, height);
  7. g.setColor(this.fgColor);
  8. g.drawRect(x, y, width, height);
  9. this.paintBoxContents(g);
  10. }
  11. private void paintBlock(int x, int y, int blockType, Graphics g) {
  12. int blockX = this.boardX + (this.blockSize * x);
  13. IntblockY=this.boardY+(this.blockSize*(y-TetrisConstants.TOP_VISIBLE_ROW));
  14. if(TetrisConstants.BLOCK_EMPTY != blockType) {
  15. g.setColor(TetrisConstants.COLOR_BLACK);
  16. g.fillRect(blockX + 1, blockY + 1, this.blockSize - 1, this.blockSize - 1);
  17. this.setColor(blockType, g);
  18. g.fillRect(blockX, blockY, this.blockSize - 1, this.blockSize - 1);
  19. }
  20. else {
  21. g.setColor(TetrisConstants.COLOR_WHITE);
  22. g.fillRect(blockX, blockY, this.blockSize, this.blockSize);
  23. }
  24. }

5.4 游戏开始模块的实现

5.4.1 界面实现

飞机大战的开始界面如图1-5所示。

5.4.2 流程图

流程图如图1-6所示。

5.4.3 核心代码

游戏开始模块的功能代码

  1. \*
  2. * 写于327日,主要目的:完成游戏的开始界面
  3. *\
  4. private int clearCompletedRows(TetrisPiece piece) {
  5. TetrisBoard board = this.getBoard();
  6. for(int i = 0; i < TetrisConstants.FOUR_BLOCKS; i++) {
  7. int rowY = piece.getBlockY(i);
  8. if(board.checkRowCompleted(rowY)) {
  9. this.markRowCompleted(rowY, true);
  10. }
  11. }
  12. int numClearedRows = 0;
  13. for(int y = TetrisConstants.HEIGHT - 1; y >= 0; y--) {
  14. if(numClearedRows > 0) {
  15. board.dropRow(y, numClearedRows);
  16. }
  17. if(this.isRowCompleted(y)) {
  18. numClearedRows++;
  19. this.markRowCompleted(y, false);
  20. }
  21. }
  22. for(int i = 0; i < numClearedRows; i++) {
  23. board.clearRow(i);
  24. }
  25. return numClearedRows;
  26. }

5.5 发射子弹模块的实现

5.5.1 界面实现

发射子弹界面实现如图1-7所示。

5.5.2 流程图

流程图如图1-8所示。

5.5.3 核心代码

发射子弹实现代码

  1. \*
  2. * 写于45日,主要目的:完成游戏的子弹的自动发射
  3. *\
  4. public void rotate(int pivotX, int pivotY, boolean rotateDirection) {
  5. if(TetrisConstants.ROTATION_TYPE_TOGGLE == this.rotationType) {
  6. // 如果翻转类型为TOGGLE
  7. rotateDirection = this.rotationToggle; //判断翻转方向
  8. this.rotationToggle = !this.rotationToggle; // 如果与canRotate匹配,中心点方块将被使用
  9. }
  10. // 重构四个小块,每个都转动
  11. for(int i = 0; i < TetrisConstants.FOUR_BLOCKS; i++) {
  12. int blockX = this.getBlockX(i);
  13. int blockY = this.getBlockY(i);
  14. // 左旋转:交换x和y坐标,x坐标取反
  15. // 右旋转:交换x和以坐标,y坐标取反
  16. int dx = blockY - pivotY;
  17. int dy = blockX - pivotX;
  18. if(rotateDirection) {
  19. // 如向左旋转
  20. dx *= -1;
  21. } else {
  22. // 如向右旋转
  23. dy *= -1;
  24. }
  25. int rotateX = pivotX + dx;
  26. int rotateY = pivotY + dy;
  27. this.setBlockCoords(i, rotateX, rotateY);//得到翻转后的新坐标
  28. }
  29. }

选中敌机目标后,开始发射子弹。在TetrisBoard.Java中的checkRowCompleted()方法实现了此功能,其代码如下:

  1. public boolean checkRowCompleted(int rowY) {
  2. for(int x = 0; x < TetrisConstants.WIDTH; x++) {
  3. if(TetrisConstants.BLOCK_EMPTY == this.getBlockType(x, rowY)) {
  4. // 选中目标,发射子弹
  5. return false;
  6. }
  7. }
  8. return true;
  9. }

当击中敌机后,积分就会有所变化,计算并显示出用户当前的分数。同时等待玩家键入数字,选择游戏难度开始新的游戏。其实现由init()方法控制,其代码如下:

  1. \*
  2. * 写于412日,主要目的:完成游戏的难度选择
  3. *\
  4. private void init() {
  5. this.board = new TetrisBoard();
  6. this.gameCanvas = new TetrisCanvas(this);
  7. this.activePiece = new TetrisPiece();
  8. this.completedRows = new boolean[TetrisConstants.HEIGHT]; //初始化数组
  9. this.hiScore = this.openAndReadHiScore();
  10. this.nextPieceType = TetrisConstants.UNINITIALIZED;
  11. this.rand = new Random();
  12. // 设置exit/pause/resume命令
  13. this.setuPCommands();
  14. this.gameCanvas.addCommand(this.exitCommand);
  15. // 显示title屏
  16. this.setGameState(TetrisConstants.TITLE_STATE);
  17. }

5.6 积分模块的实现

5.6.1 界面的实现

飞机大战积分模块界面如图1-8所示。

5.6.2 核心代码

积分板实现代码如下:

  1. \*
  2. * 写于416日,主要目的:完成游戏的积分模块
  3. *\
  4. public void drawCount(Graphics g){
  5. g.setColor(Color.white);
  6. Font font = new Font("宋体", 1, 20);
  7. g.setFont(font);
  8. g.drawString("积分:" + this.score, 0, 470);
  9. }

实现积分的增长

  1. if (burst != null)
  2. burst.draw(g_off);
  3. for (int i = 0; i < list.size(); i++) {
  4. Role chara1 = (Role) list.get(i);
  5. if (chara1.isDead()) {
  6. if (chara1 instanceof Enemy)
  7. {
  8. chara1.drawBurst(g_off);
  9. this.battle.score++;
  10. }
  11. list.remove(i);
  12. }
  13. }

全屏爆炸时,计算炸死几个敌人增长分数

  1. if(GamePanel.skillCount>0){
  2. for (int i = 0; i < GamePanel.list.size(); i++) {
  3. Role chara1 = (Role) GamePanel.list.get(i);
  4. if(!(chara1 instanceof Battle) && chara1.x>0 && chara1.y>0
  5. && !(chara1 instanceof BossA) && !(chara1 instanceof BossB)
  6. && !(chara1 instanceof BossC)){
  7. GamePanel.list.remove(i);
  8. if(chara1 instanceof Enemy){
  9. this.score++;
  10. }

实现积分的输出

  1. private void gameOver() {
  2. GamePanel.skillCount = 10;
  3. if (Key.enter) {
  4. gameMode = 12;
  5. stage = 1;
  6. } else {
  7. g_off.setColor(Color.white);
  8. Font font = new Font("黑体", 1, 28);
  9. g_off.setFont(font);
  10. FontMetrics fontMetrics = getFontMetrics(font);
  11. g_off.drawString("Game Over", (450 - fontMetrics.stringWidth("Game Over")) / 2, (500 + fontMetrics.getHeight()) / 2 - 50);
  12. String score = "Score: " + this.battle.score;
  13. g_off.drawString(score, (450 - fontMetrics.stringWidth(score)) / 2, (500 + fontMetrics.getHeight()) / 2 - 20);
  14. if (15 <= current % 50)
  15. g_off.drawString("请按 回车", (450 - fontMetrics.stringWidth("请按 回车")) / 2,(500 + fontMetrics.getHeight()) / 2 + 100);
  16. }
  17. }

5.7 防碰撞逻辑

判断飞机是否中弹的逻辑非常简单就是在绘制飞机与子弹的时候判断两个图片是否存在重合的部分,如果存在则玩家生命值减一,之后将中弹飞机从飞机队列中删除,子弹同样的处理。

5.7.1 核心代码

防碰撞逻辑核心代码

  1. \*
  2. * 写于424日,主要目的:完成游戏的防碰撞模块
  3. *\
  4. public boolean checkHit(Role chara) {
  5. if ((chara instanceof EnemyA) || (chara instanceof EnemyB)|| (chara instanceof EnemyC) || (chara instanceof EnemyShot)) {
  6. if ((x + WIDTH) - 14F > chara.x && x + 14F < chara.x + chara.WIDTH && (y + HEIGHT) - 12F > chara.y && y + 12F < chara.y + chara.HEIGHT) {
  7. //如果碰到敌人,敌人死亡
  8. chara.dead();
  9. //如果碰到子弹血量减少
  10. if (chara instanceof EnemyBeam){
  11. power--;
  12. }
  13. power -= 50;
  14. if (power <= 0) {
  15. dead();
  16. //绘制爆炸图片
  17. GamePanel.burst = new Burst(x, y);
  18. }
  19. return true;
  20. }

5.8 游戏操作的实现

本游戏操作采用鼠标/键盘的移动来实现玩家飞机的移动。

5.8.1 核心代码

游戏操作实现代码

  1. \*
  2. * 写于423日,主要目的:完成游戏的游戏操作
  3. *\
  4. public void move() {
  5. oldx = x;
  6. oldy = y;
  7. if (Key.left) {
  8. if (Key.xkey)
  9. x -= (double) speed / 4D;
  10. else
  11. x -= speed;
  12. if (x <= 0.0F)
  13. x = 0.0F;
  14. }
  15. if (Key.right) {
  16. if (Key.xkey)
  17. x += (double) speed / 4D;
  18. else
  19. x += speed;
  20. if (x + WIDTH >= (float) app.getWidth())
  21. x = (float) app.getWidth() - WIDTH;
  22. }
  23. if (Key.down) {
  24. if (Key.xkey)
  25. y += (double) speed / 4D;
  26. else
  27. y += speed;
  28. if (y + HEIGHT >= (float) app.getHeight())
  29. y = (float) app.getHeight() - HEIGHT;
  30. }
  31. if (Key.up) {
  32. if (Key.xkey)
  33. y -= (double) speed / 4D;
  34. else
  35. y -= speed;
  36. if (y <= 0.0F)
  37. y = 0.0F;
  38. }

5.9 特殊NPC蜜蜂

  1. \*
  2. * 写于430日,主要目的:完成游戏的特殊NPC的添加
  3. *\
  4. package com.tarena.fly;
  5. import Java.util.Random;
  6. /**蜜蜂*/
  7. public class Bee extends FlyingObject implements Award{
  8. private int xSpeed=1;//x坐标移动速度
  9. private int ySpeed=2;//y坐标移动速度
  10. private int awardType;//奖励类型
  11. /**初始化数据*/
  12. public Bee(){
  13. this.image=ShootGame.bee;
  14. width=image.getWidth();
  15. height=image.getHeight();
  16. y=-height;
  17. Random rand=new Random();
  18. x=rand.nextInt(ShootGame.WIDTH-width);
  19. awardType=rand.nextInt(2);//初始化时给奖励
  20. }
  21. /**获得奖励类型*/
  22. public int getType(){
  23. return awardType;
  24. }
  25. /**越界处理*/
  26. @Override
  27. public boolean outOfBounds(){
  28. return y>ShootGame.HEIGHT;
  29. }
  30. /**移动,可斜着飞*/
  31. @Override
  32. public void step(){
  33. x+=xSpeed;
  34. y+=ySpeed;
  35. if(x>ShootGame.WIDTH-width){
  36. xSpeed=-1;
  37. }
  38. if(x<0){
  39. xSpeed=1;
  40. }
  41. }
  42. }

6 系统测试

测试是处在开发阶段的最后部分,是保证软件质量的重要手段。软件测试是一个软件应用程序或一个所谓的条件处理和评估在控制条件(包括正常条件和非正常条件)下操作并评价其结果的过程。软件测试过程中应当故意诱导程序发生错误,正常情况下它虽然不应该存在,但是不确定它有可能在任何时候出现。从本质上说,软件测试是“探测”发现“探针”的问题。

6.1 测试的定义及其重要性

6.1.1 测试的定义

软件测试是一项为了给利益相关方提供有关产品质量或者是正在测试的服务的信息而进行调查的过程。软件测试也可以提供一个客观,独立的视角来看待软件,以便让企业知晓并理解软件实现过程中可能存在的风险。软件测试技术是一种带着为了发现软件或者程序的BUG(错误或者其他的缺陷)的态度来运行一个程序或者应用的过程。

软件测试涉及一个软件组件或系统组件的执行,以评估所关注的对象的一个或多个属性。在一般情况下,这些属性表明该组件或系统被测试的程度:

  • 满足其设计和发展的需要

  • 对各种输入进行正确的相应

  • 在用户可容忍的时间内实现其功能

  • 所有功能都能满足使用

  • 可以在预定的环境中完美安装并运行

  • 可以实现如其利益相关者所期望的正常结果

由于即使对简单的软件组件所进行的测试数量都是数量巨大的,所有的软件测试都运用一些策略去挑选那些无论在时间是对资源都是合适的测试用例。其造成的结果是,软件测试通常(但也不排除其他情况)尝试着带着为了发现软件BUG(错误或者其他的缺陷)的态度来运行一个程序或者应用。当BUG不被解决时,需要反复进行软件测试的工作。它可能解决其他更深层次的BUG,但也可能会使得程序出现新的BUG。

软件测试可以为用户和赞助商提供有关软件质量和可能存在的风险等级的信息。当然,这种信息是相对客观,独立的。

软件测试可以为用户和赞助商提供有关软件质量和可能存在的风险等级的信息。当然,这种信息是相对客观,独立的。例如,例如,在软件开发的不同阶段,大部分的测试工作总是在系统需求已经被明确定义时才开始的,然后在测试过程中实现。与此相反,Agile(敏捷开发,是一种对于经常被用于在线应用程序的开发模型的涵盖性术语)方法下,需求,分析,编程和测试经常同时进行。

6.1.2 测试的重要性

尽管测试可以在某些特定假设的前提下,确定了软件的正确性,但是测试还是不能找出软件中所有的缺陷。相反,有些人也许可能会注意到这些问题,它对产品的申明和行为进行评论或与其他产品对照比较,看是否违反了Oracle公司的原则。这些Oracle的原则可能包括(但不限于)规范,合同,类似的产品,过去同一版本的产品,预期的计划或预期的目的,用户或客户的期望,相关标准,适用法律或其他标准。

测试的主要目的是检测软件故障,使得缺陷被发现并且纠正。测试不能证明在所有条件下,软件或者程序都能正常的运行,它只能检测到在某种特定情况下,软件或者程序不能正常工作。软件测试的范围通常包括代码的检查以及在各种环境和条件的代码的执行情况以及检查的代码功能:什么是它应该做的,如何让它做需要它做的。在软件开发的当前环境中,检测团队可以独立于开发团队之外。从软件测试得出的信息可被用来校正开发软件的过程,防止出现无法挽回的错误。

每个软件产品都有一些特定的用户。例如,用户对视频游戏软件和银行软件有完全不同的看法。因此,当一个组织开发或以其他方式投资一个软件产品时,软件测试可以评估它的最终用户,购买者或者其它利益相关者是否会接受该软件产品。软件测试是试图评估这一信息的过程。

并非所有的软件缺陷是由编码错误引起的。往往因为一些错误会付出巨额的代价,这些错误常见的原因之一就是出现在需求方面,例如,程序员没有完全理解需求,从而导程序设计开发时与用户出现分歧。需求的差距往往来自非功能性需求,如可测试性,可扩展性,可维护性,可用性,性能和安全性。

软件故障,在下述情况是发生:程序员犯了一个错误(失误),这将导致在本软件的源代码中出现一个缺陷(故障,错误),如果执行这种有缺陷的代码,在某些情况下,系统会产生提示出现错误,从而引起了故障。当然并非所有缺陷都将导致故障的发生。例如,死代码缺陷永远不会导致故障。当环境变化时的缺陷可以成为一个失败的关键。这些在环境变化的例子中包括软件在新的计算机硬件平台运行,源代码的改变,或用不同软件进行交互,一个简单的缺陷可能导致一个软件的失败。

软件测试的基本问题是:即使一个简单的产品,用所有的输入组合和先决条件(初始状态)进行测试是不可行的。这意味着一个软件产品的缺陷数量可以是非常巨大的,而且很多缺陷是难以在测试中发现的。更重要的是,非功能性的属性(它应该做什么与它如何做)如 可用性,可扩展性,性能,兼容性,可靠性是高度主观的; 一个人可能接受其中一个属性的价值却不能认同另外一个。

软件开发人员无法测试所有的东西(所有的输入组合和先决条件),但他们可以使用组合测试设计,来确定他们想要覆盖测试所需的最小数量。组合测试设计,使用户用很少的测试用例能够获得很大的测试覆盖率。他们可以使用组合测试设计的方法来构建他们的测试用例,是他们的测试速度与测试深度有很大的提升。

6.2 测试方法

软件测试可用许多方法。回归,演练,或校对被称为静态测试,而实际执行程序代码与给定的测试案例被称为动态测试。静态测试往往是隐含的,如校对,再加上编程工具/文本编辑器查看源代码结构或编译器(预编译器)检查语法和数据流的静态程序分析。当程序在运行时动态测试发生。动态测试可以在程序100%完成前开始测试,以便测试特定的代码,也可以应用于分散的功能或者模块中。这个典型的技术使用驱动程序或在调试环境下执行。

程序测试的主要方法分为两大类:白盒测试和黑盒测试。

白盒测试(也称为清晰盒测试,玻璃盒测试,透明盒测试和结构测试)可以观察源代码,测试内部结构或程序的运作,而不是暴露终端用户的功能。白盒测试系统,用于设计测试用例,以及透视内部编程的技巧。测试器通过选择路径输入代码来确定相应的输出。这类似于在测试一个电路节点,例如:电路测试(ICT)。

而白盒测试可以应用于单元测试,集成测试和系统测试的软件流程,但是它通常在单元级别进行的。它可以在集成单元和子系统之间的测试路径上进行系统级别的测试。虽然这种方法测试设计可以发现许多错误或问题,但是它可能无法规范检测到或遗漏需求分析未实现的部分。

在白盒测试中使用的技术包括:

  • API测试 -通过公共和私人的应用测试的API(应用程序编程接口)

  • 代码覆盖率 -创建测试,以满足代码覆盖率的一些标准(如:测试设计人员可以创建测试,以使程序中所有的语句至少执行一次)

  • 故障注入方法-有意引入故障来衡量测试策略的效果

  • 突变检测方法

  • 静态测试方法

代码覆盖工具可以评估任何方法,包括创建了一个完整的测试套件的黑盒测试方法。这允许软件团队可以很少对测试进行检查,只确保对最重要的一个系统的部分功能点进行检验即可。代码覆盖率常作为衡量测试好坏的指标,甚至用代码覆盖率来考核测试任务完成情况:

  • 功能覆盖,函数是否执行

  • 语句覆盖,语句是否执行

  • 判定覆盖,对程序中每个判定条件的真分支和假分支至少进行一次判定

100%的语句覆盖,确保所有的代码路径或分支(在以下方面控制流程)至少执行一次。这对于确保功能的正确有很大的帮助,但是对于相同代码有可能因为输入的不同而有不同的结果。

黑盒测试把软件作为一个“黑盒子”,具有审查的功能,而有关内部实现的任何细节都不清楚,也看不到其源代码。该测试人员只了解该软件的功能与作用,而不清楚它是如何具体实现的。黑盒测试方法包括:等价类划分,边界值分析,全局测试,状态表转移,决策表测试,模糊测试,基于模型的测试,用例测试,探索性测试和基于规范的测试。

基于规范型的测试旨在去测试软件关于适应性要求方面的功能。这种级别的测试通常需要测试人员提供全面的测试用例,然后只需验证其中一个给定的输入值,输出值(或行为),不管在测试用例中与期望结果是否相同。测试用例的选取是建立在规范和要求下的,也就是说,应用程序应该做什么。它使用的软件的外部描述,包括规格,要求,和设计以获取测试用例。这些测试虽然有时有用,有时无效,但是通常是有用的。

基于规范的测试可能只能检测其功能的有效性和正确性,但它不足以应对复杂或高风险的情况。

黑盒测试技术的一个优点是不需要专业的编程知识。即使编写程序的编程人员与测试人员有鸿沟一般的编程差距,但是测试人员总能从不同的方面给出相应的建设性意见。在另一方面,黑盒测试的过程可以被说成是“摸着石头过河。” 因为不需要检查程序的源代码,所以在某种情况下,测试人员需要写很多测试用例来检查程序,但是该程序只能被一种测试用例来测试或者只能测试程序的部分功能。

测试的这种方法可以应用到软件测试的各个方面,例如:单元测试,集成测试,系统测试和验收测试。它虽然不能包括测试过程中的所有流程,但是在单元测试中却保持着绝对的优势。

6.3 测试结果

软件评价是指软件在正式运行了一段时间之后,对它在功能上、技术上和经济上所进行的审核评价。针对本软件的评价如下:

  • 软件功能评价:根据这套软件开发前的目标,试运行完成后软件后,软件达到了预定的发展目标,在实际使用功能可满足用户的需求

  • 技术评价:该软件设计合理,功能达到预期目标,软件后运行稳定,可靠,安全,实用

  • 经济评价:在规定时间内,该软件完成后,软件分析,以确定软件的发展目标,符合设计要求,投入使用,为用户节省了大量的人力,物力和财力,提高科学管理水平

参考文献

[1] 杨大生, 陈忠. 基于Symbian平台飞机大战游戏设计[J]. 福建电脑, 2010(07):140-140

[2] 谢海军. 基于Java的手机游戏引擎的研究及实现[D]. 西南交通大学, 2007.

[3] 马鹏强. 基于J2ME的手机五子棋游戏设计与实现[D]. 电子科技大学, 2012.

[4] 周凤英, 文惺. Java游戏开发起步[J]. 电脑爱好者, 2003(14):116-116.,

[5] 陈立伟. 精通Java手机游戏与应用程序设计[M]. 中国青年出版社, 2005.

[6] 丁知平, 罗光华, 陈传起,等. 基于项目驱动的Java手机游戏开发教学方法的探讨[J]. 科技信息:科学教研, 2008(7):208-208.

[7] 陈小玉. 基才J2ME的Java手机游戏开发实例[J]. 电脑编程技巧与维护, 2005.

[8] Ross J M. Guiding students through programming puzzles: value and examples of Java game assignments.[J]. Acm Sigcse Bulletin, 2002, 34(4):94-98.

[9] Wang Y H, Wu I C, Jiang J Y. A portable AWT/Swing architecture for Java game development[J]. Software Practice & Experience, 2007, 37(7):727–745.

[10] Zhu Y. Design and implementation of a Java game applet[J]. Computer Science & Software Engineering, 2002.

上传的附件 cloud_download 基于Java的飞机大战游戏的设计与实现.zip ( 4.40mb, 17次下载 )
error_outline 下载需要15点积分

发送私信

53
文章数
12
评论数
最近文章
eject