基于Java的雷电游戏设计(含源文件)

欢迎添加微信互相交流学习哦!

二维码

项目源码:https://gitee.com/oklongmm/biye

     基于Java的雷电游戏
摘   要
   电脑游戏,是指在计算机上能够运转的游戏软件。这种软件具有较强的娱乐性。电脑游戏的创新和发展与硬件、软件的发展紧密相关。它能够给玩家提供一个虚拟的环境,使游戏带给了人们很多的享受和欢乐。雷电游戏因为操作简单,节奏明快,一直是纵轴射击游戏的经典之作。经常能够在手机或者计算机中见到这款游戏,深得广大玩家的喜爱,可以说是妇孺皆知的一款益智类游戏。
   本游戏基于Eclipse开发平台,以java作为编程语言,整个项目开发旨在模拟雷电游戏的飞机射击游戏。游戏界面的下部是玩家的飞机,可以根据按键控制子弹的发射,上部为敌方飞机,在界面中随机出现。在游戏过程当中,用户飞机的移动是被电脑键盘的方向键所控制的,在整个游戏过程当中,如果用户飞机的子弹与敌方飞机发生相撞时,敌方飞机就会有爆炸的效果产生。游戏中使用到的飞机、子弹均采用对应的类实现。
 
关键词:雷电;电脑游戏;java;Eclipse;


Lightning Game based on Java
Abstract
 A computer game is a game software that can run on a computer. This software has a strong entertainment function. Computer game innovation and development and hardware, software development is closely related. It can give players a virtual environment, so that the game brought a lot of people enjoy and joy. Lighting game because of simple operation, rhythmic, has been the vertical axis shooting game classic. Often in the phone or computer to see this game, won the majority of players love, can be said the all to see this game, won the majority of players love, can be said that all ages a puzzle game.
This game is a java-based lighting game, the use of Eclipse platform to achieve classic lighting games.
The entire project development is to simulate the lighting game of the aircraft shooting game, the bottom is the player’s plane, able to control the launch of the bullet, the top is a random enemy aircraft. Players can control the movement of their own aircraft through the arrow keys of the keyboard, when the player aircraft bullets hit the enemy aircraft, the enemy aircraft will appear explosion effect. The aircraft used in the game, bullets are used to achieve the corresponding class.  
Keywords: lightning; game; Java; Eclipse platform; 
目  录
摘   要    I
    Abstract    II
    1  引言    3
1.1 项目背景    3
1.2 电脑游戏的发展历史    3
        1.3国内游戏项目研究现状    5
1.4项目主要工作    6
1.5本文组织结构    7
1.6 电脑游戏的策划    7
    2  开发平台与开发技术    8
2.1 Eclipse    8
2.2 Eclipse平台    8
2.3 Java    9
2.4游戏图形界面的开发基础    11
2.5Java游戏中的基本框架    14
    3  雷电游戏模块设计    16
3.1 用户需求分析    16
3.2 可行性分析    16
3.3 总体设计原则    17
3.4 功能模块设计    18
3.4.1 游戏状态控制功能    18
3.4.2 游戏难度的调整    18
3.4.3 游戏界面绘画功能    18
3.4.4 玩家游戏控制功能    19
3.5 关键技术    19
    4  雷电功能实现    20
4.1 游戏程序设计的思路    20
4.1.1 游戏的素材选择    20
4.1.2 游戏中子弹、飞机的实现    20
4.1.3 多线程应用的途径    20
        4.2 游戏首页的实现    22
4.2.1 界面实现    22
    4.2.2 流程图    22
4.2.3 核心代码    23
4.3 游戏开始模块的实现    24
4.3.1 界面实现    24
4.3.2 流程图    25
4.3.3 核心代码    26
4.4 发射子弹模块的实现    27
4.4.1 界面实现    27
 
4.4.2 流程图    28
4.4.3 核心代码    28
    5  系统测试    31
5.1 测试的定义及其重要性    31
5.1.1 测试的定义    31
5.1.2 测试的重要性    31
5.2 测试实例的研究与选择    32
5.3 测试结果    35
总结和展望    37
参考文献    38
致  谢    39
附  录    39
 
1 引言
1.1 项目背景
作为90后的我们,在小时候都拥有属于自己的一台游戏机,里面形形色色大概有十来款游戏。像 “扫雷”、“推箱子”、“俄罗斯方块”等等,我们的童年有这些游戏陪伴我们是幸福的,令许多小伙伴都为之痴迷,即使现在,这些都是随处可见的休闲游戏。我之选择“雷电”游戏作为我的毕业设计,因为它可以代表一代人青春的回忆。
Java语言,实际上就是面向对象的编程语言。对于计算机编程者来说,使用Java最大的好处有两方面,一是就编写程序而言,非常的简单也容易使用,二是它的功能很强大。与此同时,面向对象理论得以很好的实现。“雷电”游戏的毕业设计使我对本科期间所学知识进行了巩固。
    目前常见的电脑游戏的类型有动作游戏、传统益智游戏、体育游戏、策略游戏、休闲游戏和角色扮演类游戏等。不同的类型的游戏有着自身的特点,每一种类型的游戏都有一定的支持人群。开发出一款良好的游戏,了解各种类型的基本特点是很有必要的。而“雷电”游戏就属于上述类型中的STG(射击类)游戏,STG(Shooting Game)类型游戏主要凭借远程武器与敌方开展模拟对抗,拥有绚丽的射击画面。
这个项目使我第一次全流程地独立完成整条链路的开发,对于我自己而言,是0-1的突破。万事开头难,有了这次完整项目开发的经历,以后再做游戏或者其它项目时就对全局有所把控,能够做到游刃有余。假如自己没有亲自动手设计这些,哪怕一次,就不能够真正的领会一个完整项目体系中的每个元素。在以后做一些大的项目时,就更不能对整体进行宏观思考,也就不能对具体项目中每一个细分的小模块进行合适的时间估计,导致项目开发超过预期时间,更有甚,不能完成。
1.2 电脑游戏的发展历史    
在1960年,电子计算机进入了美国的大学校园,这时候电脑游戏开始出现。在那个环境当中孕育了一大批的电脑编程高手。其中具有代表性的是1962年一名叫做拉塞尔的大学生,在美国DEC公司生产的PDP-1型计算机上编写的《宇宙战争》引起了广泛的关注。所以大多数人都把拉塞尔称作电脑游戏的发明人。从1970 年以后,计算机的发展速度逐渐加快,同时开发的成本逐步降低。再后来,布什内开发了世界上首台商业化计算机用以游戏用途,被称为“电子游戏之王”。
1970年,随着苹果公司的诞生,使得电脑游戏开始越来越商业化。不过,早期的电脑游戏界面设计等较为粗糙,但是电脑游戏的雏形已经诞生。    
1980年,随着多媒体技术渐渐走向成熟,技术先进的先行者们纷纷把目光投向电脑游戏。每一款游戏都会有详细的故事情节作为描述,1985年,日本公司任天堂开发了一款电子游戏巨作—超级马里奥,它讲述的情节是一名在意大利的管子工击败了大魔王,最终迎娶了公主也拯救了世界。这款游戏的流行程度也确立了任天堂公司在电子游戏界的称霸地位。这款游戏尽管叫做Computer,但它专心于游戏机平台的营造,舍弃了一部分计算机特征。从此以后,游戏机游戏和电脑游戏开始分道扬镳。Windows操作系统出现以后,电脑游戏的设计开始了一场新的革命,电子游戏的设计者越来越注重视觉和感官的冲击,开始向3D的方向发展。从3D Realms公司的《德军总部3D》到Id Software公司的《Doom》,电子游戏开始商品化。
1996年,《Quake》成为一款跨时代的游戏作品,相比于之前的其它射击类游戏,它是一款真正的3D游戏,给玩家带来了前所未有的虚拟真实感。《Quake》代表了计算机游戏开始渐渐向3D门槛迈入,也同时给电竞活动带来了全新的概念。
从1990年开始,即时战略游戏成为电脑上最引人关注的游戏类型。比如Westwood公司开发的《红色警戒》和《C&C》,还有《帝国时代》和《星际争霸》等等,伴随着五花八门的游戏概念的不断提出和创新,即时战略游戏的发展达到了一个新的高度。在此同时,由于3D技术的不断进步,动作游戏也获得了新生,伴随游戏的发展,动作游戏的规则也产生了一些改变,原来在2D平面上运行的动作游戏无法将一些真实的动作表现出来,而3D技术的革新,使得人物不仅前后左右运动,而且可以通过自己的视角进行观察周围环境,创造出新的动作。再到后来,随着计算机在软、硬件方面技术的进步,给电脑游戏的发展带来了强劲的动力和机遇。
21世纪以来,电脑游戏开始在网络游戏方面崭露头角。与单机版游戏不同,网络游戏的玩家需要通过连入互联网来进行游戏。所以说,网络游戏必须有用户玩家接入互联网,按照开发过程中制定的规则进行操作。其中,按照游戏形式的差异,可以分为网页游戏和客户端游戏。网页游戏是指用户不需要提前安装客户端软件,就可直接通过网络浏览器来玩的网络游戏。它所具有的优点是不会存在硬件配置不够的问题,而且开启以及关闭都很方便。网页游戏的题材和类型也都非常丰富,具有代表性的有休闲竞技等。客户端网络游戏需要预先在电脑上安装客户端进行注册自己的唯一账号,这种形式的游戏由开发该游戏的公司进行构建服务器,如今的大部分游戏都是这种类型。每个玩家在一开始都会创建自己的角色,并且这些资料都会保存在服务器端。具有代表性的游戏作品有英雄联篮球部落、魔兽世界、穿越火线、跑跑卡丁车等。
1.3 国内游戏项目研究现状
现在市场上的电脑游戏形形色色,种类杂多。而且游戏程序的设计工具也不相同。大体上包括四类:
一,利用C/C++程序设计语言,大多数大中型游戏都是将C/C++作为程序设计语言开发。C/C++所拥有的特点有运行时速度较快。
二,利用Java程序设计语言。Java程序设计语言在游戏制作方面的优势较为显著,不过这仅仅是相对于小游戏而言的,对于大型网络游戏,使用Java程序设计语言在速度方面的劣势就会越加突显。比较著名的Java语言开发工具有Sun 公司的NetBeans等。目前Java程序设计语言关于游戏的优势领域包括:基于Applet的网页游戏和手机游戏。在当前的手机游戏市场中,平台主要有Android(安卓)、iOS(苹果)、Java平台和Windows平台等。其中,iOS平台由于终端数量限制导致增长较慢,相反,Android平台以其普及度较高的平台终端正处于爆发式的增长期,此外,大多PC上开发的Java游戏也可以移植到Android智能手机平台上。
三,FlashActionScript是一种脚本语言,经常在Flash文件中进行嵌入,主要是对Flash动画流程进行控制。使用FlashActionScript语言设计出的游戏内存较小、画面逼真,因此在小游戏的设计领域迅速走红。2D平面游戏都可以用Flash编写。比如Adobe公司的Flash CS产品。
四,C#程序设计语言是由Java和C++衍化来的程序语言,拥有Java和C++的双重优点,既能够用以面向对象程序设计,同时在运行的速度方面具有较大优势。
   现如今,Java语言在游戏开发环节,也正逐步展现出它独有的特色。
1.4 项目主要工作
本次项目开发是基于JAVA的雷电游戏。
此雷电游戏通俗来说就是我方飞机和敌方之间的对决,先要做的应该是通过一个界面来达到装载整个游戏,然后就是我方飞机的移动方式(也就是通过键盘来移动),接着就是生成我方飞机的子弹(依据子弹类型的不同有不同的实现形式),准备就绪后会有敌方飞机的出现,每一个飞机会对应发射不同种类的子弹,最后是我方飞机通过键盘进行移动、射击,显示出游戏结果,然后结束游戏。
该雷电应该满足以下一些要求:
(1)游戏状态控制功能 
在进行游戏的设计时,我们应该考虑到,如何进行游戏状态的划分。简单来说,我们需要设置开始,并且要考虑到游戏中断,以及中断后回到游戏中。玩家点击开始之后,程序会调用启动页面的代码,然后进入游戏,在游戏的过程中,玩家如果由于其它工作需要离开时,可以将其中断,比如单击空格键,当需要恢复游戏现场时,再单击空格键,就可以继续游戏,当自己控制的飞机被击毁时,会有游戏结束的显现。
(2)游戏难度的调整 
    随着游戏的进行、关卡的提高,敌机的速度会越来越快、敌方飞机的数目会越来越多、子弹数量也会越快且越多。此时,带给游戏玩家的视觉冲击变得更强,需要玩家更加冷静地去躲闪以及攻击敌机。
(3)游戏界面绘画功能 
游戏主屏主要用来输出用户对我方的控制与敌方的动作显示。在游戏屏幕的左下角有全屏爆破次数的显示,这相当于游戏玩家的特殊技能,可以瞬间清除当前屏幕上的所有敌机以及子弹,在游戏屏幕的右下角会呈现玩家飞机血条,代表着当前我方飞机的状态。当血条格为空时,表示我方飞机已经被击毁,整个雷电游戏也将结束。
(4)玩家游戏控制功能
对于我方飞机的移动和子弹的发射,游戏用户可以通过控制键盘来控制。飞机的左右移动通过键盘的上、下、左、右键来实现,而我方飞机子弹的释放方式有两种,z键会释放出点状子弹,而x键会释放出线状子弹,可供游戏玩家依据需要自行选择。
1.5 本文组织结构
文本的具体内容和组织结构简述如下:
第一章,本论文的研究项目和研究背景。
第二章,此项目的开发语言以及编程环境。
第三章,用户的需求分析,可行性分析,功能模块设计以及总体原则。
第四章,实现了雷电游戏的功能模块,对雷电游戏项目过程中的核心部分进行了代码的注解。 
第五章,对实现的程序进行了测试,对整个项目做了功能评价。
1.6 电脑游戏的策划
策划主要就是对游戏的整体进行规划的工作,即在整个项目开始编写之前,要对雷电游戏的开发过程进行规划,要做到心中有数。好比在阅读一本新书时,要先通过阅读全书的目录章节对全书进行整体的了解。策划的具体工作是对游戏的整体模式进行设计,同时也要对游戏设计文档进行描述。策划的范围包括整个游戏的所有内容,此外,游戏素材需提前制作,使得游戏中的各种要素能够呈现在我们面前。而程序开发的过程则是按照策划阶段设计的游戏规则运用代码的方式加以实现。游戏的筹划通常分为:数值策划、剧情策划、关卡策划等。
基于Java的雷电游戏属于飞机射击类游戏。在游戏策划中包括关卡的设计,这一过程需要程序的实现同时配合美术资源的制作。而且,也需要根据整个任务系统的框架进行任务书的编写。

2 开发平台与开发技术
本章主要介绍该毕业设计项目所使用的开发语言和开发平台。
2.1 Eclipse
Eclipse是有名的跨平台自由集成开发环境(IDE),在最开始的时候,它作为一种开发工具,主要是为Java语言服务的,但近年来,随着各种插件的出现,它开始支持各种各样的语言,比如PHP以及C++等等。就Eclipse本身来说,它只是为开发者提供一个平台而已,但是随着各式各样插件的出现,使得Eclipse拥有较强的灵活性。许多软件开发商在Eclipse框架之上开发自己的IDE。Eclipse最吸引人的三个方面包括:一是创新性的图形API-SWT/JFace。与Java的 AWT/SWING界面不够美观、界面响应速度较慢相比,SWT/JFace极大改善了Java在这些方面的能力。二是插件机制。Eclipse以其强大的插件机制而著名,可以认为,Eclipse就是由众多的插件所组成的。到了Eclipse3.0,伴随RCP概念的推广,整个Eclipse的插件形成了清晰明了的层次关系。三是基于Eclipse插件机制开发的各种功能强大的插件。Eclipse插件的安装方法包括:直接复制法、Eclipse自带图形界面安装、使用link文件法、使用dropins安装插件等。
2.2 Eclipse平台
Eclipse是基于JAVA的可扩展开发平台。目前Java开发领域的集成开发环境层出不穷,种类达到10余种。如此多种类的IDE丰富了Java开发工具家族,但也为开发人员提出了选择难题。
这些开发模式区别较为显著,在一种开发模式下完成的项目往往不能方便地移植到另一种模式中,这就需要更加合理有效地选择适合项目目标的开发工具。
在目前的集成开发环境中,Eclipse可以说是最具发展前景的产品之一。Eclipse最早开始于1994年4月,由IBM、OTI的产品开发组创建。IBM提供了最初的Eclipse基础代码,包含JDT、Platform、PDE等。目前Eclipse项目已发展为一个庞大的Eclipse联盟,该联盟以IBM为主,有150多家软件公司参与其中,包括Borland、Software、Red Hat、Rational、Sybase等,最近Oracle也着手加入Eclipse联盟中。 
2.3 Java 
在目前的软件开发中,Java语言成为大部分人员的选择,甚至会有用户自己提出运用Java语言进行开发,可见Java语言的发展已经是深入人心,Java的流行是由于自身所拥有的特点所决定的。
   (1)平台无关性
平台无关性是Java语言所拥有的最大优势,在Java中,源文件不是直接被编译成硬件可以识别的机器指令,而是通过Java的编译器先编译成字节码文件,该字节码文件就是编译Java源程序时得到的class类文件。Java的跨平台主要是指字节码文件能够在任意软硬件平台上运行,而执行这种类文件的就是Java虚拟机。Java虚拟机是指软件模拟出的计算机,可以执行编译Java源文件得到的中间码文件,而各种平台的差异就是通过Java虚拟机进行处理。
在JAVA中,通过Java虚拟机把中间码文件解译成目标平台能够识别的机器指令,能够实现不同平台运行Java程序。Java依据不同的环境平台提供了不同的Java虚拟机,例如在Sun的官方网站中就提供了windows、Linux和Solaris等各种版本Java虚拟机的下载。
(2)安全性
    在C/C++中,指针的使用是一个高级话题,如果熟练掌握指针可以给程序的开发带来很大的方便,但是若使用指针不当,就有可能造成系统资源泄露,更严重的是错误的操作可能导致非法访问系统文件的地址空间,从而给系统带来灾难性的破坏,因此上在C/C++中指针的使用需要十分注意。在Java中,不存在这样指针,所有的存取过程都根据Java语言自身进行解决完成,不涉及对存储空间之间访问的方法,这样可以确保地址空间不被故意或者是无意的破坏。并且经过这种处理,也可有效避免系统资源的泄露。
    例如在C/C++中,如果大量的指针不及时处理,就会占用系统内存资源,导致可用的内存空间被白白消耗掉。在Java中就不存在这样的麻烦,Java提供了一套行之有效的资源回收策略,可以使不再使用的系统资源自动回收,从而确保了系统资源的稳定性、安全性。另外,Java虚拟机会将Java程序内的数据资源及代码规范在特定的内存区域之中,确保Java程序不会破坏系统的内存空间,从而保证了系统的安全性。
   (3)面向对象
面向对象已经成为目前软件开发中的首选,在Java中利用了不同面向对象语言的长处,从而更彻底的实现了面向对象的技术。Java程序大体上所有的功能都是基于对象来完成的。为了实现模块化以及数据的隐蔽,Java语言运用了功能代码封装的处理,Java语言对继承性的实现使得功能代码能够重复使用,用户可以通过将具体的功能代码封装成自定义的类,来实现对代码的再利用。
C++是一种经典的面向对象语言,Java语言延续了C++中面向对象的理论,但是在Java语言中去掉了部分复杂的技术,从而简化了面向对象的技术,例如运算符的重载等等之类的一些功能。在这样的处理之后,Java中的面向对象技术变得更为简便、易懂,同时保留了面向对象的核心技术,使用户能够方便的享受面向对象技术带来的方便快捷。
(4)异常处理
     在Java程序开发中,提供异常处理的策略,能够对各种异常和错误进行处理。这些错误主要指程序在编译以及运行时出现的错误和异常,例如数组越界异常等等。Java中的这种非正常处理策略能够帮助使用者定位处理各种错误,从而极大提高了Java应用程序的开发周期。同时,这种异常策略能够高效捕捉到程序中的异常,针对不同的异常,用户可以采用不同的方法进行处理解决,从而保证了应用程序得以正常运转。   
2.4 游戏图形界面的开发基础
(1)图形用户界面
    图形用户界面(GUI)是如今非常流行的人机交互方式,它可以为用户显示图形界面,使用户能够通过看到的直接进行操作。Java本身拥有一系列的接口和类,使用户不需要直接调用操作系统API,为实现图形用户界面提供了便利。
(2)AWT介绍
AWT是一个不同于常规类型的组件,里面包括另外的一些组件。AWT是由java.awt包提供的,用户可以通过抽象窗口工具集,在容器中创建文本框等一些操作。AWT是Java语言GUI程序设计的核心,其库类非常丰富,包含构建Java图形界面程序的工具。AWT为用户提供了界面构件,给计算机与用户的交互提供了更好的便利。用来构建图形用户界面的独立平台主要由四部分组成。
    一是组件类(Component),具体包括画布类、标签类、按钮类、文本框类、类表类、复选按钮类等。二是图形类(Graphics),是指与图形处理的相关一些类。三是容器类(Container),实际上也是一个组件,即扩展组件的抽象基本类。容器中可以有许多组件。由Container转化过来的类有很多,通过这些类创建的对象称为容器,用户可经过调用add()方法在容器中添加组件,实现与系统交互的目的。
(3)Swing介绍以及程序设计
  Swing是于1996年末才开始被设计的,是一套由JFC(Java基础类库)提供的用于开发图形用户界面,作为Java基类的一部分,是Sun公司提出的图形用户接口工具包。Swing能够开发出功能完善、视感独特的应用程序。同时,Swing具有优良的扩展能力,提供许多功能齐全的组件。人们的开发工作由于Swing的存在而变得简化。Swing完全是利用Java语言来实现的,它的屏幕显示性要比AWT好。不过Swing是在模仿,不属于运用原生平台来提供设备,因此能够在不同平台上使用Swing图形用户界面组件。
Swing是在AWT的基础上扩充而来的,有多于AWT的丰富组件,这样的优势在于开发GUI应用程序时更为方便、灵活、效率高,这种方法设计的GUI感受更加良好。
Swing编写GUI程序主要使用到的是轻量组件,该组件不是设置在自己的窗口当中,而是被设置在包含它的容器中。为了能够供给用于绘制Swing轻量组件的窗口,Swing提供的窗体、窗口以及小应用程序等必须是重量组件。使用Swing编写GUI程序时,可以利用JFrame类创建窗体,在JFrame类中拥有多种设置窗体的方法,JFrame类构建的窗体在未设置时并不可见,因此在需要显示这样的窗体时,选择调用setVisable(Booleab b)方法设置可见,这样就可以显示在显示器上。在创建窗体时,需要设置窗体的大小、标题、关闭按钮的动作,设置关闭按钮的动作可通过setDefaultClose(int operation)方法。
Swing组件需要添加在与Swing顶层容器相关的一个控制面板上,并不能简单地添加到顶层容器当中去。从而可以避免使用Swing的重量级组件。向JFrame中添加组件包括两种方法:一种方法是创建中间容器,将组件添加到容器中,用setContentPane()方法将这个中间容器设置为JFrame的内容面板。 另一种方法是先通过getContentPane()获得内容面板,然后再将组件添加到内容面板中。常见的面板包括JSplitPane、JPanel、JScrollpane等。使用Jpanel面板的用途有:在不使用面板时,界面难以进行分区,此时的组件只能被迫采用一种布局方式,难以设计出画面美观的界面;某些布局方式只能够管理有限的组件,这会束缚设计思想。
组件是软件系统和用户进行交互的桥梁,也是图形用户界面的基本元素。一般的组件包括:标签组件,主要用来文本以及图像的显现,配合其它组件输出说明信息。标签组件提供了很多设置标签的方法,常见的有setText(String text)、setFont(Font font)等;按钮组件,包括按下和释放两种状态,需要通过捕捉按下、释放动作才能执行操作;密码框,用于需要进行密码设置的场合,接受单行文本信息,不显示输入的真实信息,会用星号或者其它图表表示输入的位数,常用的方法有getEcho()(获得回显示符,返回的类型为char型)、setEchoChar(char c)(指定回显示符,默认为“*”)、getPassword()(获取用户输入的信息,返回类型为char型数组);文本框,同样是用于接受用户输入的单行文本信息,可以在创建之后利用setText(String t)方法设置文本信息,也可以创建默认文本的文本框对象,常用的方法有setText(String t)()(设置文本框中的信息)、setFont(Font f)(设置文本框中文字的字体)、setColumns(int columns)(设置文本框中最多可显示内容的列数)等。
(4) 绘图技术
AWT的绘图技术主要包括update()、paint()、repaint()这3种方法,update()方法和paint()方法都包含有Graphics类参数。Graphics是画图的要素,它能够支持两种绘图:一种是画图象,主要运用于制作动画;另一种是画线、矩形等基本绘图。
    java.awt.Graphics类是Java中最重要的处理图形的类,该类中有图形、图像的操作方法,用于绘制线、几何图形、文字等。在编写程序时,应该预先把java.awt.Graphics类导入到Java程序中。Graphics类的使用方法较比于其它有所区别,比如在屏幕上绘制图形时,需要一个画板,该画板必须是一个实体,这样Graphics类可以在画板上对各种画图进行处理,而不需要构建一个该类的实类对象。
Graphics中图形的绘制方法包括:
update( ):用途是改变图形,调用paint();
paint( ):肯定要经过变化,用于绘图的特定的操作;
(5)游戏过程当中的交互
游戏的开发过程是一个与用户玩家进行不断交互的过程,根据一批玩家在试玩结束后对游戏提出改进的意见或者建议。只有这样,才能够了解玩家真实的内心想法。在初级设计阶段,我问询了家人以及朋友的想法,体现到游戏当中,比如大招清空的设置,子弹的选择,大BOSS的子弹发射都进行了相应的调整与改进。
(6) 多线程技术的应用
 在同一个进程中,多个线程有许多时候需要共享一个对象,但是若它们能够同时访问某对象,就会产生共享数据的冲突。为了避免出现这种多个线程共同访问一个对象所引起的访问冲突问题,Java语言包含了线程同步机制进行处理。线程同步能够有效解决非单一线程同一时间使用同一个对象的问题,避免某一个线程的数据被其它线程生成的数据覆盖的问题。Java语言运用到了监听器的技术,它为受保护的共享对象添加了一把“锁”,只有拥有“钥匙”的线程才能进行操作,而每次的“钥匙”必须进行申请,没拿到“钥匙”的线程必须进行等待,直到拿到“钥匙”。实现非单一线程同步有两种途径:一种是方法同步,这种方法是避免多个线程同一时间访问某个方法,解决的办法是在定义中加入synchronized,如果出现某一线程已经对方法进行了访问,那么其它线程只能通过等待,然后才能访问。另一种是对象同步,针对于某一数据对象,无论该对象有多少个线程要进行访问,在同一时间只能进行一个线程的访问。
在一些多线程的应用中,线程之间应相互交流、互相通信。在Java语言中,java.lang.Object类具体有3种方式来协调线程之间运行关系的功能,通过线程方法使得现场之间互相等待。
(8)Java网络技术的应用 
     Java语言与网络有着密不可分的联系,Java语言的发展与网络的发展相互联系。网络编程是指通过网络协议以及其它计算机完成直接或者间接的数据传递。网络编程一般通过两种方法实现,一种是借助Socket套接字实现基于TCP协议的网络编程;另一种是利用URL类以及URLConnection类对WWW网络资源进行访问。URL指统一资源定位符,是描述Internet中网页或者是其它资源的地址的标识方法,它是通过顺序排列的字母或者是数字确定地址。用URL类的方法可以从网上读取数据,若还想输出一些数据,则需要用到URLConnection类。
2.5 Java游戏程序的基本框架
(1)电子游戏的开发与设计是艺术和科学的完美结合,游戏动画的制作是电子游戏设计的根基,大部分的游戏都是在动画的基础之上添加玩家与电脑的交互功能。动画主要包括游戏动画和影视动画。其中游戏动画表示在显示屏上显现出一系列的不间隔动画,动画的出现首先需要显示第一帧图形,接着在下一个不长的时段内显现下一帧,按这样的顺序依次进行,使用户感觉画面上的物体在动。另外,动画的制作需要设置合理的帧频。尤其在一些需要大量动画的游戏中,就需要取舍屏幕上显示的图像大小和FPS(每秒针的帧数)。
(2)游戏动画的制作,要想达到将一连串的图像快速循环播放的目的,需要构造循环语句用于控制图像的连续播放。同时也要利用到线程中的暂停函数,这是因为动画都需要播放速度,暂停函数可以起到既能连续播放动画又可以控制动画的播放速度。游戏当中,动画在运行的时候,有可能会出现屏幕闪烁的现象,这时就需要用到双缓冲技术。所谓的双缓冲,其实就是在计算机内存中占据一块空间作为后端的图像,程序通过改动、绘制结束之后后再出现在显示屏上。双缓冲技术是Java游戏的关键技术。
    虽然双缓冲技术会消耗额外的内存,但是如今的计算机内存都相对较大,在大多数情况下,程序员都不需要优先考虑节省内存,玩家在游戏中的画面感受等才是至关重要的。所以说,利用一些内存的消耗来换取游戏质量的提高还是很合理的。
(3)游戏中的碰撞检测。游戏开发与设计中,会涉及到许多物体之间的碰撞问题。矩形碰撞、像素碰撞和圆形碰撞等都是常见的碰撞。我们把游戏中的角色称为Actor,也就是游戏当中会出现的一些飞机等,将其中的每个Actor框成与角色面积相同的矩形框。那么,游戏中的检测就是观察矩形框之间是否存在交集。如果是测试对象之间边界是否出现重叠,则可以利用圆形碰撞。通过比较对象的路径长度和半径大小,假若对象之间的长度比它们半径总和小,表明游戏中过程之中出现了相撞的情况。
    还有一种是像素碰撞,前面提过,游戏当中设定的角色往往用一个矩形区域来表示,由于角色并不都是规则图形,但用矩形区域包起来后,就会出现两个角色之间实际没有产生碰撞,但是矩形碰撞检测的结果却表明它们出现了碰撞。如果使用像素检查,则把对象的背景设定为相同的颜色,此时不会出现上述问题。像素碰撞的缺点是计算量较大,消耗过多的系统资源。因此,除非严格要求的情况,一般使用的是矩形检测碰撞。


 
3 雷电游戏模块设计
3.1 用户需求分析
大部分的射击类游戏都存在一定的相似性,雷电游戏也不存在特殊。其实就是一个周而复始的情形,一直到游戏结束才能够停止。游戏开始阶段接受玩家的输入并对这个输入办理,如果没有结束就会不断产生飞机,通过检查我方飞机的血条判断游戏是不是最终结束。
该雷电主要就是我方飞机与敌方飞机的射击比拼,首先需要有界面来装载整个项目,通过键盘的上、下、左、右键遥控自己的飞机,z、x键进行子弹发射的选择,然后是敌方飞机的出现方式,敌机子弹的生成,通过各个关卡,最后得出比赛的结果。
雷电游戏主要包括以下功能:
(1)雷电游戏状态调整功能 :在游戏启动时,游戏会自动进行初始化的验证,若初始化成功后,界面会自动进行跳转,跳转到游戏开始界面,有开始、暂停、恢复游戏等选项。
    (2)雷电游戏难度的升级:当进入游戏后,随着时间越来越长,游戏难度会越来越大,界面中敌机增多,对飞机造成伤害的子弹增多,游戏难度增加,最后会遇到一个血条较长的怪兽,攻击其至血条为0时,自动过关跳转到下一关卡。
    (3)玩家对飞机的控制功能:玩家可以对飞机进行操控,通过前后左右键来控制飞机的飞行路线。
    (4)游戏界面绘画功能。
3.2 可行性研究
在进行任何一项工程项目时,先要做的是可行性研究和分析,对各种可能性方案进行研究比对,比较它们的优劣。可行性研究的主要目的就是在尽可能短的时间段内用相对较小的代价确定问题是否能够得到解决。先要进行概要的分析,大致明确项目目标并完成整体规划,从而判断原先系统的目标能不能正常实现以及是否有它设计、产生的价值。总体而言,可行性研究是通过抽象的方式进行分析和研究。
对于此基于Java的雷电游戏,下面将从技术、利益、社会的角度进行明确阐述。
1.技术可行性
谈及技术可行性,其实就是看所依靠的技术条件是否能够满足本次项目的开发工作。本次项目设计开发平台是Eclipse3.1,开发语言是Java,平台无关性是Java语言所拥有的最大优势,而且Java能对各种异常进行处理,能够满足雷电游戏的开发需求。在硬件方面,随着如今时代的快速发展,计算机的运行速度逐步加快,人们也能够负担得起,功能方面的可靠性也逐步提升。对于我的这个雷电游戏非常适合。
综上所述,本软件的开发在技术上是可行的。
2.经济可行性
该雷电游戏项目开发成本较低,没有经济方面的困难,并且该雷电游戏在工作效率方面有相当明显的优势。同时软件变更方便且实用性强,在项目运行成功之后以后的更改也很方便。用户只需要将软件安装到自己的电脑当中,当人们对雷电的某部分功能不太满意时,只需要对信息进行变更,将特定的功能模块进行调整升级。
综上所述,本软件在经济上具有可行性。
3.社会可行性
该雷电游戏的社会可行性将从法律因素、玩家使用可行性两方面综合阐述。
(1)法律因素
 本次毕业设计是基于Java的雷电游戏,参考了市场上现有的雷电游戏,观察了它们所实现的功能以及不足之处,但软件的开发与论文的编写是独自完成的,没有抄袭过市场上或网上的同类产品。
(2)玩家使用可行性
这样既减少投入成本又简化了操作环节。该雷电游戏适用于群体大众,操作简单、易上手,不需要提前进行练习培训,可行性较高。
综上所述,本软件具有社会可行性。
3.3 总体设计原则
软件总体设计的任务是软件模块设计以及软件体系结构设计。软件体系结构是软件系统中最本质的要素。因为体系结构就是对复杂对象进行抽象,能够描述各类风格的软件系统结构,高效的处理各种各样的需求。良好的软件体系结构代表着高效与稳定。
该雷电游戏项目的主要设计原则有:
简单性:该软件项目实现了雷电游戏的所有功能,并且在操上作简单易懂、容易上手,适用于大部分人群。
针对性:该雷电游戏是基于Java的程序设计项目,具备较强的针对性。
实用性:该程序设计项目能够实现雷电游戏的全部功能,其中关卡和终极大BOSS的设计更加体现了良好的实用性。
3.4 功能模块设计
3.4.1 游戏状态控制功能 
雷电的阶段包括开始、暂停、恢复和结束,最先需要等待游戏的加载启动,假若游戏过程中,玩家如果因为特殊事情需要离开可以选择暂停比赛,等到再次回来可以进行比赛的恢复。 
3.4.2 游戏难度的调整 
   随着游戏的进行,游戏的难度会相应的增加,比如敌机的数量会越来越多、敌机子弹的数量也会有所增加,这些都是对玩家造成伤害的因素,这些伤害因素越多,游戏的难度相应就越大,最终每一关卡都有一个怪兽守关,它的血条、子弹都造成了游戏难度的增加。
3.4.3 游戏界面绘画功能
游戏主屏用来输出用户对己方的控制与敌方的动作显示。在屏幕的右下角会有己方飞机的生命值的显示,在游戏的左下角会有全屏爆破的剩余次数显示,通过这些显示,可以增加玩家的游戏体验性,达到一个更加人性化的界面,为用户提供更好的界面舒适度。
3.4.4 玩家游戏控制功能
用户玩家可以通过键盘的上、下、左、右键控制飞机的移动,通过移动来躲避敌方飞机带来的伤害,通过z、x键控制子弹的发射,通过发射子弹来对敌机造成伤害。
3.5 关键技术
(1)游戏美工。游戏中需要使用的游戏素材有自己控制的飞机、敌方飞机、游戏过程当中飞机所产生的子弹、飞机被命中的爆炸图片等。这些素材的选择尤为重要,游戏中清新亮丽的画面可以给玩家带来充足的美感和游戏体验。所以,在这个“雷电”游戏的素材选择中,应挑选一些立体感强的图片,给玩家更大的视觉冲击。 
(2)多线程技术的实现。多线程编程能够提供程序两个或两个以上并发执行任务的能力,极大改善程序的响应性能,有效提高资源的利用效率。采取Runnable接口的方法达到定义用户线程的功能,这样既不会对继承其他类有所变化,也不会改变实现其它接口。 
(3)用户飞机子弹与敌方飞机的相撞测试。包括自己控制的飞机与敌方飞机或子弹的相撞等。在这一过程中,将所有子弹对象的矩形区域与敌机对象的矩形区域逐个以此进行检测,如果出现重叠则说明子弹与敌机发生了碰撞。

(4)游戏地图滚动原理的实现。我们在坐火车时都产生过一种错觉:自己乘坐的火车没有发生移动,但如果旁边有其他火车发生移动,我们就会感到是自己的火车在移动。这种现象与飞机射击类游戏的地图原理类似,即通过背景图片的来回滚动,给游戏玩家一种是自己操纵的飞机向前飞行的感觉。

4 雷电功能实现
4.1 游戏首页的实现
4.1.1 游戏的素材选择
随着时代的发展,人们的思想也越来越进步,玩家对于精神领域的需求也越发显著,所以在游戏类型项目的设计过程中,游戏中的物体形式、动画设计等显得格外重要。在准备阶段,我通过咨询身边的同学及朋友,选择了充足的游戏素材,如玩家的飞机类型、飞机所能发射子弹的样式、飞机被击毁的爆炸图片及背景等。
4.1.2 游戏中飞机、子弹的实现
在此雷电游戏中所使用的飞机和子弹均采用对应的类来实现。整个游戏当中涉及最多的就是飞机和子弹,为了检测飞机与子弹、飞机与飞机之间的碰撞,每一架飞机与每一颗发射出来的子弹都需要对其相应的飞机和子弹在屏幕中的坐标地点进行跟踪。这样屏幕中飞机与子弹的碰撞就可通过子弹和飞机所构成的矩形区域的交集来进行判断。计算此时屏幕当中的每一架飞机和每一颗子弹就可得出碰撞结果,得到碰撞的飞机对象,然后显示爆炸图片。
4.1.3多线程
    如同日常工作安排中由多人共同完成一项工作一样,多线程能够使程序多个并发执行任务。在多核心的时代中,多线程能够使程序的性能有所增大以及使资源能够得到更合理的利用,用处极为广泛。在Java语言当中,多线程功能可以满足在一个程序当中同一时刻执行好几个任务,但人们并没有察觉到线程的交替进行,而觉得所有线程同一时刻一起运行,这源于CPU在线程间的迅速切换。多线程还能提供更好的交互性以及实时控制性能。新构建的线程包含5种状态。
一是新建,即一个Thread、Thread子类的对象声明、构建时,新生成的对象就会是一种新建状态,此时,线程已经被初始化,并且拥有相应的资源。
二是就绪,当新建的线程开启之后,会进入线程队列进行排队,此时线程已达到了运行的资格,需要准备CPU时间片,如果轮到它享有CPU资源时,就具有构建自己生命周期的机会,可以离开它的主线程。此外,处于阻塞状态的线程也会进入就绪的状态。
三是运行,在第二步骤下的线程通过排队获取到资源以后,紧接着将会步入运行的状态。run()方法存在于每一个Thread类及其子类中。在线程对象处于执行态时,会调用线程对象的run(),run()方法当中有该类线程的功能以及操作。
四是阻塞,存在一种正在正常执行的线程被人为挂起的非正常情况下,此时,将迫不得已的让出CPU而且终止本身的执行态,转入到了阻塞状态。该状态下不能参与队列排队,只有当这种迫不得已的非正常情况消失之后,线程才能再一次转入第二步骤,然后再一次去线程队列中排队获得CPU资源以进行未完成的过程。
五是死亡,线程死亡的一种情况是该线程被强迫性结束,比如用destroy()来停止线程。另外一种情况是一个线程按照常规运行完所有的安排,结束了run()的所有语句,最后退出。处于死亡状态下的进程不再具有运行的能力。
   Java实现多线程包括两种方法,一种是在用户自己的类完成Runnable接口,这个特殊的接口有且只有一个run(),在此方法中需要规定方法体并且明确具体的操作。在线程处于运行状态时,将会执行run()方法中的操作。二是创建用户本身的Thread线程子类。该类封装了线程的属性及行为。Thread类的主要方法包括:开始线程的方法、定义线程步骤的方法、暂停线程的方法、结束线程的方法及判断是否消亡的方法。
   上述实现线程的两种方式并不是完全相同的,即使它们均可以通过一定的操作得到独立的执行任务。继承Thread类的方式特点是操作简单,但它的特点也比较突出,因为Java语言并不支持多重继承(多重继承虽然普遍存在,但是使用复杂,编译程序也不易实现),所以继承了该类就不能够继承其它的类,这会影响项目开发。对于实现Runnable接口的方法则既不影响实现其它的接口又不影响继承其他类,这种方法灵活性更加突出。所以此次雷电游戏项目采用Runnable接口实现多线程。
4.2 游戏首页的实现
4.2.1 界面实现
游戏在初始进入时,会跳转出游戏启动界面,点击任意键会自动加载进入游戏中。界面模式是下图4-1。
 
图4-1 游戏启动界面
4.2.2 流程图
    在游戏正常启动后,系统会对客户端的操作进行一系列的判断。首先在启动界面时,要分析初始化是否成功,若初始化成功,进入游戏,反之,重新初始化。游戏开始的流程图如下图4-2所示。

图4-2 游戏初始化流程图
4.2.3 核心代码
游戏初始化代码如下:
 
 4.3 游戏开始模块的实现
4.3.1 界面实现
 
图4-3 游戏中的界面效果
4.3.2 流程图
进入游戏后,首先,游戏会进行初始化操作,若初始化成功会进入游戏,否则,需要进行异常处理,游戏开始后,会进行选择,若选择失败,则需要进行异常处理。如图4-4所示。
图4-4 游戏开始模块程序流程图
4.3.3 核心代码
下面是游戏开始模块的功能代码,如下:


4.4 发射子弹模块的实现(两种子弹)
4.4.1 界面实现
在游戏中,需要进行两种子弹的设计,刚进入游戏时,飞机仅发射初级的子弹形式,随着游戏的进行,需要对子弹的形式进行改变,用以表示飞机战斗力升级。在这一过程中,飞机的初始子弹为三颗粒状逐渐分散开来,随着游戏难度的升级,子弹会由分散的粒状变为持续的柱状,这两种子弹的形式分别如图4-5、4-6所示。并且,会在游戏中设置全屏爆破的功能,这一功能的作用就是将屏幕中的敌机和敌机所发射的子弹,全部清除,以减少对飞机自身的损害。

 
图4-5 游戏发射子弹界面
 
图4-6 游戏中发射子弹界面

4.4.2 流程图

图4-7 子弹发射流程图
4.4.3 核心代码
发射子弹实现代码如下:

 
 

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

积分的变化根据击中敌机的数量来决定,然后计算玩家当前的游戏分数。同时等待玩家键入数字,选择游戏难度并开始新的游戏。下面是控制方法init()的代码:

 
 


5 系统测试

测试是软件开发时期最后一个阶段,是检验所完成的项目合格与否的一种重要手段。系统测试就是将已经确认的计算机硬件、软件等其它因素组装起来进行检测与分析。通过与前期阶段的系统需求比较,找出已完成的项目同用户实际需求之间产生矛盾的地方,进行修改更正,从而得出更加完善的方案。为了尽可能找出代码中存在的一些缺陷,增强软件系统的可靠性,测试可以分成几个阶段进行。
5.1 测试的定义及其重要性
5.1.1 测试的定义以及目的
软件测试是指凭借测试工具根据测试方案对软件的功能进行的检测,同时也可以按照需要构造不同的工具完成,对测试方案可能产生的问题进行研究与估测 ,测试用例执行后需要进一步追查故障,保障开发的产品满足要求。
软件测试的功能是找出程序中的缺陷一个步骤。其作用是为找到软件当中尽可能多的错误与缺陷,而并不是想说明一个软件很完美、没有任何错误。完善的软件测试会发现目前为止尚未发现的错误,因此软件测试的工作就是制定有效的测试用例以挖掘出软件中隐藏潜的错误与缺陷。
5.1.2 测试的重要性
软件测试环节在整个软件行业中至关重要,所有软件公司都格外重视软件测试的具体过程以及细节。多数人认为软件开发中软件开发人员贡献最大,这个观点虽然有一定道理,但是软件测试环节也同样发挥非常重要的作用。
软件测试能够保证新开发的软件可以正常工作,当然,对于软件来说,不管通过什么技术,软件当中依旧会有错误,但软件测试能够在很大程度上避免了能够通过技术来解决的软件问题。在某种程度上也有效避免了软件推出后在使用中遇到障碍所造成的经济损失。如果一款软件产品在未经测试的情况下就上市,那么客户使用过程中所遇到的问题会给该公司带来极大的影响与损失。
软件测试不仅能帮助开发人员找出软件中存在的技术问题,同时,也能验证该软件产品是否能满足用户的需求,这种模拟用户体验,使开发人员能够对产品做更好的改进。
软件测试虽然只是软件开发中的一小部分,但却是不可忽略的一环,具有非常重要的作用。一个软件产品只有经过软件测试后再进行上市,才能将该产品分险降到最低。
5.2 测试实例的研究与选择
程序测试主要包括白盒测试、黑盒测试两种方法。
白盒测试也被称为结构性测试或者说是在代码基础上的一种测试,从字面意义上来理解,白盒是指装载被测试软件的盒子是能够看见的,能够清楚直接掌握盒子内部的东西以及操作原理。白盒法属于群举路径测试,可以全面了解程序的逻辑结构以达到测试的目的。白盒测试的方法有许多。白盒测试法包括三种覆盖标准。在这之中,逻辑覆盖的6种覆盖标准发现软件存在缺陷的能力呈逐步递增的变化。白盒测试的实施具体包括设想阶段、构造阶段、操作阶段和总结阶段。其最大的优点是能够详细检测到代码当中的每条路径与分支,所以相对来讲,对代码的测试比较测底。但它没有对规格进行有效验证,而且尽管对每条路径都进行合理测试,但出错的可能性依然有可能是发生的。
黑盒测试,也有人称之为功能性测试,指检测软件的每个具体性的功能是不是能够合理的运作。在黑盒测试当中,黑盒子就相当于程序,不能够打开。所以无法看到程序的内部特性与结构,内部的逻辑结构不在考虑范围之内,仅仅是针对程序功能进行检测,只考虑程序当中的外部性的结构。通常来讲,黑盒测试需要对每一部分进行测试,这样才会将所有的情况进行充分考虑,找出程序中潜在的所有缺陷。但是在平常的测试过程中,不但需要测试合法的输入,同时对其它不合法但存在输入的可能性的也需要测试,这就造成工作量远远超出预期范围,这种穷举性测试在操作过程中不太可能实现。实际中,我们需要采用有针对性的测试,提前制定详细的测试方法进行测试,这样才能确保软件的质量。黑盒测试的方法包括边界数值剖析、等价类分割法、场景法等等。较为常用的是等价类分割法,该方法将程序的输入切割成若干个部分,从其中选择合适的具有典型意义的数据选做测试用例,每一类的数据就等同于这个类的其它值。黑盒测试的优点在于测试不需要了解实现的细节,而且很容易被理解和接受。
对于一些大型的代码模块,黑盒与白盒测试相比,其效果更好,并且在测试过程当中并不需要对详尽的情况(包括特定的编程语言)进行熟悉,具体执行相对较为方便。本次项目的的测试综合了黑、白两种测试方法,黑盒测试方法作为主要的测试方法。经过测试完成之后检查:
(1)功能检查。
观察所设定的功能能否正确实现以及是否存在遗漏问题。
(2)数据检查。
检测数据结构是否存在错误。
(3)性能检查。
看所设定的需求是否能够得到实现。
(4)初始化、终止检查。
看是否能够准确无误地进行开始以及结束。
相关测试用例:
表5-1 系统测试用例表
测试
功能    用例描述    测试步骤    预期结果    实际结果    类别


游戏启动模块    

用户运行程序以启动游戏    

用户需要运行程序,进入游戏启动界面,此时点击任意键,将会自动切换到游戏界面。    
当游戏初始化完成后,会进入主界面,此时按enter键或其他任意键,都可以直接进入游戏。    


与预测结果一致。    


功能点测试


玩家控制飞机功能    
进入游戏后,玩需要通过飞机的移动来躲避敌机造成的伤害。    
玩家进入游戏后,通过上下左右键的控制,可以自由移动来躲避敌机的子弹。    
通过上下左右键的控制,可以使飞机自由移动。    


与预测结果一致。    


功能点测试


飞机发射子弹功能    
玩家在游戏中,可以点击2或8来进行子弹的发射。    
游戏中,玩家点击2或8开始发射子弹,来对敌机造成伤害。    

飞机发射子弹击败敌机。    

与预测结果一致。    

功能点测试


全屏爆破功能    
在飞机剩余血量不多或者难以抵挡的情况下,可以进行全屏爆破来增加自己生存的几率。    
当需要进行清屏时,单击空格键,可以完成一次屏幕清理,为自身增加胜率。    
点击空格键后,屏幕上所有敌方伤害源消失。    

与预测结果一致。    

功能点测试


子弹升级功能    
随着游戏的进行,难度在发生变化,飞机本身也会发生子弹上的改变,当积分到一定成帝,子弹会转变成更具伤害力的形式。    


随着游戏的进行,难度增加,时长累积,子弹会发生变化。    


子弹开始由放射状转变为持续的柱状。    


与预测结果一致。    


功能点测试


游戏过关功能    
随着游戏的进行,难度会随之升级,最终需要打死怪兽,才可以成功进入下一关卡。    
当怪兽的血条为0时,游戏即可进入下一关。    
怪兽死亡后,自动进入下一关卡。    

与预测结果一致。    

功能点测试

环境
模块    
将集成后的代码放入Eclipse中,查看运行情况,观察是否报错。    

启动Eclipse,运行程序代码,看是否有报错信息。    
完整的代码可以在Eclipse中运行,在虚拟机中可以愉快地玩飞机大战游戏。    

与预测结果一致。    


环境测试

5.3 测试结果
软件评测就是对软件项目的用途、性能以及使用价值等进行的测试和评估。评价项目包括评测的内容。针对本软件的评价如下:
(1)功能评价
根据该软件开发设计之前所预设的目标,在雷电项目完成后进行了相关测试,与预期设定相符。比如关卡的选择、子弹的选择、“大招”清屏的运用都可以体现出来,在项目完成之后可以满足用户的整体要求。
(2)技术评价
    经过对该雷电游戏进行系统的测试,表明该雷电游戏在规定的时间内达到了预定的功能目标,具有较强的使用能力,技术成熟。
(3)经济评价
    经过对该雷电游戏进行系统的测试,在规定的时间以及项目开发要求内,达到了预期项目开发的要求,对整个雷电游戏的管理中节约了时间和精力。在软件以后的改善中,如对各个关卡的变更,可以针对其中的模块进行修改,节省了精力。

总结和展望

大学四年匆匆如流水,从刚开始对大学的迷茫到现在即将毕业之际的不舍将都随着这次毕业设计的完成画上一个留恋的句号。Java语言因为其特征显著,受用性十分广泛,所以我选择基于Java的雷电游戏作为我的毕业设计。这也是我首次独立的利用Java编写项目。在项目开发期间,我对Java编程语言有了更为深刻的领悟,也更进一步的了解了Eclipse平台,对基于Java的软件开发进行了实践。通过这次毕业设计,我也有了深刻的感悟,要想完美的开发一个项目,需要的准备必须细致且熟练。整个项目的开发,大学四年所学专业知识多多少少都会用到,这对即将毕业的我们也是一次挑战。比如说会用到软件专业外语进行外文的翻译,Eclipse的使用介绍等等。
整个项目在按照之前制定的方案大体上完成了雷电游戏的设计,当然在具体开发上,由于自身水平有所局限,所开发的项目并不是十分完美,但我会在后期所学知识的基础上进行改善,我相信,经过坚持不懈学习,我一定能写出更加完善的程序。
 
参考文献
[1]   百度百科.Java语言的特点和优势[EB/OL].
http://wenku.baidu.com/view/edd3e74ffe4733687e21aac9.html
[2]   荣钦科技.Java2游戏设计[M].北京.清华大学出版社.2004.
[3]   程成.软件工程[M].北京.机械工业出版社.2003.
[4]   袁海燕,王文涛.Java实用程序设计100例[M].北京.人民邮电出版社.2005.
[5]   王伯欣.J2ME无线.Java[M].北京.应用开发电子工业出版社.2004.
[6]   曹莹,苗志刚,赵秀明.浅谈Java优势[J].中国科技信息,2006.
[7]   邵敏敏,陈德平.解析Java的多线程机制[J].电脑知识与技术.2006.
[8]   朱平.Java程序设计教学[J].湖北教育学院学报.2006.
[9]   猛伟君.李龙海.付少锋.周利华.基于VC++和JAVA的多线程设计和实现[J].2006.
[10]  秦琴.Java语言的异常处理设计[J].中国科技信息.2006.
[11]  倪道义.手机游戏架构分析[J].科技论坛,2011,(9):90.
[12]  Benny Skogberg.Android Appliaction Development[D].Sweden:Malmo University,2010.
[13]   Cay S.Horstmann,Gary Cornell.Introduction to Java [M].London: Macmillan.2006.
[14]   Bruce Eckel.Thinking in Java [M] .London: Prentice Hall PTR.2003.


致  谢

花有重开日,人无再少年。随着毕业论文的提交,大学生活画上了完美的句号。但这同时也象征着新的开始,自己将独自走向新的台阶,迈向人生征程新的开始。
回想大学四年的学习生活,许多事情浮现脑海,仿佛前不久才发生。刚进入大学校园时与父母欢乐和兴奋的场景还历历在目。一切都是那么新鲜,那么富有吸引力。有快乐也有艰辛,有收获也有失落。感谢软件学院给予帮助过我的所有老师。18班的友情也同样终身难忘难忘,是你们陪我共同度过了人生重要的一段路程,无论将来走到哪里,你们都是我人身中珍贵的回忆。
我要感谢指导教师和杰普老师。这个论文是在她们的悉心指导和热情帮助下完成的,老师们认真负责的工作态度,精益求精的工作作风以及平易近人的人格魅力都使我受益匪浅。对于在毕业设计完成过程中遇到的问题,她们无论在理论上还是在实践中,都对我进行了认真的指导,使我的专业实践能力得到很大提高,这对于我以后的学习和工作都有帮助。在此,特别向指导老师表示衷心的感谢,请两位老师接受我最诚挚的敬意!谢谢你们认真辅导,使我能够顺利完成毕业设计的开发工作。同时也要感谢帮助过我的同学们,在略微乏味的学海中,让我体会到友情的无价。
同时,我也想感谢我的家人,他们不仅帮助我茁壮成长、给予我关怀和照顾,而且,是他们培养了我对科学文化知识的兴趣。没有他们,就没有我今天的成绩。在今后的日子里,我想说,我会一如既往的认真下去,将自己在学生阶段所学知识运用到社会实践当中,我会不忘初心,用自己的努力报答你们!
由于本人水平有限以及时间紧凑,本文可能会出现一些不足之处,这这里,我恳请各位老师给予指正和帮助。


附录
2003 34th Annual IEEE Computer Software and Applications Conference Workshops

CS1 and CS2 :write computer games in Java
Shin NAKAJIMA    Keiji HOKAMURA    Naoyasu UBAYASHI
National Institute of Informatics    Kyushu University    Kyushu University
Tokyo, Japan    Fukuoka, Japan    Fukuoka, Japan
Email: [email protected]    Email: [email protected]    Email: [email protected]


Abstract—Java has become a huge and complex technology platform, for developers, in order to better master the Java technology, in-depth understanding of the underlying technical processing details is essential. The mastery of the core concepts and ideas can help us learn by analogy, help us to enhance our understanding of the entire Java platform. Here are the Java technology platform described in several core concepts, which contains the ideas will help us a more profound understanding of Java technology.

Keywords :Java;Virtual Machine;Class file;API;

I. INTRODUCTION

Java is an object-oriented programming language, not only absorb the various advantages of the C + + language, but also to abandon the C + + difficult to understand the multi-inheritance, pointer and other concepts, so the Java language has a powerful and easy to use two features. Java language as a static object-oriented programming language representatives, an excellent realization of the object-oriented theory, allowing programmers to elegant way of thinking complex programming [1].
Java has the characteristics of simplicity, object-oriented, distributed, robustness, security, platform independence and portability, multi-thread, and dynamic [2]. Java can write desktop applications, Web applications, distributed systems and embedded system applications [3].


II.  JAVA VIRTUAL MACHINE

The main task of the Java virtual machine is to install the class file and execute the bytecode. The Java virtual machine contains a class loader that can load class files from programs and APIs.Only those classes that are required by the program to be executed in the Java API will be loaded. Bytecode is executed by the execution engine.
  In different Java virtual machines, the execution engine may be very different. In the virtual machine implemented by the software, the simplest execution engine is a one-time interpretation of the bytecode. Another execution engine is faster, but also consumes more memory, called "just-in-time compiler". In this case, the first byte code to be executed will be compiled into the local machine code. The compiled local machine code is cached and can be reused when the method is called later. The third execution engine is the adaptive optimizer. In this way, the virtual machine begins by interpreting the bytecode, but it monitors the activity of the running program and records the most frequently used code segments. When the program is running, the virtual machine only compiles the most frequently compiled code into local code, and the other code is kept very frequently and is kept as bytecode - the virtual machine continues to explain them. An adaptive optimizer allows the Java virtual machine to perform optimized local code in 80% to 90% of the time, but only 10% to 20% of the code that affects performance.
When the Java virtual machine is implemented by the software on the host operating system, the Java program interacts with the host by calling the native method. There are two methods in Java: Java methods and local methods. Java method is written by the Java language, compiled into bytecode files, stored in the class file. Local methods are written in other languages (such as c, c ++ or assembly language), compiled into processor-related machine code. Local methods are stored in the dynamic link library, the format is proprietary to each platform. When a Java program calls a local method, the virtual machine loads the dynamic library that contains the local method and calls the method. The local method is to connect the Java program and the underlying host operating system connection method.
Access the underlying operating system resources. A local Native interface (JNI) - allows local methods to run on any Java platform implementation of a particular host system.
If you want to use resources on specific host, they can not access from the Java API, you can write a platform-related Java program to call the local method. If you want to ensure that the program platform independence, then only through the Java API to access the underlying system resources.

 


Figure 1 Java Virtual Machine Working principle

III.    CLASS LOADER ARCHITECTURE


Java application can use two class loaders: the "bootstrap" class loader and the user-defined class loader. Starting the class loader (which is unique in the system) is part of the Java Virtual Machine implementation. The boot class loader typically uses a default way to load classes from a local disk, including the Java API classes (the boot loader is also known as the original class loader, the system class loader, or the default class loader).

Java applications can install user-defined class loaders at runtime, and this class loader can use a custom way to load classes. For example, download the class file from the network. Although the boot loader is an essential part of the virtual machine implementation and the user-defined class loader is not, the user-defined class loader can be written in Java and can be compiled into a class file that can be loaded by a virtual machine. As instantiated as other objects.

Because there is a user-defined class loader, so do not have to compile the time to know the running Java applications will eventually join all the class. User-defined class loaders make it possible to run extended Java applications. When it is running, the application can solve which additional classes it needs to be able to decide whether to use one or more user-defined class loaders to load. Since class loaders are written in Java, class loading is done with any style that can be expressed in Java code. These classes can be downloaded over the network, can be obtained from some databases, and can even be dynamically generated.

When each class is loaded, the Java virtual machine monitors the class and sees whether it is loaded by the class loader or by the user-defined class loader. When the loaded class references another class, the virtual machine loads the referenced class using the class loader that loads the first class. For example, if a virtual machine loads a Volcano class using a specific class loader, it will use the class loader to load all classes used by the Volcano class

Since the Java virtual machine takes the load of the class in this way, the loaded class can only see other classes that are loaded by the same class loader by default. In this way, the Java architecture allows you to create multiple namespaces in a Java application. Each class loader in the runtime Java program has its own namespace.

Java applications can create how many (or how many) classes that are loaded by different class loaders are stored in different namespaces, and they can not access each other unless the application explicitly allows it to do so. When writing a Java application, classes that are loaded from different source files can be separated in different namespaces. In this way, you can use the Java class loader architecture to control the interaction between the code loaded in any of the different source files, in particular, to prevent malicious code from gaining access to or damage to goodwill code.
The Web browser is an example of a dynamic extension that uses a user-defined class loader to download class files for Java applets from the network. The Web browser uses a Java application to install the user-defined class loader. This user-defined class loader is often referred to as the Java Applet class loader, which knows how to request a class file from an HTTP server. Java Applet can be used as a dynamic extension of the example, because the Java application does not know when it will start from the network to download the browser request class file. Only when the browser encountered a Java applet page, it was decided whether the need to download class files.
Web browser-initiated Java applications typically create different user-defined class loaders for each network address that provides class files, so different user-defined class loaders load different source class files. Which can be placed separately under the different namespace of the Java host application. Because different Java applet files are placed in different namespaces, malicious Java applet code does not directly access class files downloaded from other places. This can limit or prevent mutual access between code from different sources.

Figure2    class loader architecture


VI. JAVA CLASS FILE

Java class files make Java more suitable for the network in terms of platform independence and network mobility. Its task in platform independence is to provide Java programs with binary forms of services that are independent of the underlying host platform. This approach breaks the tradition of C or C ++ and other languages, and programs written in these traditional languages are usually compiled first and then connected into separate, binary files that specifically support specific hardware platforms and operating systems. Often, binary executables on a platform can not work on other platforms. Java class files can run on any hardware platform that supports the Java virtual machine and the binary files on the operating system.

       
                                    Figure 3 java class file


When compiling and connecting a C ++ program, the resulting executable binaries can only be run on the specified hardware platform and operating system because the binaries contain the machine language for the target processor. The Java compiler to Java source file instructions translated into bytecode, this byte code is the Java virtual machine "machine language."
 Class files are designed so that they can be quickly transmitted over the network. Second, because the Java program is dynamically linked and dynamically expanded, class files can be downloaded when needed. This feature allows Java applications to schedule the time to download class files from the network, thereby minimizing end-user latency.


                                                Figure 4 java class

V.API

  API (Application Programming Interface) is a pre-defined function, the purpose is to provide applications and developers based on a software or hardware to access a set of routines, without having to access the source code, or understand the internal work Mechanism details.
  The standards currently applied to the API include the ANSI standard SQL API. There are also some other types of standards are still being developed. API can be applied to all computer platforms and operating systems. These APIs connect data in different formats. Each data format requires different data commands and parameters to achieve the correct data communication, but at the same time will produce different types of errors. Therefore, in addition to the knowledge required to perform data sharing tasks, these types of APIs must also address many network parameter problems and possible error conditions, that is, each application must know whether it has strong performance support for inter-program communication. On the contrary, since this API only handles an information format, the information delivery API in this case only provides smaller commands, network parameters, and subset of error conditions. Because of this, delivery API approach greatly reduces the complexity of the system, so when the application needs to achieve data sharing through multiple platforms, the use of information delivery API type is the ideal choice.

  Information delivery: refers to the loose coupling or tight coupling between the application of small format information, through the direct communication between programs to achieve data sharing.
  The standards currently applied to the API include the ANSI standard SQL API. There are also some other types of standards are still being developed. API can be applied to all computer platforms and operating systems. These APIs connect data in different formats. Each data format requires different data commands and parameters to achieve the correct data communication, but at the same time will produce different types of errors. Therefore, in addition to the knowledge required to perform data sharing tasks, these types of APIs must also address many network parameter problems and possible error conditions, that is, each application must know whether it has strong performance support for inter-program communication. On the contrary, since this API only handles an information format, the information delivery API in this case only provides smaller commands, network parameters, and subset of error conditions. Because of this, delivery API approach greatly reduces the complexity of the system, so when the application needs to achieve data sharing through multiple platforms, the use of information delivery API type is the ideal choice.

  Information delivery: refers to the loose coupling or tight coupling between the application of small format information, through the direct communication between programs to achieve data sharing Remote Procedure Call (RPC): implements communication between programs by acting on a shared data buffer

 Standard Query Language (SQL): is the standard access to the data query language, through the common database to achieve data sharing between applications.
  File Transfer: File Transfer Data sharing between applications is achieved by sending formatted files.

  Information delivery: refers to the loose coupling or tight coupling between the application of small format information, through the direct communication between programs to achieve data sharing.

 
  Figure 5 java relationship diagram of the collection class

Before a platform can even support Java programs, the API must be explicitly implemented on this particular platform. To access the local resources on the host, the Java API calls the local method. Since Java API class files call local methods, Java programs do not need to call them again. In this way, the Java API class file provides Java programs with platform-independent, standard interfaces for the underlying host. For Java programs, the Java API has the same performance and predictable behavior, regardless of the platform. It is because the Java virtual machine and the Java API are explicitly implemented on each particular host platform, so the Java program itself can become a platform-independent program
The Java API also contributes to the Java security model. When the Java API method performs any potentially dangerous operation (such as making a local disk write), it checks through the access controller to verify that it is authorized. The access controller is a class that is used to perform a stack check and has decided whether or not to allow an operation.

VI.  JAVA CHARACTERISTICS

  Java has the following characteristics:

1. Simple: One of the principles of Java is to build a simple and easy-to-use system that allows users to start designing programs without having to be trained, so Java's syntax is as much as possible the current program is similar to many designers have used C and C ++ languages. Also, Java removed C,and C ++ many rarely used, difficult to understand or often confused function, a lot of inheritance, pointer and so on. 
2. Object-Oriented Object-oriented Object-oriented is the concept and technology widely used in the information industry in recent years.It has many good features. Object encapsulation can make the object interface definition clear; inheritance can increase the reusability of the software, contribute to classification and template design. Implementing the object-oriented concept and its various good features is one of the design concepts of Java. 
3. The development of distributed computer networks makes the application of information towards a distributed environment, So the modern information development language and the environment should be with the distributed characteristics and functions. Java has a network-enabled library that includes the ability to integrate with TCP / IP network communication protocols such as HTTP and FTP.
4. Robust The program written by Java is capable of running in a variety of situations and must have high stability. Java in the development of the time to add to prevent the memory is overwritten and data corruption related processing mechanism.
5.    Security (Java) is designed for use in the network and distributed environment, so security is a very important consideration. Java has a number of simple to complex security measures, can effectively prevent the invasion and destruction of the virus occurred.
6.    Architecture Neutral There are many different types of computers on the network, and there are very different differences from the central processor to the operating system. So it is quite difficult to make the application run on every
machine. For this purpose, the Java compiler can produce a structure-neutral object code file format - Byte Code. This bytecode can run on many different computers. 7.Multithreading Multithreading is one of the tools necessary to develop complex and powerful programs, and Java also supports this important feature.
Source file: Use a text editor, such as Edit or Notepad to write source files. unavailable
Word editor because it contains invisible characters. Will be compiled source files saved, the source file extension must be Java.
Compiler: The source file is compiled by the compiler (Javac.exe) to generate a bytecode file with a .Class extension. Bytecode files are composed of platform-independent binary code, which is interpreted by the interpreter as a local machine code.
Running Java programs: Java programs are divided into two categories - Java applications (Application) and Java applet (applet). Java applications must pass the Java interpreter (java.exe)
To explain the implementation of its bytecode file; Java applet can be supported by the Java standard browser to solve Release execution.

VII. CONCLUSION


The Java language is a rapid development of the computer language program, which profoundly shows the essence of the preparation of the program, coupled with its simple and rigorous structure and simple grammar for its future development and maintenance provides a guarantee. As a result of the network application support and multimedia access, will promote the Internet and enterprise network Web applications [6]. In addition, in order to keep Java growing and advancing the Java community, Sun announced the opening of the Java core source code at the Java One Developer Conference to encourage more people to participate in Java community activities. From the Java community and IBM and other global technology partners in two areas of support, Java technology in innovation and social progress continue to play a strong and important role [4], and with the difficulty of writing its program so that more professionals will focus on Placed in the preparation of the Java language and the design of the framework [3].


ACKNOWLEDGMENT

The reported work here was conducted in collaboration with Ross JACKSON (ENSIMAG,France) and Kelly TOMWELL(Universite de Pierre et Curie,France) when they visited NII during their internship in the summer of 2003.


REFERENCES

[1]    R.J(Bud)Bates. GPRS:General Packet Radio Service .McGraw-Hill, 2003, .
[2]    Cameron,J.R. JSP & JSD the Jackson approach to software development .Silver Spring MD: IEEE Computer Society Press, 1983, .
[3]    M.J.King,J.P.Pardoe. Program design using JSP a practical introduction .Basingstoke Hampshire: Macmillan, 1992, .
[4]    James Goodwill. Pure Java Server Pages .Indianapolis Ind: Sams, 2000, .
[5]    Gwenael Le Bodic. Mobile messaging technologies and services SMS EMS and MMS .New York: J.Wiley, 2005, .
[6] Henry Labord(?)re,Vincent Jonack. SMS and MMS interworking in mobile networks .Boston: Artech House, 2004,


CS1和CS2:用Java编写电脑游戏

摘要

Java已经成为一个庞大而复杂的技术平台,对于开发人员而言,要想更好的掌握Java技术,深入理解底层的技术处理细节必不可少。对核心概念和思想的掌握可以帮助我们举一反三、触类旁通,有助于提升我们对整个Java平台的理解力。这里所介绍的是Java技术平台的几个核心概念,其中所蕴含的思想有助于我们更深刻的理解Java技术。

关键字:Java;虚拟机;Class文件;API;

1 引言

Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程[1]  。
Java具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点[2]  。Java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等[3]  。

2 Java虚拟机

Java虚拟机的主要任务是装在class文件并且执行其中的字节码。Java虚拟机包含一个类装载器,它可以从程序和API中装载class文件。Java API中只有程序执行时需要的那些类才会被装载。字节码由执行引擎来执行。   不同的Java虚拟机中,执行引擎可能实现得非常不同。在由软件实现的虚拟机中,最简单的执行引擎就是一次性解释字节码。另一种执行引擎更快,但是也更消耗内存,叫做"即时编译器(just-in-time compiler)"。在这种情况下,第一次被执行的字节码会被编译成本地机器代码。编译出的本地机器代码会被缓存,当方法以后被调用的时候可以重用。第三种执行引擎是自适应优化器。在这种方法里,虚拟机开始的时候解释字节码,但是会监视运行中程序的活动,并且记录下使用最频繁的代码段。程序运行的时候,虚拟机只把那些活动最频繁的代码编译成本地代码,其他的代码由于使用得不是很频繁,继续保留为字节码-由虚拟机继续解释它们。一个自适应的优化器可以使得Java虚拟机在80%~90%的时间里执行被优化过的本地代码,而只需要编译10%~20%的对性能有影响的代码。   当Java虚拟机是由主机操作系统上的软件实现的时候,Java程序通过调用本地方法(native method)和主机交互。Java中有两种方法: Java方法和本地方法。Java方法是由Java语言编写,编译成字节码文件,存储在class文件中的。本地方法是由其他语言(比如c,c++或汇编语言)编写的,编译成何处理器相关的机器代码。本地方法保存在动态链接库中,格式是各个平台专有的。运行中Java程序调用本地方法时,虚拟机装载包含这个本地方法的动态库,并调用这个方法。本地方法是联系Java程序和底层主机操作系统的连接方法。

 
图1 Java虚拟机工作原理

   通过本地方法,Java程序可以直接访问底层操作系统的资源。一个本地方法接口(Java Native Interface, JNI)-使得本地方法可以在特定主机系统的任何一个Java平台实现上运行。   如果希望使用特定主机上的资源,它们又无法从Java API访问,那么可以写一个平台相关的Java程序来调用本地方法。如果希望保证程序的平台无关性,那么只能通过Java API来访问底层系统资源。

3 类装载器的体系结构 
   一个Java应用程序可以使用两种类装载器:"启动(bootstrap)"类装载器和用户定义的类装载器。启动类装载器(这是系统中唯一的)是Java虚拟机实现的一部分。启动类装载器通常使用某种默认方式从本地磁盘中装载类,包括Java API类(启动类装载器也被称为原始类器、系统类装载器或者默认类装载器)。   Java应用程序能够在运行时安装用户定义的类装载器,这种类装载器能够使用自定义的方式来装载类。例如,从网络下载class文件。尽管启动类装载器是虚拟机实现的本质部分,而用户定义的类装载器不是,但用户定义的类装载器能够用Java来编写,能够被编译成class文件,能够被虚拟机装载,还能够像其它对象一样实例化。   由于有用户定义类装载器,所以不必再编译的时候就知道运行中的Java应用程序中最终会加入的所有的类。用户定义的类装载器使得在运行扩展Java应用程序成为可能。当它运行时,应用程序能够解决它需要哪些额外的类,能够决定是使用一个或是更多的用户定义的类装载器来装载。由于类装载器是用Java编写的,所以用任何在Java代码中可以表述的风格来进行类装载。这些类可以通过网络下载,可以从某些数据库中获取,甚至可以动态生成。   每一个类被装载的时候,Java虚拟机都监视这个类,看到它到底是被启动类装载器还是被用户定义类装载器装载。当被装载的类引用了另外一个类时,虚拟机就会使用装载第一个类的类装载器装载引用的类。例如,如果虚拟机使用一个特定的类装载器装载Volcano这个类,它就会使用这个类装载器装载Volcano类使用的所有类。   由于Java虚拟机采取这种方式进行类的装载,所以被装载的类默认情况下只能看到被同一个类装载器装载的别的类。通过这种方法,Java的体系结构允许在一个Java应用程序中建立多个命名空间。运行时的Java程序中的每一个类装载器都有自己的命名空间。   Java应用程序可以创建多少个(或多少种)被不同的类装载器装载的类存放在不同的命名空间中,它们不能相互访问,除非应用程序显示地允许这么做。当编写一个Java应用程序的时候,从不同源文件装载的类可以分隔在不同的命名空间中。通过这种方法,就能够使用Java类装载器的体系结构来控制任何不同源文件中装载的代码之间的相互影响,特别是能够阻止恶意代码获取访问或破坏善意代码的权限。   Web浏览器是一个动态扩展的例子,Web浏览器使用用户定义的类装载器从网络下载用于Java applet的class文件。Web浏览器使用一个用来安装用户定义类装载器的Java应用程序。这个用户定义的类装载器通常被称为Java Applet类装载器,它知道如何向HTTP服务器请求class文件。Java Applet可以作为动态扩展的例子,因为Java应用程序并不知道它什么时候会开始从网络下载浏览器请求的class文件。只有当浏览器遇到有Java applet的页面时,才决定是否需要下载class文件。   Web浏览器启动的Java应用程序通常为每个提供class文件的网络地址分别创建不同的用户定义类装载器,因此,不同的用户定义类装载器装载不同来源的class文件。这就可以把它们分别放置在Java主机应用程序的不同命名空间之下。由于不同来源的Java applet文件放置在不同的命名空间中,恶意的Java applet代码就不会直接访问从别的地方下载的class文件。这就能够限制或阻止不同来源的代码之间的相互访问。

 
图2 类装载器的体系结构

4 Java class 文件 
   Java class文件主要在平台无关性和网络移动性方面使Java更适合网络。它在平台无关性方面的任务是:为Java程序提供独立于底层主机平台的二进制形式的服务。这种途径途径打破了C或者C++等语言所遵循的传统,使用这些传统语言写的程序通常首先被编译,然后被连接成单独的、专门支持特定硬件平台和操作系统的二进制文件。通常情况下,一个平台上的二进制可执行文件不能在其他平台上工作。而Java class文件时可以运行在任何支持Java虚拟机的硬件平台和操作系统上的二进制文件。

 
图3 Java类文件
   当编译和连接一个C++程序时,所获得的可执行二进制文件只能在指定的硬件平台和操作系统上运行,因为这个二进制文件包含了对目标处理器的机器语言。而Java编译器把Java源文件的指令翻译成字节码,这种字节码就是Java虚拟机的"机器语言"。   class文件设计得紧凑,因此它们可以快速地在网络上传送。其次,由于Java程序是动态连接和动态扩展的,class文件可以在需要的时候才下载。这个特点使得Java应用程序能够安排从网络上下载class文件的时间,从而可以最大限度地减少终端用户的等待时间。
 
图4 Java API

5 Java API  
API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。
远程过程调用(RPC):通过作用在共享数据缓存器上的过程(或任务)实现程序间的通信。
标准查询语言(SQL):是标准的访问数据的查询语言,通过通用数据库实现应用程序间的数据共享。
文件传输:文件传输通过发送格式化文件实现应用程序间数据共享。
信息交付:指松耦合或紧耦合应用程序间的小型格式化信息,通过程序间的直接通信实现数据共享。
当前应用于 API 的标准包括ANSI 标准SQL API。另外还有一些应用于其它类型的标准尚在制定之中。API 可以应用于所有计算机平台和操作系统。这些API 以不同的格式连接数据。每种数据格式要求以不同的数据命令和参数实现正确的数据通信,但同时也会产生不同类型的错误。因此,除了具备执行数据共享任务所需的知识以外,这些类型的API 还必须解决很多网络参数问题和可能的差错条件,即每个应用程序都必须清楚自身是否有强大的性能支持程序间通信。相反由于这种API 只处理一种信息格式,所以该情形下的信息交付API 只提供较小的命令、网络参数以及差错条件子集。正因为如此,交付API 方式大大降低了系统复杂性,所以当应用程序需要通过多个平台实现数据共享时,采用信息交付API 类型是比较理想的选择。   Java API通过支持平台无关性和安全性,使得Java适应于网络应用。Java API是运行库的集合,它提供了一套访问主机系统资源的标准方法。运行Java程序时,虚拟机装载程序的class文件所使用的Java API class文件。所有被装载的class文件(包括从应用程序中和从Java API中提取的)和所有已经装载的动态库(包含本地方法)共同组成了再Java虚拟机上运行的整个程序。

 
图5 Java集合类的关系图
   在一个平台能偶支持Java程序以前,必须在这个特定平台上明确地实现API的功能。为访问主机上的本地资源,Java API调用了本地方法。由于Java API class文件调用了本地方法,Java程序就不需要再调用它们了。通过这种方法,Java API class文件为底层主机提供了具有平台无关性、标准接口的Java程序。对Java程序而言,无论平台内部如何,Java API都会有同样的表现和可预测的行为。正是由于在每个特定的主机平台上明确地实现了Java虚拟机和Java API,因此,Java程序自身就能够成为具有平台无关性的程序。   Java API在Java安全性模型方面也有贡献。当Java API的方法进行任何有潜在危险的操作(比如进行本地磁盘写操作)之前,都会通过查询访问控制器来检验是否得到了授权。访问控制器是一个类,该类用来执行栈检验,已决定是否允许某种操作。

6  Java的特点
Java有以下特点:
1.简单(Simple):制定Java的原则之一,是要建立一种结构简单而且使用容易的系统,可以让用户不必接受很深的训练就可以开始设计程序,所以Java的语法尽可能与在当前许多程序设计师都采用的C及C++语言相似。并且,Java删除了C及C++许多极少使用、不易理解或常被混淆的功能,多多重继承、指针等。
2.面向对象(Object-Oriented)  面向对象是近年来信息界广为使用的概念和技术。它有许多良好的特性。对象的封装性可以使对象的接口定义明确;继承性可以增加软件的可重用性,有助于分类及模版设计等。实现面向对象的概念及其各种良好的特性是Java的设计理念之一。
3.分布式(Distributed)计算机网络的发展使得信息应用朝着分布式的环境发展,所以现代的信息开发语言及环境要有配合分布式的特性及功能。Java具有一个网络功能的程序库,其中包含与如HTTP和FTP等TCP/IP网络通信协议整合的能力。
4.强壮性(Robust)  由Java所编写的程序要能在各种情况下运行,而且必须具有高的稳定性。Java在制定时即加入了能防止存储器被覆写和数据损坏的相关处理机制。
5.安全性(Secure)  Java是被设计用于网络及分布式环境中的,所以安全性是一个很重要的考虑。Java拥有数个从简单到复杂的安全保护措施,能有效地防止病毒的侵入和破坏行为的发生。
6.结构中立性(Architecture Neutral) 在网络上存在许多不同类型的计算机,从中央处理器到操作系统的机构均有很高的差异性。因此要使应用程序在每一种机器上均能运行是相当困难的。针对这个目的,Java的编译器可以产生一种结构中立的目标码文件格式――字节码(Byte Code)。这种字节码可以在许多种不同的计算机上运行。
7.多线程(Multithreaded)  多线程是开发复杂和功能强大的程序所必须的手段之一,Java同样支持这个重要功能。
源文件:使用一个文本编辑器,如Edit或记事本来编写源文件。不可使用Word编辑器,因为它含有不可见字符。将编好的源文件保存起来,源文件的扩展名必须是Java。
编译器:源文件要经过编译器(Javac.exe)的编译生成可扩展名为.Class的字节码文件。
字节码文件是由与平台无关的二进制码组成的,执行时由解释器解释成本地机器码。
运行Java程序:Java程序分为两大类——Java应用程序(Application)和
Java小应用程序(Applet)。Java应用程序必须通过Java解释器(java.exe)来解释执行其字节码文件;Java小应用程序可通过支持Java标准的浏览器来解释执行。

7 总结


Java 语言是一门随时代快速发展的计算机语言程序,其深刻展示了程序编写的精髓,加上其简明严谨的结构及简洁的语法编写为其将来的发展及维护提供了保障。由于提供了网络应用的支持和多媒体的存取,会推动Internet和企业网络的Web的应用[50]  。另外,为了保持Java的增长和推进Java社区的参与,Sun公司在Java One开发者大会上宣布开放Java核心源代码,以鼓励更多的人参与到Java社团活动中。来自Java社团和IBM等全球技术合作伙伴两方面的支持,Java技术在创新和社会进步上继续发挥强有力的重要作用[51]  ,并且随着其程序编写难度的降低使得更多专业人员将精力放置于Java语言的编写与框架结构的设计中[3] 。


 

你可能感兴趣的:(java)