Anda di halaman 1dari 22

游戏程序设计报告

专业:软件工程二班

学号:201113040209

姓名:张鹏飞

指导老师:邓飞

1
目 录

1 绪论

1.1 选题目的及意义(或:本课题的开发背景)

1.2 系统概述

1.3 人员组成及分工

2 需求分析

3 总体设计

4 详细设计

5 系统实现

5.1 开发环境

5.2 关键技术

5.3 运行结果

6 软件测试

总结

参考文献

2
1 绪论

1.1 选题目的及意义

本学期我们开设了 Java 课程,这门课对于网络工程专业来说,是一门


十分重要的专业必修课程。然而单纯对书本知识的学习仅仅让我们对
课本理论进行了认识与理解,并不代表我们真正掌握了 Java 的相关知
识。因此,我们成立了小组编写塔防小游戏,这个课题拥有一定的趣
味性,通过分工合作与交流学习巩固所学知识,将其付诸实践,学以
致用才能更加深刻地掌握 Java 程序设计的知识,从而达到熟练地应用,
通过从设计到运行的过程,我们可以锻炼提高自己的耐心以及对问题
的解决处理能力,使我们更好的把握这门课程,也加强了组员之间的
学习交流。

1.2 系统概述

实现能更换地图,任意定制属性参数,实现根据二进制描述的地图
自动寻找进攻路径,实现石材、木材、食物转换系统,实现包括单体快
速攻击的机枪塔、群体攻击的炸弹塔、减速塔、发射自动跟踪导弹的导
弹塔、远距离攻击的狙击塔、群体攻击的射线塔以及激光塔等在内的建
筑系统。

2 需求分析

现代网络上有太多的激烈型的网络游戏,偏益智类型的不多,小型
的、需要精心分析布局的更少之又少。

3 总体设计

3.1 本系统的主要功能

智力分析游戏

3.2 主要分布

3
如上图,对于一个塔防游戏而言,处理人物属性、行走路径、炮塔的种类、
攻击范围以及对象是要点,为了便于更换地图,把地图的数据结构定义为:
地图{
地图图片资源;
描述地图的整数型二维数组;
出发点坐标;
结束点坐标
};地图资源主要用 PS 绘制。
对于工人,工人之间的差别只有生命值、移动速度、防御力、攻击力、杀
死奖励等,因而不需要构建多个类,所有工人可共用一个 Peon 类.
对于武士,也只有生命值等,共用一个 Monster 类。
对于房子、房子类型、声音、工作分工、树木等光影效果,由于各自之间
相差甚远,故分别采用不同的类实现;
对于石材、木材、食物的管理及读取,定义了一个 Resources 类以统管和
计数。
3. 3 界面设计:
菜单界面设计如下:

4
点击关卡后进入游戏界面:

4 详细设计

5
4.1 设计思路流程图

主类

建立游戏窗口

创建游戏菜单面板

游戏面板

菜单面板

结束游戏

6
4.2 敌人移动实现流程

完成任

玩家 hp=die 返回

上移 Cur_y- Crct y=72


M
-
Hp<=0

结束游戏
Cur_y++ crct_y=108
下移

P
hp<=0
左移 Cur_x++ Crct x=0

返回 fiase

右移 Cur_x-- Crct_x=3
6
获取下一步动作

4.3 程序中的主类

1.class Monste 敌人类,实现敌人的移动,寻找目标,状态等。

public class Monster extends Entity

7
public Monster(double x, double y)

super(x, y, 2D);

rot = 0.0D;

moveTick = 0.0D;

wanderTime = 0;

hp = 100;

maxHp = 100;

rot = random.nextDouble() * 3.1415926535897931D * 2D;

moveTick = random.nextInt(12);

2.class Bitmaps 实现地图绘制。

public class Bitmaps

public Bitmaps()

public void loadAll()

throws IOException

8
{

logo = ImageIO.read(Bitmaps.class.getResource("/logo.gif"));

wonScreen =

ImageIO.read(Bitmaps.class.getResource("/winscreen.gif"));

BufferedImage src =

ImageIO.read(Bitmaps.class.getResource("/sheet.gif"));

trees = new BufferedImage[16];

for(int i = 0; i < 16; i++)

trees[i] = clip(src, 32 + i * 8, 0, 8, 16);

farmPlots = new BufferedImage[9];

for(int i = 0; i < 9; i++)

farmPlots[i] = clip(src, 32 + i * 8, 88, 8, 8);

3.class InfoPuff 信息类,实现信息的储存与更新。

public class InfoPuff extends Entity

public void updatePos(double sin, double cos, double alpha)

super.updatePos(sin, cos, alpha);

yr -= 2D;

9
public InfoPuff(double x, double y, int image)

super(x, y, -1D);

z = 0.0D;

this.image = image;

z = 12D;

za = 0.29999999999999999D;

life = 0;

lifeTime = 80 + random.nextInt(60);

4.class Tree 实现树的生长速度,位置等。

public class Tree extends Entity

public Tree(double x, double y, int age)

super(x, y, 4D);

stamina = 0;

yield = 0;

yield = stamina = this.age = age;

spreadDelay = random.nextInt(30000);

10
5.class House 实现房子的类型,消耗及生成各项指标。

public class House extends Entity

public House(double x, double y, HouseType type)

super(x, y, type.radius);

buildDuration = 192;

animFrame = 0;

maxHp = 256;

hp = maxHp;

this.type = type;

6.Class sounds 实现游戏中各种声音的控制。

public abstract class Sound

public static class Death extends Sound

protected void fill(int buffer[], int len)

for(int i = 0; i < len;)

11
{

double rate = 3000 - (((p * 100) / duration) * p) /

duration;

rate /= 2D;

noise += (random.nextDouble() * 200D - 100D -

noise) * 0.59999999999999998D;

double smp2 = Math.sin((((double)p * rate) / 44100D)

* 3.1415926535897931D * 2D) * 120D;

double smp1 = noise;

double smp = smp1 + ((smp2 - smp1) * (double)p) /

(double)duration;

buffer[i] += ((int)smp * (duration - p)) / duration;

i++;

p++;

7.class TowerApplet 布局及面板控制。

public class TowerApplet extends Applet

public TowerApplet()

12
{

public void init()

setSize(800, 480);

tower = new TowerComponent(getWidth() / 2, getHeight() / 2);

setLayout(new BorderLayout());

add(tower, "Center");

public void start()

tower.unpause();

public void stop()

tower.pause();

13
public void destroy()

tower.stop();

private static final long serialVersionUID = 1L;

private TowerComponent tower;

8.class Resources 资源类,包括 imag 和 color。

public class Resources

public Resources()

wood = 100;

rock = 100;

food = 100;

public void add(int resourceId, int count)

switch(resourceId)

14
{

case 0: // '\0'

wood += count;

break;

case 1: // '\001'

rock += count;

break;

case 2: // '\002'

food += count;

break;

15
5 系统实现

5.1 开发环境

操作系统:Microsoft Windows XP

程序语言:Java1.6

开发包: Open JDK1.6

IDE: MyEclipse8.5

5.2 关键技术

1.MyEclipse

.MyEclipse 其实 对那些软件开发者来说,这就是个代名词,使它们利器
的著作者和原材料。软件也是由它的软件组合开发出来的,.MyEclipse 用于开
发 java,J2EE 的.Eclipse 插件集合,它的功能十分强大也十分广泛。

MyEclipse 不断发展的版本:

(1)MyEclipse5.0 版本智能、更快捷、更简单和更便宜的 J2EE 工具的新


版本的诞生。

(2)MyEclipse 6.XGA 版本改进了 Java EE 5 和 Spring 功能部件 、对


Spring 2.0 升级,增强配置管理功能、增强了 JavaScript 调试 、一键安装
MyEclipse Java EE 示例项目。

(3)MyEclipse 7.0 版本提供的支持包括:Eclipse 3.4.1/Ganymede、REST


web 服务、新的 myeclipse 操作板、spring 工具集更新、集成 Manven2、open JPA
支持、高级 javascript 工具、专业的 jsdt 实现、报表工具加强、jsf 和 ICEfaces
工具更新

(4)MyEclipse 8.0 版本 Java 事件探查器支持探查 Eclipse 插件、可以


自定义插件加载可以管理 MyEclipse 模块、增强了对报表的支持,升级了 BIRT2.5。

(5)MyEclipse 8.5 版本该版本集成了 Eclipse 3.5.2,提升了团队协作


开发、开发周期管理以及 Spring 和 Hibernate 的更好支持。

(6)MyEclipse 9.0 版本支持 HTML5 和 JavaEE 6

(7) MyEclipse 10.0 版本 MyEclipse10 对检索功能以及错误查询功能更


加强大,包括对 js 文件的错误查询。就目前本人的体验来说,最大的变化莫过

16
于软件安装界面,推荐使用 link 方法进行插件安装,方便快捷。

在这里我们应用的为 MyEclipse 8.5。

2.java JDK1.6

我们通常用的,以及本次游戏开发用的为 JDK1.6,下面为关于 Sun JDK,大致可


以分作如下几个阶段:

关于 Sun JDK,大致可以分作如下几个阶段:

*1996 年 1 月,JDK 1.0,JDK 的首个版本。

*1996 年 12 月,JDK 1.1,重写 AWT(引入新的事件模型),JavaBean 组件规范,


inner class,math 包

*1998 年,JDK 1.2,Swing,Java 2D,Collection Framework

*1998-1999,JDK 被从 Java Development Kit 更名为 Java 2 SDK,Java 技术被


进一步分为 J2SE,J2EE,J2ME 三个方向

*2000 年,J2SE 1.3,引入 HotSpot 技术

*2002 年 2 月,J2SE 1.4,首个 JCP 参与的 J2SE 发布版本,assert,Java Plug-in,


Web Start,DOM[level 2],SAX 2.0,JDBC 3.0

*2004 年 9 月 30 日,J2SE 5.0,泛型,元数据,其他语法特性,线程库,JDBC


*2006 年,J2SE 6.0

现在还有比 6.0 更高的版本。

5.3 运行结果

17
6 软件测试

6.1、运行程序,进入菜单面板,测试鼠标经过及按下按钮时图案绘制是否
正常:

上图:鼠标经过时绘制正常

上图:鼠标按下时绘制正常

6.2、进入房子选择界面,测试鼠标经过按钮时绘制是否正常、选择房子

后能否正确建立游戏:

18
上图:鼠标未选择房子时,一片空地

上图:鼠标成功选择房子并由工人建成
6.3、测试建筑建筑选中、建筑升级、建筑删除后,指标改变是否正常:

上图:各项资源指数正常改变
6.4、当鼠标停在海面时,地图方向改变是否正常:

19
上图:鼠标放置前

上图:鼠标放置后

6.5、稳定性测试:持续运行 318 Wave、半小时后无异常抛出:

20
总结

经过一个学期的 JAVA 学习,对 JAVA 编程有了一定的认识,在做这个课程设


计的时候,刚开始感觉自己无从下手,不知道该怎么开始,很茫然。最终利用网
络资源和查阅图书馆的书籍,在老师和同学的指导和讨论下,经过一段时间终于
完成了这个设计。当程序运行结束看到弹出的计算器的界面时,感到很欣慰,虽
然只是一个小小的东西,但却是自己起步的成就,从中学到了很多书本知识不能
体现的东西,对 JAVA 的学习有了一定的兴趣。也通过这次的程序设计感觉到自己平
时对于编程实际操作的贫乏,没有把书本上的知识真正的掌握牢固

参考文献
林良信 《Java JDK 6 学习笔记》

刘浦迎 谢春 《java 程序设计实用教程》 科学出版社


张白一 崔尚林 《面向对象程序设计—java》 西安电子科技大学出版社
潘浩 李芙玲 《Java 程序设计》 清华大学出版社

21
22

Anda mungkin juga menyukai