Java游戏编程基础试卷

Java游戏编程基础试卷
Java游戏编程基础试卷

《Java游戏编程基础》期末考试试卷

专业班级:网络工程专业2011级1-2班考试时间:2014年12月(开卷)

班级:学号:姓名:

试题一:描述游戏设计的基本流程,并结合近年来游戏产业的发展状况,分析游戏设计行业的发展趋势。(20分)

答:游戏设计的基本流程包括游戏策划、游戏美术设计、游戏音频设计、游戏程序设计和游戏测试。

游戏行业是一个新兴的朝阳产业,经历了20世纪末的初期形成期阶段,以及21世纪初的快速发展,现在中国的网络游戏产业处在成长期并快速走向成熟期的阶段。

我国网络游戏产业呈现快速稳定的良好发展态势,不仅形成日渐完善的产业链和相对成熟的产业发展环境,而且本土原创网络游戏在实现由量变到质变跨越同时,积极拓展海

、外市场。网络游戏在游戏品种、数量、题材类型、市场规模和从业人员数量等方面,都实现了持续快速的增长。由单一大型多人在线到网页游戏、社区游戏、手机网游等新品种不断的涌现,由以魔幻类游戏题材为主到益智、军事等游戏投放市场。

根据国家文化部的统计,2013年,我国网络游戏市场规模(包括互联网游戏和移动网游戏市场)达到819.1亿元,同比增长36.3%。其中,客户端游戏和网页游戏市场规模为690.9亿元,同比增长28.9%;移动网游戏市场规模为128.2亿元,同比增长97.2%。

2014年上半年,中国网络游戏市场环比增长10%,全行业市场规模达到518.1亿元人民币。在上半年中国网络游戏市场规模构成中,客户端游戏依然占据市场最大份额,达到287.19亿元;移动游戏在过去两年得到高速发展,至2014上半年市场规模达到125.19亿元,超越网页游戏近20亿的规模,而移动游戏未来的增长速度将更加迅猛,成为拉动中国网络游戏市场增长的主要动力。

截至2013年底,中国网民规模达6.18亿,互联网普及率为45.8%,未来将更多人走向网络。而随着3G技术应用的日益普及,移动终端性能和使用率的不断提升,以及国家三网融合战略的深入实施,网游产业将获得更为便捷高效的技术支撑。

试题二:阐述Java面向对象编程思想在游戏编程中的作用,并结合具体示例进行说明。(25分)答:作用:因为游戏世界通常是由各种各样的物体组成,比如人物、场景、障碍等,而这些都可以看做是各种不同的对象而这些都可以看做是各种不同的对象,所以按照Java面向对象编程思想,则一切皆为对象,游戏中的每一种实体都可以抽象为类,并通过实例化来生成一个和多和对象,通过面向对象编程思想来进行抽象和封装,从而大大提高程序的可复用性和可扩展性。

面向对象三要素:封装,继承和多态。其中封装指的是将对象的实现细节隐藏起来,然后通过一些公用方法来暴露该对象的功能;继承是面向对象实现软件复用的重要手段,当子类继承父类后,子类作为一种特殊的父类,将直接获得父类的属性和方法;多态指是的子类对象可以直接赋给父类变量,但运行时依然表现出子类的行为特征。游戏编程中的最小单位是类。类也是封装的基本单位,系统功能的实现主要是通过类与类之间的联系来实现的。下面通过游戏贪吃蛇来说明Java面向对象编程思想在游戏编程中的作用

下面以《贪食蛇》游戏为例设计以下几个类:

(1)主框架类(GameFrame):作为游戏的顶层容器和游戏程序的入口点。

(2)游戏面板类(GamePanel):作为游戏画面的显示组件,同时用来运行游戏循环,并对用户的输入事件进行处理。

(3)贪食蛇类(Snake):作为贪食蛇的封装类,用来设置贪食蛇的属性,并对其运动逻辑进行更新,同时对其图形进行绘制。

(4)实物类(Food):作为食物的封装类,用来设置食物的属性,并对其运动逻辑进行更新,同时对其图形进行描绘。

贪吃蛇的核心算法是如何实现移动和吃掉食物,在没有碰到食物的时候,把当前运动方向上的下个节点入队,然后把头指针所指的节点出队,这样就可以达到移动的效果。而在迟到食物的时候,则只需要把食物入队即可。实现贪吃蛇的基本的蛇身移动、吃到食物的身体增长和碰到墙壁的停止运行。主要的类有:点Point,蛇Snack和牢笼Field,还有一个测设类Test。其中Point类是Snack类的一个私有属性,是组成蛇的一部分,而蛇Snack 类又是牢笼Field类的一个私有属性。这四个类之间并不是彼此孤立的,需要相互发送消息来进行联系,这可以通过Java的引用传递机制来实现。

试题三:针对Java游戏编程的某一个主题(程序框架、运行机制、场景设定、角色设定、声音设定、关卡设定等),阐述其基本原理。(25分)

答:声音设定基本原理:声音的本质是声波,因而在计算机中声音的基本表现形式是波型表示,声波拥有两个基本属性,一个是振幅,另一个是频率。前者决定了音量的大小,后者则决定了音调的高低。

计算机提供了不同类型的声音文件,很多软件都能够对声音文件进行设置和编辑操作。

下面以W A V文件的播放为例来进行说明。首先要打开声音文件并读取其中的信息,这主要包括如下几个步骤:

(1)新建一个文件对象来保存WA’V文件数据。

File file=new File(“sound.wav”);

(2)将W A V文件转换为音频输入流。

AudioInputStream stream=AudioSystem.getAudioInputStream(file);

(3)获取音频格式。

AudioFormat format=stream.getFormat( );

众所周知,Java通过流对象(Stream)来统一的处理输入与输出数据,声音数据也不例外,处理声音数据输入的流类叫做AudioInputStream ,它是具有指定音频格式和长度的输入流。除此之外,还需要使用AudioSystem类,该类用于充当取样音频系统资源的入口点,提供许多在不同格式间转换音频数据的方法,以及在音频文件当和流之间进行转换的方法。

AudioSystem 类包括许多操作AudioInputStream 对象的方法。AudioFormat 类则是在声音流中指定特定数据安排的类。通过检查以音频格式存储的信息,可以发现在二进制声音数据中解释位的方式。

获取声音文件之后接下来就能够对声音数据进行播放了,这涉及以下几个步骤:

(1)设置音频行信息。

https://www.360docs.net/doc/d917329723.html, info=new https://www.360docs.net/doc/d917329723.html,(Clip.class,format);

(2)建立音频行。

Clip clip=(Clip)AudioSystem.getline(info);

(3)将音频数据流读入音频行。

clip.open(stream);

(4)播放音频行。

Clip.start( );

在播放声音数据时需要借助Line接口和Clip接口来实现。Line接口表示单声道或多声道的音频供给,其子类DataLine包括一些音频传输控制方法,这些方法可以启动、停止、消耗和刷新通过数据行传入的音频数据。而DataLine的成员对象Info则提供音频数据行的信息,主要包括数据行支持的音频格式信息以及其内部缓冲区的最小值和最大值等。

Clip接口表示特殊种类的数据行,该数据行的音频数据可以再播放前加载,而不是实时流出。声音数据的播放可以分别使用start( )和stop( )方法来开始和终止,这些方法不需要重新设置介质的位置,但需要注意的是,start( )方法将会从播放最后终止的位置继续播放。

试题四:选择一款自己熟悉的小游戏进行案例分析,详细阐述其设计与实现的过程。(30分)答:钢琴游戏的设计与实现过程如下:

1)基本功能设计

1、钢琴游戏的类结构

打开控制板piano_begin项目,可以看到游戏类图。类图表明了钢琴游戏的类结构,其中有一个钢琴界面类Piano和琴键类Key其中Panio类中已经加载了一张木纹图像作为游戏界面。目前还没有生成琴键对象,因此Piano界面上看不到任何琴键。

接下来要进行如下工作。首先在木纹图像上画出一个个琴键,然后给每个琴键编写演奏的方法,让琴键可以弹奏出一个音符。接下来设计Key类表示琴键,让Key类继承自Actor类。Piano_begin项目已经构建了一个简单的游戏框架,查看Piano类的代码可以看到其中只有一个构造方法Piano(),具体如下:

public class Piano extends World{

public Piano( ) { //Piano类的构造方法

Super(800,340,1);

}

}

接下来的任务是完善琴键类Key,包括Key类中act()等方法。之后在游戏场景界面类Piano里去生成所有的琴键对象,并将它们添加到场景界面中,便完成了模拟钢琴游戏的制作。

2、创建一个琴键对象

Key类代码如下:

public class Key extends Actor{

Public Key( ) {

}

Public void act( ){

}

}

Key类中只有两个空白的方法,即Key()方法和act()方法,其中后者是钢琴的琴键所对应的动作方法,而前者则是Key类的构造方法。

右击Key类,可以在木纹图像界面上“绘制”一个琴键对象,但该琴键对象并不能被保存到项目中,即使单击“编译全部”按钮,也不能将此对象保存下来。当再次打开piano_begin项目时,会不能看见界面上的这个琴键对象。原因是目前的操作知识图像界面上的操作,还没有将其写成代码并保存到项目中去。因此,只有在程序代码里面完成了琴键对象的实例化后,才能在程序界面上显示出“绘制”的琴键。

现在需要生成Key类的一个对象,并且能够在钢琴界面上显示该对象,这就需要使用newKey()语句来实例化一个琴键对象。打开Piano类的代码窗口,在钢琴类构造方法Piano()里面的“super(800,340,1);”语句之后添加以下一行代码:

Keykey_=newKey();

然后单击“编译全部”按钮,再打开游戏场景界面,会发现没有任何变化。一般来说,只要执行了newKey()语句,内存中就创建了一个Key类的对象。但目前还需要一条语句来将他显示在钢琴场景界面上,而这需要调用Greenroot提供的addObject()方法。因此,在生成琴键对象后,要调用addObject()方法将key_g对象添加到游戏场景中,这样才能看到“绘制”出的琴键。具体代码如下:

publicclassPianoextendsWorld{

PublicPiano(){

Super(800,340,1);

Keykey_g=newKey();

addObjcet(key_g,300,180);

上面的

3、实现琴键的动画效果

4、给琴键添加声音效果按下G键,发出“哆”的声音

准备声音文件“3a.wav”

在key类的act()方法中添加如下代码:

public void act() {

if( Greenfoot.isKeyDown("g")){ //如果按下g键

Greenfoot.playSound("3a.wav"); //演奏声音文件“3a.wav”

setImage("white-key-down.png"); //显示键被按下的效果图片

}

else{

setImage("white-key.png"); //显示键被松开的效果图片

}

}

5完善琴键的声音效果

如果一直按住G键,琴键对应的声音文件连续播放

现实中的钢琴演奏是按下一个琴键,钢琴奏出一个音符,这个音符的长度不受琴键被按下的时间长短所控制。

解决办法是先声明一个变量,用这个变量记录下某个琴键是否被按下的状态,然后在if条件判断时考虑这个状态变量的情况。

通常人们将这种记录某个对象的状态值的变量称为标记变量,大多数情况下,标记变量是个boolean类型的变量,它只有true或false两种状态。

2)1添加更多琴键

每个琴键对象对应一个电脑键盘按键和一个声音文件。

钢琴有几十个键,需要在Key类的act()方法里面用几十组if语句来为每个琴键对象指定其电脑按键和声音文件,势必act()方法的代码会很长很复杂,有很多的代码重复。

能不能在实例化生成每个琴键对象时,就指定这个琴键对象的电脑按键和声音文件呢?

即编写一个通用的Key()构造器,使它能够将电脑按键和声音文件作为参数传入到构造器中,如Key(String keyName,String soundFile),这样在创建每个琴键对象时就为其指定了电脑按键和声音文件。

2用循环添加多个琴键

实现了通用的琴键Key构造器,就可实现多个琴键了

int i = 0;

while (i < 12) {

Key key = new Key( “g”, “3a.wav);

addObject(key, 54 + (i*63), 140); //每隔63个像素绘制一个琴键

i = i + 1;

}

3用数组来完善钢琴游戏

目前为止,所有的琴键都是G键

如何生成每个都不一样的琴键呢?

即前面的循环语句中,如何向Key构造器中传入不同的键名和声音文件

Key key = new Key( “键名”, “声音文件);

最好的办法是数组

循环中需要每次循环传入不同的值,最好的办法是数组

因为把数组的下标作为循环变量,就使得数组和循环二者结合起来了

4绘制黑色琴键

黑色琴键是对应白色琴键的升半调音符

设计一个黑色键名数组和一个黑色键音符文件名数组

与白色键一样,黑色键也有两张图像

在生成琴键对象的时候,就将琴键所对应的效果图片传入到其构造器中

不用担心要在Key类的act()方法中使用麻烦的if语句来区分是黑色还是白色琴键

使得Key类的act()方法更具通用性,使得程序更加易于扩展,如容易继续添加其它类型的按键

相关主题
相关文档
最新文档