文档章节

新版坦克大战

伊诗塔
 伊诗塔
发布于 2014/04/10 20:52
字数 2548
阅读 4435
收藏 154
点赞 22
评论 22

作者:陈伟         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的图形化用户界面完成的,包括了菜单界面和游戏界面。其中菜单界面可以供玩家选择重新开始游戏、暂停、继续、是否播放背...

a1275302036 ⋅ 2017/01/08 ⋅ 0

自己想了下坦克大战的优化思路,求大大门指点。

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

DONFANS ⋅ 2012/12/16 ⋅ 5

坦克大战游戏平台--CodeGame

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

红薯 ⋅ 2014/12/03 ⋅ 0

C++实战项目:坦克大战(一)

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

qq_26046771 ⋅ 2017/03/26 ⋅ 0

tank大战

利用cocos2d制作的坦克大战游戏。实现效果(包括音效)非常不错。 作者说:回顾经典fc永远少不了tank大战,分享学习cocos2d过程中写的tank大战源码,希望能帮助正在学习cocos2d的同学。 [Cod...

匿名 ⋅ 2012/11/23 ⋅ 1

JS项目练习总结

我们做的是90版坦克大战游戏,之前其实做了微信的飞机大战。只能说是模拟其基本功能,在细节方面还有很多没考虑到。 做这个项目印象最深的是:用面向对象编程果真方便许多。鉴于个人能力,最...

小陈同学 ⋅ 2014/03/02 ⋅ 0

坦克大战C++C++

@鉴客 你好,想跟你请教个问题:鉴克先生你好,我是一名大学生,最近在网上下载了你用C++写的坦克大战的代码,但是我看不太懂,尤其是在坦克移动那些坐标变换上面。我希望您能够帮我在上面加...

尹程翔 ⋅ 2013/03/10 ⋅ 2

Linux Deepin系统更新记录(2014-03-19)

今日,Linux Deepin 2013进行了系统更新推送,下面是系统更新解决的部分问题与软件更新情况,供大家参考。 Bug修复 0003026: 深度终端 右键菜单清屏无效. 修复bug:桌面应用程序组不能通过拖...

cxbii ⋅ 2014/03/19 ⋅ 4

html5 坦克大战 一

简单的实现: 1、通过按键控制我方坦克的移动,发射子弹,打中敌人并使敌人死亡; 2、敌坦克的自动移动,随机转向,自动发射炮弹。 html5写的坦克大战,网上的源代码很多,建议不要简单地复制...

一只石头 ⋅ 2016/02/26 ⋅ 0

分享几个令人震撼的JS和HTML5游戏

或许你对网页游戏仅仅停留在Flash的时代,认为只有Flash才能做出非常绚丽的游戏特效。那么今天就打破大家的这个观念,一起来看看用Javascript和HTML5实现的网页游戏,这些游戏个人认为做得已...

tp_wire ⋅ 2012/06/27 ⋅ 20

没有更多内容

加载失败,请刷新页面

加载更多

下一页

设计模式--装饰者模式

装饰者模式 定义 动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更为灵活。 通用类图 意图 动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比...

gaob2001 ⋅ 54分钟前 ⋅ 0

JavaScript零基础入门——(八)JavaScript的数组

JavaScript零基础入门——(八)JavaScript的数组 欢迎大家回到我们的JavaScript零基础入门,上一节课我们讲了有关JavaScript正则表达式的相关知识点,便于大家更好的对字符串进行处理。这一...

JandenMa ⋅ 今天 ⋅ 0

sbt网络问题解决方案

转自:http://dblab.xmu.edu.cn/blog/maven-network-problem/ cd ~/.sbt/launchers/0.13.9unzip -q ./sbt-launch.jar 修改 vi sbt/sbt.boot.properties 增加一个oschina库地址: [reposit......

狐狸老侠 ⋅ 今天 ⋅ 0

大数据,必须掌握的10项顶级安全技术

我们看到越来越多的数据泄漏事故、勒索软件和其他类型的网络攻击,这使得安全成为一个热门话题。 去年,企业IT面临的威胁仍然处于非常高的水平,每天都会看到媒体报道大量数据泄漏事故和攻击...

p柯西 ⋅ 今天 ⋅ 0

Linux下安装配置Hadoop2.7.6

前提 安装jdk 下载 wget http://mirrors.hust.edu.cn/apache/hadoop/common/hadoop-2.7.6/hadoop-2.7.6.tar.gz 解压 配置 vim /etc/profile # 配置java环境变量 export JAVA_HOME=/opt/jdk1......

晨猫 ⋅ 今天 ⋅ 0

crontab工具介绍

crontab crontab 是一个用于设置周期性被执行的任务工具。 周期性执行的任务列表称为Cron Table crontab(选项)(参数) -e:编辑该用户的计时器设置; -l:列出该用户的计时器设置; -r:删除该...

Linux学习笔记 ⋅ 今天 ⋅ 0

深入Java多线程——Java内存模型深入(2)

5. final域的内存语义 5.1 final域的重排序规则 1.对于final域,编译器和处理器要遵守两个重排序规则: (1)在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用...

江左煤郎 ⋅ 今天 ⋅ 0

面试-正向代理和反向代理

面试-正向代理和反向代理 Nginx 是一个高性能的反向代理服务器,但同时也支持正向代理方式的配置。

秋日芒草 ⋅ 今天 ⋅ 0

Spring 依赖注入(DI)

1、Setter方法注入: 通过设置方法注入依赖。这种方法既简单又常用。 类中定义set()方法: public class HelloWorldOutput{ HelloWorld helloWorld; public void setHelloWorld...

霍淇滨 ⋅ 昨天 ⋅ 0

马氏距离与欧氏距离

马氏距离 马氏距离也可以定义为两个服从同一分布并且其协方差矩阵为Σ的随机变量之间的差异程度。 如果协方差矩阵为单位矩阵,那么马氏距离就简化为欧氏距离,如果协方差矩阵为对角阵,则其也...

漫步当下 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部