一.功能描述

java坦克大战主要功能:

1. 图形用户界面;

2. 有坦克、森林、河流、墙体等元素;

3. 界面中有一个我方大本营,我方大本营被敌方攻击则输游戏;

4. 墙体分为普通墙体和金属墙体两种,普通墙体可以被子弹射穿,金属墙体不能被子弹射穿;

5. 坦克可以通过森林,不能通过河流、墙体;

6. 坦克可以发射子弹,敌我双方的坦克属性相同;

7. 敌方坦克之间不能互相攻击;

8. Tank子弹、导弹击中敌方坦克有爆炸效果;

二.项目开发环境

系统平台:windows8.1

JDK:1.7

IDE:Eclipse

项目功能流程图

主窗口类图

项目主要功能

三.项目设计

1.设计一个panel,将所有游戏的元素都放在这个panel里面,玩家可以通过键盘控制来对panel里面的元素进行操作;

2.在panel中布局森林、河流、墙体(普通墙体和金属墙体)、大本营等元素;

3.坦克分为敌方坦克和玩家坦克。敌方坦克可以随意走动,玩家坦克由玩家控制;

4.子弹可以穿越森林和河流,打到敌方坦克(或敌方坦克打到玩家坦克),坦克会有爆炸效果。

四.项目实现截图


游戏开始界面
游戏进行界面
玩家死亡界面
玩家获胜界面
五. 项目详细功能描述

(1)我方Tank:

按J键可发射子弹,每次最多发射5颗子弹;

按K键可发射导弹(数量有限);

按M键可发射核弹(数量有限);

 

我方Tank可以由玩家控制移动方向,W、S、A、D代表上、下、左、右四个方向;

我方Tank有3条命,被敌方Tank子弹击中后会伤害一条生命值,若三条命都被击中则游戏结束;我方Tank击中所有敌方Tank游戏结束,玩家胜利。

(2)敌方Tank1:

敌方Tank1刚开局时产生15辆,横坐标为0,间隔50,随机分布,敌

方由Random类控制方向,随机移动;敌方Tank1被我方Tank子弹击    中两次后消失。

敌方Tank2:

每一辆敌方Tank1被击中消失,随机产生一辆敌方Tank2,功能同敌方Tank1, 敌方tank2被玩家Tank子弹击中3次后消失。

(3)Tank道具:

子弹:击中物体可产生爆炸效果;

子弹速度为8像素。

导弹:击中物体可产生爆炸效果,产生大面积伤害;

导弹速度为8像素。

核弹:清除当前屏幕下所有敌方Tank数量。

(4)可击破障碍物:

被任意一方Tank子弹击中后产生爆炸效果并消失。

(5)不可击破障碍物:

被任意一方Tank子弹击中后产生爆炸效果,不会消失。

(6)我方总部:

周围有可击破障碍物保护,当总部图标被Tank子弹击中,游戏结束。

在该项目中,主要运用了对javase里边GUI的一些运用,通过画板和画笔原理,一帧一帧绘制游戏。游戏中每个坦克包括玩家坦克和地方坦克都是一个单独的个体,对敌方坦克进行随机方向运动处理,利用随机函数,首先随机生成地方坦克的前进方向,并随机判断出敌方坦克是否发射子弹。

//坦克类
class Tank{
int x;
int y;
int direct;
    int speed=8;  
    boolean isLive=true;
public Tank(int x,int y){
this.x=x;
this.y=y;
}
public void moveUp(){
y-=speed;
if(y<0){
y=0;
}
}
public void moveDown(){
y+=speed;
if(y>570){
y=570;
}
}
public void moveLeft(){
x-=speed;
if(x<0){
x=0;
}
}
public void moveRight(){
x+=speed;
if(x>690){
x=690;
}
}
public int getX(){
return x;
}
public int getY(){
return y;
}
public void setDirect(int direct){
this.direct=direct;
}
public int getDirect(){
return direct;
}
public boolean isAcross(){
return false;
}
}
//玩家坦克类
class Hero extends Tank{
//定义子弹集合
Vector<Shot> ss=new Vector<Shot>();
Shot s=null;
//定义导弹集合
Vector<Missile> mis=new Vector<Missile>();
Missile missile=null;
int misSize=5;

//定义大炸弹数量
int c4=1;

int life=3;
public Hero(int x,int y){
super(x,y);
}
public void lifeDown(){
if(life>0){
life--;
}else{
this.isLive=false;
}
}
public void shotEnemy(){
s=new Shot(x,y,direct);
ss.add(s);
Thread t=new Thread(s);
t.start();
}
public void missileEnemy(){
if(this.misSize>0){
missile=new Missile(x,y,direct);
mis.add(missile);
Thread t=new Thread(missile);
t.start();
misSize--;
}
}
}
//敌人坦克类
class Enemy extends Tank implements Runnable{ //敌人坦克
int type;
int direct=1;
int life=1;
boolean begin=false;
Vector<Shot> es=new Vector<Shot>();
Shot enemyShot=null;//敌人子弹

Random r=new Random();

public Enemy(int x,int y,int type){
super(x,y);
this.type=type;
if(type==0){
life=1;
}
else if(type==1){
life=2;
}
}
public void lifeDown(){
if(life>0){
life--;
}
else{
isLive=false;
}
}
public int getType(){
return type;
}
public void run() {
while(isLive){
try{
Thread.sleep(200);
}catch (InterruptedException e){
e.printStackTrace();
}
if(this.begin){
if(r.nextInt(4)==1)
{
direct=r.nextInt(4);
}
switch(direct){
case 0:this.moveUp();break;
case 1:this.moveDown();break;
case 2:this.moveLeft();break;
case 3:this.moveRight();break;
}

if(r.nextInt(4)==1&&es.size()<2){
enemyShot=new Shot(x,y,direct);
es.add(enemyShot);
Thread t=new Thread(enemyShot);
t.start();
}
}

}
}
}
//子弹类
class Shot implements Runnable{
int x;//子弹初始坐标
int y;
int direct;//子弹发射方向
int speed=8;//子弹速度
boolean isLive=true;
public Shot(int x,int y,int direct){
switch(direct){
case 0:
this.x=x+15;
this.y=y-4;
break;
case 1:
this.x=x+15;
this.y=y+34;
break;
case 2:
this.x=x-4;
this.y=y+15;
break;
case 3:
this.x=x+34;
this.y=y+15;
break;
}
this.direct=direct;
}
public int getX(){
return x;
}
public int getY(){
return y;
}
public void run() {
while(isLive){
try{
Thread.sleep(60);
}catch (InterruptedException e){
e.printStackTrace();
}
switch(direct){
case 0:
y-=speed;
break;
case 1:
y+=speed;
break;
case 2:
x-=speed;
break;
case 3:
x+=speed;
break;
}
//子弹是否撞到墙壁
if(x<0||x>700||y<0||y>600){
isLive=false;
break;
}
//子弹是否击中敌方坦克
if(isLive==false){
break;
}
//子弹是否击中场景物品
}

}
}

通过一个坦克基类派生出玩家坦克类和地方坦克类,坦克基类包含了玩家坦克和地方坦克的共有属性和共有属性方法。

在游戏中会进行大量的碰撞处理,通过坐标,检测游戏中的物体与物体是否具有重叠面积,以此来判断出物体与物体是否相撞,并在某一方向上碰撞后停止前进。

//判断坦克是否撞击到墙体
public void strikeWall(){
//判断玩家是否撞到某一墙体
for(int i=0;i<walls.size();i++){
Wall wall=walls.get(i);
this.heroStrikeWall(this.hero, wall);
}
//判断敌人坦克是否撞击到墙体
for(int i=0;i<ets.size();i++){
Enemy enemy=ets.get(i);
if(enemy.isLive==true){
for(int j=0;j<walls.size();j++){
Wall wall=walls.get(j);
this.enemyStrikeWall(enemy, wall);
}
}
}
}
//判断玩家是否撞到某一墙体
public void heroStrikeWall(Hero hero,Wall wall){
switch(hero.direct){
case 0:
if((hero.x>wall.x&&hero.x<wall.x+40||hero.x+30>wall.x&&hero.x+30<wall.x+40)&&hero.y>wall.y&&hero.y<wall.y+40){
//撞击到墙体
hero.y=wall.y+40;
}
break;
case 1:
if((hero.x>wall.x&&hero.x<wall.x+40||hero.x+30>wall.x&&hero.x+30<wall.x+40)&&hero.y+30>wall.y&&hero.y+30<wall.y+40){
hero.y=wall.y-30;
}
break;
case 2:
if(hero.x>wall.x&&hero.x<wall.x+40&&(hero.y>wall.y&&hero.y<wall.y+40||hero.y+30>wall.y&&hero.y+30<wall.y+40)){
hero.x=wall.x+40;
}
break;
case 3:
if(hero.x+30>wall.x&&hero.x+30<wall.x+40&&(hero.y>wall.y&&hero.y<wall.y+40||hero.y+30>wall.y&&hero.y+30<wall.y+40)){
hero.x=wall.x-30;
}
break;
}
}

在游戏的整体逻辑上,当游戏结束后,需要将所有数据初始化。
项目源码http://download.csdn.net/detail/a644821552/9717060

基于java swing的坦克大战游戏相关推荐

  1. java 坦克大战_基于JAVA实现的坦克大战游戏

    一.课程题目 实现一个java版本的坦克大战游戏. 功能提示: 游戏要有图形用户界面,界面能够反映游戏所有的细节 界面中要有坦克,墙,树林,河流 界面中要有一个"家"," ...

  2. java swing 版坦克大战

    1.基于Java swing版坦克大战,git链接:https://github.com/zhangliqingyun/TankGame.git 2.项目包结构图,TankGame.java程序启动类 ...

  3. 基于java+swing的潜艇大战项目游戏(java+swing)

    基于java+swing的潜艇大战项目游戏(java+swing) 功能简介: Java swing实现的一款小游戏潜艇大战的项目源码 适用 课程设计,大作业,毕业设计,项目练习,学习演示等 bool ...

  4. 【java毕业设计】基于java+Eclipse的飞机大战游戏设计与实现(毕业论文+程序源码)——飞机大战游戏

    基于java+Eclipse的飞机大战游戏设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于java+Eclipse的飞机大战游戏设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦. ...

  5. 【java毕业设计】基于java+swing+Eclipse的俄罗斯方块游戏GUI设计与实现(毕业论文+程序源码)——俄罗斯方块游戏

    基于java+swing+Eclipse的俄罗斯方块游戏GUI设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于java+swing+Eclipse的俄罗斯方块游戏GUI设计与实现,文章末尾 ...

  6. 【java毕业设计】基于java+swing+GUI的连连看游戏设计与实现(毕业论文+程序源码)——连连看游戏

    基于java+swing+GUI的连连看游戏设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于java+swing+GUI的连连看游戏设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦 ...

  7. 基于Java+Swing实现雷电小游戏

    基于Java+Swing实现雷电小游戏 一.系统介绍 二.功能展示 三.其他系统 四.获取源码 一.系统介绍 基于java的雷电游戏基本功能包括:敌方飞机随机飞行.我方飞机手动控制飞行,射击比拼,游戏 ...

  8. 基于Java+Swing实现中国象棋游戏

    基于Java+Swing实现中国象棋游戏 一.系统介绍 二.功能展示 三.其他系统 四.获取源码 前言 中国象棋是起源于中国的一种棋,属于二人对抗性游戏的一种,在中国有着悠久的历史.由于用具简单,趣味 ...

  9. 基于Java+Swing实现捕鱼达人游戏(含课程报告)

    基于Java+Swing实现捕鱼达人游戏(含课程报告) 一.系统介绍 1.开发背景 2.基本内容.实现方法及主要技术实现目标 3实现目标 二.功能展示 三.其他系统 四.获取源码 一.系统介绍 1.开 ...

最新文章

  1. 【puthon】把大量csv文件写入h5文件制作数据集
  2. java线程状态有哪几种,顺利拿到offer
  3. java 8 stream中的Spliterator简介
  4. 现在竟然还有补丝袜的?
  5. nginx比较apache
  6. eclipse 字体设置 Courier New字
  7. Android 获取sim卡序列号
  8. python车牌识别_python+opencv实现车牌识别
  9. 内网神器cobaltstrike使用教程
  10. 北大 宾州树库 语料标注集
  11. 云计算与大数据技术应用
  12. Tomcat6 如何彻底卸载,才干净?
  13. 1.基于物品的协同过滤推荐算法理解
  14. Quartus-II入门实战
  15. Arm开发板上使用ldd命令
  16. 达梦数据库授权到期替换key文件
  17. 《大话设计模式》读后感
  18. 云脉相册检索,关键词快速定位图片
  19. 手游测试人才稀缺,兼容性问题突出
  20. 温度传感器DS18B20的使用

热门文章

  1. np的reshape函数
  2. iTOP-RK3588开发板M2接口固态硬盘测试
  3. 05-分布式计算框架
  4. 常见的SQL优化方法
  5. Mysql中tinyint与Java数据类型对应关系
  6. 我的2016,成长之路总是充满坎坷
  7. 【leetcode】把数字翻译成字符串 c++
  8. Excel 2007及其VBA
  9. Java观察者模式以及与订阅发布者模式区别
  10. 在Go语言项目中使用Zap日志库