新版坦克大战
新版坦克大战
伊诗塔 发表于4年前
新版坦克大战
  • 发表于 4年前
  • 阅读 4426
  • 收藏 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视频。他里面有一个案例是编写坦克游戏,于是想到不如我模仿这个游戏吧,没想到我的组员和我想到一起去了。他也是计划写这方面的游戏。我们算是不谋而合。然后就是开始观看视频,按照那些方法开始编写。但是每每都是看着简单,要自己动手的时候就不是那么简单了。由于我们花了很多时间去设计和编写元素类,所以界面不是很漂亮,而且还有些功能还不能实现。也说明我的能力还欠缺,还得好好努力。同时我也从队友哪里学到了思想的重要性,刚开始的时候不能太注意细节,先要考虑到整体的框架,不然就无法开展工作了。后面才是完善细节的时候。

共有 人打赏支持
粉丝 9
博文 2
码字总数 3270
评论 (22)
码农啊就是弄嘛
蛙牛
马士兵 坦克大战。。。
狮子的魂
Nice work, 我和你写了个类似的,不过我加入一些AI坦克。。。http://www.oschina.net/p/tankwar
伊诗塔

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

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

你做的好多了。

伊诗塔

引用来自“高高12138”的评论

谢谢!

牛仔豆
这是课程设计么20
嫂来哇
Glide
学习啦。
言会咸
真不错啊
liruixpc11
为什么不用UML
久永
源代码也不放出,不厚道啊~
ryany
JAVA写的。。。
xxlv
能联网么?
一叶知秋0
赞一个
南湖船老大
好厉害
杨同学
牛逼啊
taojinhuo
看起来还不错
狮子的魂

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

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

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

你做的好多了。

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

Josephwoo
膜拜一下
cnkens
不错,想法和思路都不错。
×
伊诗塔
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: