最新消息: USBMI致力于为网友们分享Windows、安卓、IOS等主流手机系统相关的资讯以及评测、同时提供相关教程、应用、软件下载等服务。

JAVA课程设计坦克大战游戏(含代码)

IT圈 admin 49浏览 0评论

2024年3月9日发(作者:百里黎明)

Java课程设计

任 务 书

简单电子游戏坦克大战的设计

1、主要内容:

设计一个简单的坦克大战电子游戏,可以允许多位玩家在局域网

中同时对战

2、 系统要求:游戏具有图形游戏界面,能让用户看到游戏所给出的反馈。

有人机交互功能,使用户操作指定的游戏元素,并且坦克具有生命值,能

攻击敌方,无法攻击友方,而且坦克的攻击具有视觉效果!

3、 具体要求(包括技术要求等):

1.需要有图形游戏界面,让用户能看到游戏给出的反馈

2.有人机交互功能,使用户能操作指定的游戏元素

3.不同队伍的坦克,须显示不同外观,已分辨敌我

4.坦克能够开火,攻击敌方,但不能攻击队友

5需要有不可被子弹穿透的墙

6.坦克有生命值,并非被击中一次就会爆炸

7游戏结束后可重新开始

学习并掌握以下技术:Java、JavaBean 等

熟练使用以下开发工具:Myeclipse 等

实现系统上述的功能。

4、 进度安排:

12月28日 ~ 12月 29日:课程设计选题,查找参考资料

12月30日 ~ 1月1日: 完成系统设计和数据库设计

1月2日 ~ 1月4日: 完成程序代码的编写

1月4日 ~ 1月5日:系统测试与完善

1月5日 ~ 1月6日:完成课程设计报告,准备答辩

分工:

摘 要

随着计算机的普及以及对电子游戏的认识,电子游戏已被越来越多的人选作放松、娱乐的休闲方式;电子游戏既不需要专门购买游戏器材,也不需要宽阔的游戏场地,只需要一台能独立完成任务的计算机即可,它可以是人们工作、学习时用的计算机,并不需要另行配置,这比起传统休闲游戏即省钱又省事。局域网游戏更是可以将现实空间中零散的计算机,组织起来,使其在逻辑空间中集中起来,使游戏的组织、开展变得轻松。如此轻松而又安逸的休闲方式,使得越来越多的人尝试,甚至已经将电子游戏作为主要休闲方式,既然有如此多的人使用,那其中必然存在巨大的商机,即使人们不愿意为一个小小的休闲游戏花费金钱,但在游戏中添加广告、游戏相关服务也包藏了巨大的财富;当然电子游戏的制作如今已是空前的火爆,大大小小的游戏公司横空出世,都想在电子游戏制作这个行业里占据一席之地,而一款成功的电子游戏需要精心的策划、分析、设计,只有这样才能获得游戏中包藏的财富,以及做出一款真正能够让玩家娱乐、放松的游戏,而不是骗取玩家钱财的工具。

关键字:电子游戏;坦克大战;

- 1 -

目 录

一、 系统分析 ............................................................................................................................ - 1 -

可行性分析 .......................................................................................................................... - 1 -

需求分析 .............................................................................................................................. - 1 -

二、 概要设计 ............................................................................................................................ - 2 -

工作流程图 .......................................................................................................................... - 2 -

项目规划 .............................................................................................................................. - 3 -

开发及运行环境 .................................................................................................................. - 3 -

三、 详细设计与算法实现 ........................................................................................................ - 4 -

游戏主窗口 .......................................................................................................................... - 4 -

游戏元素 .................................................................................................... 错误!未定义书签。

四、 测试.......................................................................................................... 错误!未定义书签。

测试环境 ............................................................................................................................ - 17 -

测试结果 ............................................................................................................................ - 17 -

五、 软件截图 .......................................................................................................................... - 18 -

六、 总结.................................................................................................................................. - 21 -

七、 参考文献 .................................................................................................. 错误!未定义书签。

- 2 -

一、系统分析

可行性分析

技术可行性

软件使用swing、GUI、Socket、面向对象设计等技术实现,这些技术均已是非常成熟的技术,之前已有相当多使用这些技术的成功案例,故现使用这些技术是可行的。

经济可行性

本软件为免费软件,将免费提供软件的下载、运行和维护服务,软件暂无收入,待公布之后随着使用者越来越多,将添加相应的广告、服务,从而增加收入,若使用者寥寥无几,将再次分析是否重新策划软件或者放弃开发,以减少损失。

需求分析

通过反复研究以及市场调查,得知游戏须具有以下功能:

需要有图形游戏界面,让用户能看到游戏给出的反馈

不同队伍的坦克,须显示不同外观,已分辨敌我

坦克能够开火,攻击敌方

坦克有生命值

游戏结束时须判断哪一队胜利

游戏结束后可重新开始

游戏的操作、进度等须提供相应说明,以告知玩家

- 1 -

二、概要设计

工作流程图

程序开始

初始化游戏元素

根据游戏的元素属性,对其进行操作和绘出去图战斗结束?

- 2 -

项目规划

本游戏是一个典型的电子小游戏,应具有如下结构:

游戏主窗口

游戏的一切效果、进度、消息等都将由游戏主窗口展示

封装的游戏元素

游戏元素包括:坦克、子弹、等游戏必须的元素

开发及运行环境

开发时硬件环境

CPU:Inter P7350

显卡:NVIDIA GeForce 105M

内存:金士顿2G/DDR2-667

显示器:三星液晶14寸/分辨率:1280X800

开发时软件环境

操作系统:Windows7

JDK:1.5.0

IDE:Eclipse3.4.0

运行时硬件环境

CPU:Inter P7350

显卡:NVIDIA GeForce 105M

内存:金士顿2G/DDR2-667

运行时软件环境

操作系统:Windows 7

JRE:1.6.0

显示器:三星液晶14寸/分辨率:1280X800

- 3 -

三、详细设计与算法实现

游戏主窗口

游戏主窗口是人机交互的窗口,对玩家而言,他们只和游戏主窗口打交道,并不关心游戏内部是如何实现的,所以游戏主窗口部分最重要的便是游戏数据的输入、输出。

在程序中须创建一个类TankClient,继承自Frame来创建一个窗口。

游戏数据的输入

游戏中坦克需要能往上、下、左、右四个方向运动,故须设立4个按键,使其能操作坦克,另须设一个键控制坦克开火。为方便操作,本游戏设置方向键分别表示上下左右,空格表示开火。

具体实现为在TankClient类中添加内部的适配器类代码如下:

/**

* 方向键被按下后标记被按下的键

* @param e 键盘事件

*/

public void keyPressed(KeyEvent e) {

int keyCode = Code();

switch (keyCode) {

case _LEFT:

bL = true;

break;

case _UP:

bU = true;

break;

case _RIGHT:

bR = true;

break;

case _DOWN:

bD = true;

break;

case _CONTROL:

if (!issile())

fire();

break;

case _A:

superFire();

break;

case _F2:

tc = null;

new TankClient("TankClient", 50, 10, 3);

break;

}

- 4 -

locateDirection();

}

/**

* 方向键被松开后标记被松开的键

* @param e 键盘事件

*/

public void keyReleased(KeyEvent e) {

int keyCode = Code();

switch (keyCode) {

case _LEFT:

bL = false;

break;

case _UP:

bU = false;

break;

case _RIGHT:

bR = false;

break;

case _DOWN:

bD = false;

break;

}

locateDirection();

}

/**

* 根据按下的键定位方向

*/

public void locateDirection() {

if (bL && !bU && !bR && !bD)

dir = Direction.L;

if (bL && bU && !bR && !bD)

dir = ;

if (!bL && bU && !bR && !bD)

dir = Direction.U;

if (!bL && bU && bR && !bD)

dir = ;

if (!bL && !bU && bR && !bD)

dir = Direction.R;

if (!bL && !bU && bR && bD)

dir = ;

if (!bL && !bU && !bR && bD)

dir = Direction.D;

- 5 -

if (bL && !bU && !bR && bD)

dir = ;

if (!bL && !bU && !bR && !bD)

dir = ;

}

/**

* 根据方向移动坦克

*/

public void move() {

lastX = x;

lastY = y;

switch (dir) {

case L:

x -= SPEED;

break;

case LU:

x -= XYSPEED;

y -= XYSPEED;

break;

case U:

y -= SPEED;

break;

case RU:

x += XYSPEED;

y -= XYSPEED;

break;

case R:

x += SPEED;

break;

case RD:

x += XYSPEED;

y += XYSPEED;

break;

case D:

y += SPEED;

break;

case LD:

x -= XYSPEED;

y += XYSPEED;

break;

case STOP:

break;

}

- 6 -

if (dir != )

ptDir = dir;

//控制坦克不出界

if (x < 0)

x = 0;

if (y < 30)

y = 30;

if (x > _WIDTH - * 2)

x = _WIDTH - * 2;

if (y > _HEIGHT - * 2)

y = _HEIGHT - * 2;

}

/**

* 根据坦克的位置和炮筒的方向发射炮弹

*/

public void fire() {

if (!)

return;

int x = this.x + - ;

int y = this.y + - ;

Missile m = new Missile(x, y, , ptDir, this,

tc);

(m);

}

/**

* 画炮筒

* @param g Graphics对象

*/

public void drawPT(Graphics g) {

int x1 = this.x + ;

int y1 = this.y + ;

int x2 = this.x + ;

int y2 = this.y + ;

switch (ptDir) {

case L:

x2 = x1 - PT_LENGTH;

break;

case LU:

x2 = x1 - PT_XY;

y2 = y1 - PT_XY;

break;

case U:

- 7 -

y2 = y1 - PT_LENGTH;

break;

case RU:

x2 = x1 + PT_XY;

y2 = y1 - PT_XY;

break;

case R:

x2 = x1 + PT_LENGTH;

break;

case RD:

x2 = x1 + PT_XY;

y2 = y1 + PT_XY;

break;

case D:

y2 = y1 + PT_LENGTH;

break;

case LD:

x2 = x1 - PT_XY;

y2 = y1 + PT_XY;

break;

}

ne(x1, y1, x2, y2);

}

游戏数据的输出

玩家需要从游戏输出数据中获得游戏信息,如坦克在往上行驶、坦克发了颗子弹、坦克爆炸等,这些均需要通过游戏数据的输出来告知玩家。

由于TankClient继承自Frame,Frame类中的方法paint,可以在窗口中绘制图形,满足了游戏需要图形界面的需求

代码如下:

//主面版

public void paint(Graphics g) {

if (this == null)

return;

if (!()) {

if (-- Num > 0) {

myTank = new Tank(Tank_X, Tank_Y, true, this);

} else {

ring("GameOver!", 350, 280);

ring("按F2键重新开始..", 340, 300);

return;

}

}

if (tankAllNum == 0) {

- 8 -

ring(".:恭喜过关!:.", 350, 280);

ring("按F2键重新开始..", 340, 300);

return;

}

rceTank();

lls(g);

ssiles(g);

Tank(g);

emyTanks(g);

plodes(g);

easure(g);

ssage(g);

}

/**

* 重写update方法,先将窗体上的图形画在图片对象上,再一次性显示

*/

public void update(Graphics g) {

if (offScreenImage == null) {

offScreenImage = Image(WINDOW_WIDTH,

WINDOW_HEIGHT);

}

Graphics gImage = phics();

Color c = or();

or();

ct(0, 0, WINDOW_WIDTH, WINDOW_HEIGHT);

or(c);

paint(gImage);

age(offScreenImage, 0, 0, null);

}

/**

* 用线程重画,每隔一段时间重画窗体

* @author Magci

*

*/

private class PaintThread implements Runnable {

/**

* 每隔REFRESH_RATE毫秒重画一次窗体

*/

public void run() {

while (true) {

repaint();

- 9 -

try {

(REFRESH_RATE);

} catch (InterruptedException e) {

tackTrace();

}

}

}

}

/**

* 监听键盘事件,按方向键控制坦克移动

* @author Magci

*

*/

private class KeyMonitor extends KeyAdapter {

/**

* 处理按键被按下事件

*/

public void keyPressed(KeyEvent e) {

ssed(e);

}

/**

* 处理按键被松开事件

*/

public void keyReleased(KeyEvent e) {

eased(e);

}

}

/**

* 敌方坦克增援

*/

public void reinforceTank() {

if (tankNum < tankMaxNum && tankAllNum > tankNum) {

int i = t(10);

Tank enemyTank = new Tank(200 + 50 * i, 100, false, this);

if (!esWithTank(myTank,

&& !esWithTanks(enemyTanks, true)) {

(enemyTank);

m ++;

}

}

}

- 10 -

true)

/**

* 加入墙

* @param g Graphics对象

*/

public void drawWalls(Graphics g) {

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

Wall wall = (i);

(g);

}

}

/**

* 画我方坦克

* @param g Graphics对象

*/

public void drawMyTank(Graphics g) {

if (myTank != null) {

(g);

esWithWalls(walls);

if (trea != null)

asure(trea);

}

}

/**

* 画敌方坦克

* @param g Graphics对象

*/

public void drawEnemyTanks(Graphics g) {

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

Tank enemyTank = (i);

(g);

esWithWalls(walls);

esWithTank(myTank, false);

esWithTanks(enemyTanks, false);

}

}

/**

* 画炮弹

* @param g Graphics对象

*/

public void drawMissiles(Graphics g) {

- 11 -

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

Missile m = (i);

if (m != null) {

(g);

ks(enemyTanks);

k(myTank);

ls(walls);

siles(missiles);

}

}

}

/**

* 加入爆炸

* @param g Graphics对象

*/

public void drawExplodes(Graphics g) {

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

Explode e = (i);

(g);

}

}

/**

* 出现宝物

* @param g Graphics对象

*/

public void drawTreasure(Graphics g) {

if (t(100) == 0)

trea = null;

if (t(300) == 0) {

int x = t(785);

int y = t(555);

trea = new Treasure(x,y + 30,15,15);

}

if (trea != null) {

esWithWalls(walls);

(g);

}

}

/**

* 打印信息

* @param g Graphics对象

- 12 -

*/

public void drawMessage(Graphics g) {

ring("EnemyTanks Count: " + (), 10, 50);

ring("All EnemyTanks Count: " + lNum, 10, 70);

ring("MyTank Count: " + Num, 10, 90);

ring("MyTank Life: " + e(), 10, 110);

}

/**

* 返回敌方坦克总数量

* @return 敌方坦克总数量

*/

public int getTankAllNum() {

return tankAllNum;

}

/**

* 设置敌方坦克总数量

* @param tankAllNum 敌方坦克总数量

*/

public void setTankAllNum(int tankAllNum) {

lNum = tankAllNum;

}

/**

* 返回当前敌方坦克数量

* @return 返回当前敌方坦克数量

*/

public int getTankNum() {

return tankNum;

}

/**

* 设置当前敌方坦克数量

* @param tankNum 当前敌方坦克数量

*/

public void setTankNum(int tankNum) {

m = tankNum;

}

}

class Tank {

/**

- 13 -

* 坦克水平垂直移动时X、Y轴上的速度

*/

public static final int SPEED = 5;

/**

* 坦克45度移动时X、Y轴上的速度

*/

public static final int XYSPEED = (int) ((2) * SPEED / 2);

/**

* 坦克的半径

*/

public static final int RADIUS = 15;

/**

* 炮筒长度

*/

public static final int PT_LENGTH = 20;

/**

* 45度炮筒的X、Y坐标偏移量

*/

public static final int PT_XY = (int) ((2) * PT_LENGTH) / 2;

/**

* 坦克初始生命值

*/

public static final int LIFE = 100;

// 坦克左上角位置

private int x, y;

// 标记方向键的状态:true表示被按下,false表示被松开

private boolean bL = false, bU = false, bR = false, bD = false;

// 定义八个方向和停止状态

enum Direction {

L, LU, U, RU, R, RD, D, LD, STOP

};

/**

* 坦克方向

*/

public Direction dir = ;

/**

* 坦克炮筒方向

*/

public Direction ptDir = Direction.U;

TankClient tc = null;

//标记敌我坦克,true表示我方坦克,false表示敌方坦克

private boolean good;

- 14 -

//标记坦克生命状态

private boolean live = true;

private Random rand = new Random();

//地方坦克改变一次方向需要的步数

private int step = t(10) + 3;

//坦克的上一个位置

private int lastX = -1, lastY = -1;

//坦克的生命值

private int life = LIFE;

//坦克生命条

LifeBar lb = new LifeBar();

/**

* 根据坦克位置和敌我状态创建一个坦克

* @param x 坦克左上角X坐标

* @param y 坦克左上角Y坐标

* @param good 坦克的敌我状态

*/

public Tank(int x, int y, boolean good) {

this.x = x;

this.y = y;

= good;

}

/**

* 根据坦克位置,敌我状态和当前游戏窗体创建一个坦克

* @param x 坦克左上角X坐标

* @param y 坦克左上角Y坐标

* @param good 坦克的敌我状态

* @param tc 当前游戏窗体

*/

public Tank(int x, int y, boolean good, TankClient tc) {

this(x, y, good);

= tc;

}

/**

* 在窗体上画出坦克

* @param g Graphics对象

*/

public void draw(Graphics g) {

if (!) {

if (!)

- 15 -

(this);

kNum(kNum() - 1);

kAllNum(kAllNum() - 1);

return;

}

Color c = or();

if (good)

or();

else

or();

al(x, y, RADIUS * 2, RADIUS * 2);

if (good)

(g);

or(c);

drawPT(g);

//敌方坦克定位

if (!good) {

if (step == 0) {

Direction[] dirs = ();

int i = t();

dir = dirs[i];

if (t(20) == 0)

dir = Direction.D;

step = t(10) + 3;

}

step --;

if (!issile())

fire();

}

move();

}

程序中共有如下游戏元素:

Bullet:子弹

Tank:坦克

Boom:爆炸

Treasurt:宝物

- 16 -

测试环境

测试时硬件环境

CPU:Inter 105M

显卡:NVIDIA GeForce 105M

内存:金士顿2G/DDR2-667

测试时软件环境

操作系统:Windows 7

JRE:1.6.0

显示器:三星液晶14寸/分辨率:1280X800

测试结果

在以上软硬件环境中测试,游戏过程正常,满足软件的功能需求,结果正确无误。

发现的BUG及不足

1. 由于没有添加操作说明,使玩家不知如何操作,大大地影响了游戏的可操作性。

2. 在测试环境测试时,出现画面抖动现象,严重地影响了游戏的进行,必须找到原因并改正。

解决方法

1. 在程序启动时告知玩家游戏该如何操作,使玩家能清楚、正确地开始游戏。

2. 经过反复测试、论证,得知画面抖动现象原因为测试环境JRE安装问题,在重新安装JRE后,游戏画面恢复正常。

- 17 -

四、软件截图

- 18 -

- 19 -

- 20 -

五、总结

该游戏定位在小型休闲游戏,是一款免费、绿色、开源的一款软件。

本软件是使用JAVA开发的小型电子游戏,其不仅实现了基本的功能需求,而且设计灵活、拓展方便、界面生动,多处使用了各种设计模式,是程序的编写效率更高,运行效率更高。由于程序中多数是面向父类或者面向接口的编程,以后如果要更换某些模块、元素的功能,以及添加功能,是非常容易的。现在软件还无收入,但随着玩家的逐渐增多,随时可以利用本软件优良的可拓展性,添加相关内容,从而开始盈利;即便本游戏未得到玩家的喜爱,而需要再次设计游戏或者另行开发新游戏,其内部使用的各个模块均可以复用,这也是本软件优良的可重用性的体现。

参考文献

JAVA开发实战宝典--------编著:李钟蔚

JAVA面向对象编程--------编著:孙卫琴

出版社:清华大学出版社

出版社:电子工业出版社

- 21 -

2024年3月9日发(作者:百里黎明)

Java课程设计

任 务 书

简单电子游戏坦克大战的设计

1、主要内容:

设计一个简单的坦克大战电子游戏,可以允许多位玩家在局域网

中同时对战

2、 系统要求:游戏具有图形游戏界面,能让用户看到游戏所给出的反馈。

有人机交互功能,使用户操作指定的游戏元素,并且坦克具有生命值,能

攻击敌方,无法攻击友方,而且坦克的攻击具有视觉效果!

3、 具体要求(包括技术要求等):

1.需要有图形游戏界面,让用户能看到游戏给出的反馈

2.有人机交互功能,使用户能操作指定的游戏元素

3.不同队伍的坦克,须显示不同外观,已分辨敌我

4.坦克能够开火,攻击敌方,但不能攻击队友

5需要有不可被子弹穿透的墙

6.坦克有生命值,并非被击中一次就会爆炸

7游戏结束后可重新开始

学习并掌握以下技术:Java、JavaBean 等

熟练使用以下开发工具:Myeclipse 等

实现系统上述的功能。

4、 进度安排:

12月28日 ~ 12月 29日:课程设计选题,查找参考资料

12月30日 ~ 1月1日: 完成系统设计和数据库设计

1月2日 ~ 1月4日: 完成程序代码的编写

1月4日 ~ 1月5日:系统测试与完善

1月5日 ~ 1月6日:完成课程设计报告,准备答辩

分工:

摘 要

随着计算机的普及以及对电子游戏的认识,电子游戏已被越来越多的人选作放松、娱乐的休闲方式;电子游戏既不需要专门购买游戏器材,也不需要宽阔的游戏场地,只需要一台能独立完成任务的计算机即可,它可以是人们工作、学习时用的计算机,并不需要另行配置,这比起传统休闲游戏即省钱又省事。局域网游戏更是可以将现实空间中零散的计算机,组织起来,使其在逻辑空间中集中起来,使游戏的组织、开展变得轻松。如此轻松而又安逸的休闲方式,使得越来越多的人尝试,甚至已经将电子游戏作为主要休闲方式,既然有如此多的人使用,那其中必然存在巨大的商机,即使人们不愿意为一个小小的休闲游戏花费金钱,但在游戏中添加广告、游戏相关服务也包藏了巨大的财富;当然电子游戏的制作如今已是空前的火爆,大大小小的游戏公司横空出世,都想在电子游戏制作这个行业里占据一席之地,而一款成功的电子游戏需要精心的策划、分析、设计,只有这样才能获得游戏中包藏的财富,以及做出一款真正能够让玩家娱乐、放松的游戏,而不是骗取玩家钱财的工具。

关键字:电子游戏;坦克大战;

- 1 -

目 录

一、 系统分析 ............................................................................................................................ - 1 -

可行性分析 .......................................................................................................................... - 1 -

需求分析 .............................................................................................................................. - 1 -

二、 概要设计 ............................................................................................................................ - 2 -

工作流程图 .......................................................................................................................... - 2 -

项目规划 .............................................................................................................................. - 3 -

开发及运行环境 .................................................................................................................. - 3 -

三、 详细设计与算法实现 ........................................................................................................ - 4 -

游戏主窗口 .......................................................................................................................... - 4 -

游戏元素 .................................................................................................... 错误!未定义书签。

四、 测试.......................................................................................................... 错误!未定义书签。

测试环境 ............................................................................................................................ - 17 -

测试结果 ............................................................................................................................ - 17 -

五、 软件截图 .......................................................................................................................... - 18 -

六、 总结.................................................................................................................................. - 21 -

七、 参考文献 .................................................................................................. 错误!未定义书签。

- 2 -

一、系统分析

可行性分析

技术可行性

软件使用swing、GUI、Socket、面向对象设计等技术实现,这些技术均已是非常成熟的技术,之前已有相当多使用这些技术的成功案例,故现使用这些技术是可行的。

经济可行性

本软件为免费软件,将免费提供软件的下载、运行和维护服务,软件暂无收入,待公布之后随着使用者越来越多,将添加相应的广告、服务,从而增加收入,若使用者寥寥无几,将再次分析是否重新策划软件或者放弃开发,以减少损失。

需求分析

通过反复研究以及市场调查,得知游戏须具有以下功能:

需要有图形游戏界面,让用户能看到游戏给出的反馈

不同队伍的坦克,须显示不同外观,已分辨敌我

坦克能够开火,攻击敌方

坦克有生命值

游戏结束时须判断哪一队胜利

游戏结束后可重新开始

游戏的操作、进度等须提供相应说明,以告知玩家

- 1 -

二、概要设计

工作流程图

程序开始

初始化游戏元素

根据游戏的元素属性,对其进行操作和绘出去图战斗结束?

- 2 -

项目规划

本游戏是一个典型的电子小游戏,应具有如下结构:

游戏主窗口

游戏的一切效果、进度、消息等都将由游戏主窗口展示

封装的游戏元素

游戏元素包括:坦克、子弹、等游戏必须的元素

开发及运行环境

开发时硬件环境

CPU:Inter P7350

显卡:NVIDIA GeForce 105M

内存:金士顿2G/DDR2-667

显示器:三星液晶14寸/分辨率:1280X800

开发时软件环境

操作系统:Windows7

JDK:1.5.0

IDE:Eclipse3.4.0

运行时硬件环境

CPU:Inter P7350

显卡:NVIDIA GeForce 105M

内存:金士顿2G/DDR2-667

运行时软件环境

操作系统:Windows 7

JRE:1.6.0

显示器:三星液晶14寸/分辨率:1280X800

- 3 -

三、详细设计与算法实现

游戏主窗口

游戏主窗口是人机交互的窗口,对玩家而言,他们只和游戏主窗口打交道,并不关心游戏内部是如何实现的,所以游戏主窗口部分最重要的便是游戏数据的输入、输出。

在程序中须创建一个类TankClient,继承自Frame来创建一个窗口。

游戏数据的输入

游戏中坦克需要能往上、下、左、右四个方向运动,故须设立4个按键,使其能操作坦克,另须设一个键控制坦克开火。为方便操作,本游戏设置方向键分别表示上下左右,空格表示开火。

具体实现为在TankClient类中添加内部的适配器类代码如下:

/**

* 方向键被按下后标记被按下的键

* @param e 键盘事件

*/

public void keyPressed(KeyEvent e) {

int keyCode = Code();

switch (keyCode) {

case _LEFT:

bL = true;

break;

case _UP:

bU = true;

break;

case _RIGHT:

bR = true;

break;

case _DOWN:

bD = true;

break;

case _CONTROL:

if (!issile())

fire();

break;

case _A:

superFire();

break;

case _F2:

tc = null;

new TankClient("TankClient", 50, 10, 3);

break;

}

- 4 -

locateDirection();

}

/**

* 方向键被松开后标记被松开的键

* @param e 键盘事件

*/

public void keyReleased(KeyEvent e) {

int keyCode = Code();

switch (keyCode) {

case _LEFT:

bL = false;

break;

case _UP:

bU = false;

break;

case _RIGHT:

bR = false;

break;

case _DOWN:

bD = false;

break;

}

locateDirection();

}

/**

* 根据按下的键定位方向

*/

public void locateDirection() {

if (bL && !bU && !bR && !bD)

dir = Direction.L;

if (bL && bU && !bR && !bD)

dir = ;

if (!bL && bU && !bR && !bD)

dir = Direction.U;

if (!bL && bU && bR && !bD)

dir = ;

if (!bL && !bU && bR && !bD)

dir = Direction.R;

if (!bL && !bU && bR && bD)

dir = ;

if (!bL && !bU && !bR && bD)

dir = Direction.D;

- 5 -

if (bL && !bU && !bR && bD)

dir = ;

if (!bL && !bU && !bR && !bD)

dir = ;

}

/**

* 根据方向移动坦克

*/

public void move() {

lastX = x;

lastY = y;

switch (dir) {

case L:

x -= SPEED;

break;

case LU:

x -= XYSPEED;

y -= XYSPEED;

break;

case U:

y -= SPEED;

break;

case RU:

x += XYSPEED;

y -= XYSPEED;

break;

case R:

x += SPEED;

break;

case RD:

x += XYSPEED;

y += XYSPEED;

break;

case D:

y += SPEED;

break;

case LD:

x -= XYSPEED;

y += XYSPEED;

break;

case STOP:

break;

}

- 6 -

if (dir != )

ptDir = dir;

//控制坦克不出界

if (x < 0)

x = 0;

if (y < 30)

y = 30;

if (x > _WIDTH - * 2)

x = _WIDTH - * 2;

if (y > _HEIGHT - * 2)

y = _HEIGHT - * 2;

}

/**

* 根据坦克的位置和炮筒的方向发射炮弹

*/

public void fire() {

if (!)

return;

int x = this.x + - ;

int y = this.y + - ;

Missile m = new Missile(x, y, , ptDir, this,

tc);

(m);

}

/**

* 画炮筒

* @param g Graphics对象

*/

public void drawPT(Graphics g) {

int x1 = this.x + ;

int y1 = this.y + ;

int x2 = this.x + ;

int y2 = this.y + ;

switch (ptDir) {

case L:

x2 = x1 - PT_LENGTH;

break;

case LU:

x2 = x1 - PT_XY;

y2 = y1 - PT_XY;

break;

case U:

- 7 -

y2 = y1 - PT_LENGTH;

break;

case RU:

x2 = x1 + PT_XY;

y2 = y1 - PT_XY;

break;

case R:

x2 = x1 + PT_LENGTH;

break;

case RD:

x2 = x1 + PT_XY;

y2 = y1 + PT_XY;

break;

case D:

y2 = y1 + PT_LENGTH;

break;

case LD:

x2 = x1 - PT_XY;

y2 = y1 + PT_XY;

break;

}

ne(x1, y1, x2, y2);

}

游戏数据的输出

玩家需要从游戏输出数据中获得游戏信息,如坦克在往上行驶、坦克发了颗子弹、坦克爆炸等,这些均需要通过游戏数据的输出来告知玩家。

由于TankClient继承自Frame,Frame类中的方法paint,可以在窗口中绘制图形,满足了游戏需要图形界面的需求

代码如下:

//主面版

public void paint(Graphics g) {

if (this == null)

return;

if (!()) {

if (-- Num > 0) {

myTank = new Tank(Tank_X, Tank_Y, true, this);

} else {

ring("GameOver!", 350, 280);

ring("按F2键重新开始..", 340, 300);

return;

}

}

if (tankAllNum == 0) {

- 8 -

ring(".:恭喜过关!:.", 350, 280);

ring("按F2键重新开始..", 340, 300);

return;

}

rceTank();

lls(g);

ssiles(g);

Tank(g);

emyTanks(g);

plodes(g);

easure(g);

ssage(g);

}

/**

* 重写update方法,先将窗体上的图形画在图片对象上,再一次性显示

*/

public void update(Graphics g) {

if (offScreenImage == null) {

offScreenImage = Image(WINDOW_WIDTH,

WINDOW_HEIGHT);

}

Graphics gImage = phics();

Color c = or();

or();

ct(0, 0, WINDOW_WIDTH, WINDOW_HEIGHT);

or(c);

paint(gImage);

age(offScreenImage, 0, 0, null);

}

/**

* 用线程重画,每隔一段时间重画窗体

* @author Magci

*

*/

private class PaintThread implements Runnable {

/**

* 每隔REFRESH_RATE毫秒重画一次窗体

*/

public void run() {

while (true) {

repaint();

- 9 -

try {

(REFRESH_RATE);

} catch (InterruptedException e) {

tackTrace();

}

}

}

}

/**

* 监听键盘事件,按方向键控制坦克移动

* @author Magci

*

*/

private class KeyMonitor extends KeyAdapter {

/**

* 处理按键被按下事件

*/

public void keyPressed(KeyEvent e) {

ssed(e);

}

/**

* 处理按键被松开事件

*/

public void keyReleased(KeyEvent e) {

eased(e);

}

}

/**

* 敌方坦克增援

*/

public void reinforceTank() {

if (tankNum < tankMaxNum && tankAllNum > tankNum) {

int i = t(10);

Tank enemyTank = new Tank(200 + 50 * i, 100, false, this);

if (!esWithTank(myTank,

&& !esWithTanks(enemyTanks, true)) {

(enemyTank);

m ++;

}

}

}

- 10 -

true)

/**

* 加入墙

* @param g Graphics对象

*/

public void drawWalls(Graphics g) {

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

Wall wall = (i);

(g);

}

}

/**

* 画我方坦克

* @param g Graphics对象

*/

public void drawMyTank(Graphics g) {

if (myTank != null) {

(g);

esWithWalls(walls);

if (trea != null)

asure(trea);

}

}

/**

* 画敌方坦克

* @param g Graphics对象

*/

public void drawEnemyTanks(Graphics g) {

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

Tank enemyTank = (i);

(g);

esWithWalls(walls);

esWithTank(myTank, false);

esWithTanks(enemyTanks, false);

}

}

/**

* 画炮弹

* @param g Graphics对象

*/

public void drawMissiles(Graphics g) {

- 11 -

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

Missile m = (i);

if (m != null) {

(g);

ks(enemyTanks);

k(myTank);

ls(walls);

siles(missiles);

}

}

}

/**

* 加入爆炸

* @param g Graphics对象

*/

public void drawExplodes(Graphics g) {

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

Explode e = (i);

(g);

}

}

/**

* 出现宝物

* @param g Graphics对象

*/

public void drawTreasure(Graphics g) {

if (t(100) == 0)

trea = null;

if (t(300) == 0) {

int x = t(785);

int y = t(555);

trea = new Treasure(x,y + 30,15,15);

}

if (trea != null) {

esWithWalls(walls);

(g);

}

}

/**

* 打印信息

* @param g Graphics对象

- 12 -

*/

public void drawMessage(Graphics g) {

ring("EnemyTanks Count: " + (), 10, 50);

ring("All EnemyTanks Count: " + lNum, 10, 70);

ring("MyTank Count: " + Num, 10, 90);

ring("MyTank Life: " + e(), 10, 110);

}

/**

* 返回敌方坦克总数量

* @return 敌方坦克总数量

*/

public int getTankAllNum() {

return tankAllNum;

}

/**

* 设置敌方坦克总数量

* @param tankAllNum 敌方坦克总数量

*/

public void setTankAllNum(int tankAllNum) {

lNum = tankAllNum;

}

/**

* 返回当前敌方坦克数量

* @return 返回当前敌方坦克数量

*/

public int getTankNum() {

return tankNum;

}

/**

* 设置当前敌方坦克数量

* @param tankNum 当前敌方坦克数量

*/

public void setTankNum(int tankNum) {

m = tankNum;

}

}

class Tank {

/**

- 13 -

* 坦克水平垂直移动时X、Y轴上的速度

*/

public static final int SPEED = 5;

/**

* 坦克45度移动时X、Y轴上的速度

*/

public static final int XYSPEED = (int) ((2) * SPEED / 2);

/**

* 坦克的半径

*/

public static final int RADIUS = 15;

/**

* 炮筒长度

*/

public static final int PT_LENGTH = 20;

/**

* 45度炮筒的X、Y坐标偏移量

*/

public static final int PT_XY = (int) ((2) * PT_LENGTH) / 2;

/**

* 坦克初始生命值

*/

public static final int LIFE = 100;

// 坦克左上角位置

private int x, y;

// 标记方向键的状态:true表示被按下,false表示被松开

private boolean bL = false, bU = false, bR = false, bD = false;

// 定义八个方向和停止状态

enum Direction {

L, LU, U, RU, R, RD, D, LD, STOP

};

/**

* 坦克方向

*/

public Direction dir = ;

/**

* 坦克炮筒方向

*/

public Direction ptDir = Direction.U;

TankClient tc = null;

//标记敌我坦克,true表示我方坦克,false表示敌方坦克

private boolean good;

- 14 -

//标记坦克生命状态

private boolean live = true;

private Random rand = new Random();

//地方坦克改变一次方向需要的步数

private int step = t(10) + 3;

//坦克的上一个位置

private int lastX = -1, lastY = -1;

//坦克的生命值

private int life = LIFE;

//坦克生命条

LifeBar lb = new LifeBar();

/**

* 根据坦克位置和敌我状态创建一个坦克

* @param x 坦克左上角X坐标

* @param y 坦克左上角Y坐标

* @param good 坦克的敌我状态

*/

public Tank(int x, int y, boolean good) {

this.x = x;

this.y = y;

= good;

}

/**

* 根据坦克位置,敌我状态和当前游戏窗体创建一个坦克

* @param x 坦克左上角X坐标

* @param y 坦克左上角Y坐标

* @param good 坦克的敌我状态

* @param tc 当前游戏窗体

*/

public Tank(int x, int y, boolean good, TankClient tc) {

this(x, y, good);

= tc;

}

/**

* 在窗体上画出坦克

* @param g Graphics对象

*/

public void draw(Graphics g) {

if (!) {

if (!)

- 15 -

(this);

kNum(kNum() - 1);

kAllNum(kAllNum() - 1);

return;

}

Color c = or();

if (good)

or();

else

or();

al(x, y, RADIUS * 2, RADIUS * 2);

if (good)

(g);

or(c);

drawPT(g);

//敌方坦克定位

if (!good) {

if (step == 0) {

Direction[] dirs = ();

int i = t();

dir = dirs[i];

if (t(20) == 0)

dir = Direction.D;

step = t(10) + 3;

}

step --;

if (!issile())

fire();

}

move();

}

程序中共有如下游戏元素:

Bullet:子弹

Tank:坦克

Boom:爆炸

Treasurt:宝物

- 16 -

测试环境

测试时硬件环境

CPU:Inter 105M

显卡:NVIDIA GeForce 105M

内存:金士顿2G/DDR2-667

测试时软件环境

操作系统:Windows 7

JRE:1.6.0

显示器:三星液晶14寸/分辨率:1280X800

测试结果

在以上软硬件环境中测试,游戏过程正常,满足软件的功能需求,结果正确无误。

发现的BUG及不足

1. 由于没有添加操作说明,使玩家不知如何操作,大大地影响了游戏的可操作性。

2. 在测试环境测试时,出现画面抖动现象,严重地影响了游戏的进行,必须找到原因并改正。

解决方法

1. 在程序启动时告知玩家游戏该如何操作,使玩家能清楚、正确地开始游戏。

2. 经过反复测试、论证,得知画面抖动现象原因为测试环境JRE安装问题,在重新安装JRE后,游戏画面恢复正常。

- 17 -

四、软件截图

- 18 -

- 19 -

- 20 -

五、总结

该游戏定位在小型休闲游戏,是一款免费、绿色、开源的一款软件。

本软件是使用JAVA开发的小型电子游戏,其不仅实现了基本的功能需求,而且设计灵活、拓展方便、界面生动,多处使用了各种设计模式,是程序的编写效率更高,运行效率更高。由于程序中多数是面向父类或者面向接口的编程,以后如果要更换某些模块、元素的功能,以及添加功能,是非常容易的。现在软件还无收入,但随着玩家的逐渐增多,随时可以利用本软件优良的可拓展性,添加相关内容,从而开始盈利;即便本游戏未得到玩家的喜爱,而需要再次设计游戏或者另行开发新游戏,其内部使用的各个模块均可以复用,这也是本软件优良的可重用性的体现。

参考文献

JAVA开发实战宝典--------编著:李钟蔚

JAVA面向对象编程--------编著:孙卫琴

出版社:清华大学出版社

出版社:电子工业出版社

- 21 -

与本文相关的文章

发布评论

评论列表 (0)

  1. 暂无评论