对于一些小游戏的实现方法是很多小伙伴们都好奇的,也有很多小游戏是由Java而制作的,那么你知道java怎么制作坦克大战吗?接下来的内容中我们就一起去看看吧。

详情请参照注释,这里就不多废话了,实现一下儿时的经典而已。

Blood.java

package com.hkm.TankWar;

import java.awt.*;

/**

* 血块类,我方坦克吃了可回血;

* @author Hekangmin

*

*/

public class Blood {

private int x,y,w,h;//血块的位置和宽度高度;

private TankWarClient tc;

private int step=0;//纪录血块移动的步数;

private boolean live=true;

public boolean isLive() {

return live;

}

public void setLive(boolean live) {

this.live = live;

}

/**

* 纪录血块的位置;

*/

private int[][] pos={{400,300},{400,320},{420,320},{440,300},{440,330},{480,400},{520,400},{540,400}};

public Blood()

{

x=pos[0][0];

y=pos[0][1];

w=h=18;

}

public void draw(Graphics g)

{

if(!live) return;

Color c=g.getColor();

g.setColor(Color.CYAN);

g.fillOval(x, y, w, h);

g.setColor(c);

move();

}

/**

* 移动血块

*/

public void move()

{

step++;

if(step>=pos.length) step=0;

else{

x=pos[step][0];

y=pos[step][1];

}

}

public Rectangle getRect()

{

return new Rectangle(x,y,w,h);

}

}

Explode.java

package com.hkm.TankWar;

import java.awt.*;

/**

* 爆炸类

* @author Hekangmin

*

*/

public class Explode {

private int x,y;//爆炸发生的位置

private boolean Live=true;

int dia[]={4,8,12,16,32,40,20,14,4};//用园模拟,代表圆的直径;

int step=0;//区别移到第几个直径

private TankWarClient tc;//持有引用

public Explode(int x,int y,TankWarClient tc)

{

this.x=x;

this.y=y;

this.tc=tc;

}

public void draw(Graphics g)

{

if(!Live)

{

tc.explodes.remove(this);

return;

}

if(step==dia.length)//如果到了最后一个直径爆炸死亡;

{

Live=false;

step=0;

return;

}

Color c=g.getColor();

g.setColor(Color.YELLOW);

g.fillOval(x, y, dia[step], dia[step]);

g.setColor(c);

step++;

}

}

Missile.java

package com.hkm.TankWar;

import java.awt.*;

import java.awt.Event.*;

import java.awt.event.KeyEvent;

import java.util.List;

/**

* 子弹类

* @author Hekangmin

*

*/

public class Missile {

private int x,y;//子弹的位置

private Tank.Direction dir;//坦克方向

private static final int XSPEED=10;//坦克x方向的移动速度,

private static final int YSPEED=10;//坦克y方向的移动速度,

public static final int WIDTH=10;

public static final int HEIGHT=10;

private boolean Live=true;//判断子弹是否活着

private boolean good;//区分敌军子弹和我军子弹

private TankWarClient tc;

public Missile(int x, int y, Tank.Direction dir) {

this.x = x;

this.y = y;

this.dir = dir;

}

public Missile(int x,int y,boolean good,Tank.Direction dir,TankWarClient tc)

{

this(x,y,dir);

this.good=good;//将坦克好坏的属性与子弹还坏属性设为相同;

this.tc=tc;

}

/**

* 画出子弹

* @param g为画笔

*/

public void draw(Graphics g)

{

if(!Live)

{

tc.missiles.remove(this);

return;

}

Color c=g.getColor();

if(good)

{

g.setColor(Color.BLUE);

}

else g.setColor(Color.ORANGE);

g.fillOval(x, y, WIDTH, HEIGHT);

g.setColor(c);

move();

}

/**

* 根据坦克的方向让子弹移动

*/

private void move() {

switch(dir)

{

case L:

x-=XSPEED;

break;

case LU:

x-=XSPEED;

y-=YSPEED;

break;

case U:

y-=YSPEED;

break;

case RU:

x+=XSPEED;

y-=YSPEED;

break;

case R:

x+=XSPEED;

break;

case RD:

x+=XSPEED;

y+=YSPEED;

break;

case D:

y+=YSPEED;

break;

case LD:

x-=XSPEED;

y+=YSPEED;

break;

}

if(xTankWarClient.GAME_WIDTH||y>TankWarClient.GAME_HEIGHT)//子弹越界则让其死亡;

{

Live=false;

}

}

public boolean isLive()

{

return Live;

}

public Rectangle getRect()//获取子弹的矩形区域;

{

return new Rectangle(this.x,this.y,this.WIDTH,this.HEIGHT);

}

/**

* 判断子弹与坦克碰撞;

* @param t为坦克

* @return返回true则表示发生碰撞,否则没有碰撞;

*/

public boolean hitTank(Tank t)

{

if(this.Live&&this.getRect().intersects(t.getRect())&&t.isLive()&&this.good!=t.isGood())

{

if(t.isGood())

{

t.setLife(t.getLife()-10);

if(t.getLife() tanks)

{

for(int i=0;i

Tank.java

package com.hkm.TankWar;

import java.awt.*;

import java.awt.event.KeyEvent;

import java.util.*;

/**

* 坦克类

* @author Hekangmin

*

*/

public class Tank {

public static final int XSPEED=5;//坦克x方向速度

public static final int YSPEED=5;

public static final int WIDTH=30;

public static final int HEIGHT=30;

private BloodBar bb=new BloodBar();//血条

private int life=100;

public int getLife() {

return life;

}

public void setLife(int life) {

this.life = life;

}

private static Random r=new Random();

private static int step=r.nextInt(12)+3;//定义一个数表示敌军坦克随机东的步数;

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

enum Direction{L,LU,U,RU,R,RD,D,LD,STOP};//利用枚举类型定义坦克方向;

private int x,y;

private int oldX,oldY;//纪录上一步坦克的位置;

private boolean live=true;//判断是否活着

public boolean isLive() {

return live;

}

public void setLive(boolean live) {

this.live = live;

}

private boolean good;//坦克是好是坏

public boolean isGood() {

return good;

}

private Direction ptDir=Direction.D;//新增炮筒的方向;

TankWarClient tc;//为了持有对方的引用以可以方便访问其成员变量;

Direction dir=Direction.STOP;//一开始将坦克方向设为stop;

public Tank(int x,int y,boolean good,Direction dir,TankWarClient tc)

{

this.x=x;

this.y=y;

this.oldX=x;

this.oldY=y;

this.good=good;

this.dir=dir;

this.tc=tc;//持有对方的引用;

}

public void draw(Graphics g)

{

if(!live)//如果死亡则不再draw;

{

if(!good)

{

tc.tanks.remove(this);

if(tc.tanks.size()TankWarClient.GAME_WIDTH) x=TankWarClient.GAME_WIDTH-30;

if(y+Tank.HEIGHT>TankWarClient.GAME_HEIGHT) y=TankWarClient.GAME_HEIGHT-30;

if(!good)

{

Direction[] dirs=Direction.values();//将枚举类型转化成数组;

if(step==0)

{

step=r.nextInt(12)+3;

int rn=r.nextInt(dirs.length);//产生length以内随机的整数;

dir=dirs[rn];

}

step--;

if(r.nextInt(40)>20) this.fire();//使敌军坦克发射子弹;

}

}

/**

* 处理按键

* @param e键盘事件;

*/

public void KeyPressed(KeyEvent e)

{

int key=e.getKeyCode();

switch(key)

{

case KeyEvent.VK_LEFT:

bL=true;

break;

case KeyEvent.VK_RIGHT:

bR=true;

break;

case KeyEvent.VK_UP:

bU=true;

break;

case KeyEvent.VK_DOWN:

bD=true;

break;

}

locationDir();

}

public void keyReleased(KeyEvent e) {

int key=e.getKeyCode();

switch(key)

{

case KeyEvent.VK_CONTROL:

fire();

break;

case KeyEvent.VK_LEFT:

bL=false;

break;

case KeyEvent.VK_RIGHT:

bR=false;

break;

case KeyEvent.VK_UP:

bU=false;

break;

case KeyEvent.VK_DOWN:

bD=false;

break;

case KeyEvent.VK_A:

superFire();

break;

case KeyEvent.VK_F2:

reBorn();

break;

}

locationDir();

}

/**

* 发射子弹

* @return返回子弹类型

*/

public Missile fire() {

if(!live)

return null;

int mx=this.x+Tank.WIDTH/2-Missile.WIDTH/2;//计算子弹发射的位置;

int my=this.y+Tank.HEIGHT/2-Missile.HEIGHT/2;

Missile m=new Missile(mx,my,good,ptDir,this.tc);根据炮筒方向发射子弹

tc.missiles.add(m);

return m;

}

public Missile fire(Direction dir)

{

if(!live)

return null;

int mx=this.x+Tank.WIDTH/2-Missile.WIDTH/2;

int my=this.y+Tank.HEIGHT/2-Missile.HEIGHT/2;

Missile m=new Missile(mx,my,good,dir,this.tc);//根据坦克的方向发射子弹;

tc.missiles.add(m);

return m;

}

public void superFire()

{

Direction[] dirs=Direction.values();

for(int i=0;i tanks)

{

for(int i=0;i

TankWarClient.java

package com.hkm.TankWar;

import java.awt.*;

import java.awt.event.*;

import java.util.List;

import java.util.ArrayList;

/**

* 这个是游戏的运行窗口;

* @author Hekangmin

*

*/

public class TankWarClient extends Frame{

/**

* 游戏窗口的宽度;

*/

public static final int GAME_WIDTH=800;

/**

* 游戏窗口的高度;

*/

public static final int GAME_HEIGHT=600;

Tank MyTank=new Tank(700,400,true,Tank.Direction.STOP,this);

Listtanks=new ArrayList();

Listexplodes=new ArrayList();

Listmissiles=new ArrayList();

Wall w1=new Wall(300,200,20,200,this);

Wall w2=new Wall(600,300,30,150,this);

Blood b=new Blood();

/**

* 画一张虚拟图片;

*/

Image OffScreenImage=null;

public TankWarClient(String name)//设置文字

{

super(name);

}

/**

* 运行窗口;

*/

public void launchFrame()

{

for(int i=0;i

Wall.java

package com.hkm.TankWar;

import java.awt.*;

/**

* 生成阻碍物墙这个类;

* @author Hekangmin

*

*/

public class Wall {

/**

* x,y为墙的位置,w,h为宽度高度;

*/

int x,y,w,h;

/**

* 持有引用

*/

TankWarClient tc;

public Wall(int x, int y, int w, int h, TankWarClient tc) {

this.x = x;

this.y = y;

this.w = w;

this.h = h;

this.tc = tc;

}

public void draw(Graphics g)

{

Color c=g.getColor();

g.setColor(Color.GRAY);

g.fillRect(x,y,w,h);

g.setColor(c);

}

/**

* 得到墙的矩形区域;

* @return

*/

public Rectangle getRect()

{

return new Rectangle(x,y,w,h);

}

}

java怎么制作坦克大战?坦克大战是我们小时候的经典游戏,本文主要面向于学过Java的人群,与学了一段时间的人提供的实现方法。

如何用java让坦克发射子弹_java怎么制作坦克大战相关推荐

  1. 如何用java让坦克发射子弹_手把手教你用Java实现一个简易联网坦克对战小游戏 !...

    介绍 通过本项目能够更直观地理解应用层和运输层网络协议, 以及继承封装多态的运用. 网络部分是本文叙述的重点, 你将看到如何使用Java建立TCP和UDP连接并交换报文, 你还将看到如何自己定义一个简 ...

  2. 坦克大战_我方坦克发射子弹

    Members package com.wxh.tank3;//坦克类,父类 class Tank {// 表示坦克的横坐标int x = 0;// 坦克的纵坐标int y = 0;// 坦克方向// ...

  3. java 显示多行歌词_Java Swing制作多行滚动歌词显示控件 | 学步园

    首先上图一张,为最终制作的效果图,不喜欢或感到失望的朋友可以先行离开 大家已经看到效果图了.那么下面就介绍设计思路和源代码 首先要想显示歌词,就要对歌词文件进行抽象.下面这个类是对某一行歌词文件进行了 ...

  4. 初学5之坦克要求(做出坦克被子弹击中时的爆炸效果)

    上一节,写了当我方坦克发射子弹时,敌方坦克消失,现在要做的是,当我方坦克发射子弹时,敌方坦克不要直接消失,而是有爆炸的效果,从爆炸效果的生命周期从大到小的消失. 思路:(1)首先将炸弹做成一个类cla ...

  5. 小学生python游戏编程arcade----可旋转的坦克的发射子弹

    小学生python游戏编程arcade----可旋转的坦克的发射子弹 前言 小学生python游戏编程arcade----可旋转坦克的发射子弹 1.可旋转坦克的发射子弹 1.1 子弹的类 1.2 发射 ...

  6. 我所知道坦克大战(单机版)之画出炮筒、让坦克发射多发炮弹、让炮弹消亡...

    本章目的 使用炮筒来确定坦克目前的方向 让坦克发射多发炮弹问题 一.画出炮筒 一般坦克初始位置是不同的,但是我们目前的射击方向是与移动方向一致的 这就导致比较怪异,我们应该是初始时有一个射击方向,比如 ...

  7. Unity中玩家的攻击(发射子弹,挥剑)

    目前来说,我就知道玩家两种攻击方式,1.发射(子弹,弓箭),2.挥剑 1.发射子弹 想要玩家发射子弹,需要制作两个部分(玩家发射动画除外),第一个部分就是控制玩家的脚本,第二部分则是子弹部分,子弹部分 ...

  8. php 代码坦克,Python3+pygame实现的90坦克大战 代码完整 有演示效果

    我是一个典型的80后,年轻时玩过了特别多的游戏,所以这几天用Python3+pygame实现了一个另外小游戏"坦克大战"(其他的游戏,请翻阅我的博客) 本实例代码量有些多,完整的版 ...

  9. java中如何将子弹向对角发射_Java 坦克大战 tankwar

    tankwar 是使用java开发的一个单机版的小游戏 (未使用任何游戏引擎). 和90经典版的坦克大战有些不同, 这里是纯坦克之间的战争, 英雄坦克并不用保护它的家. 特色: 1. 游戏共设6个关卡 ...

最新文章

  1. android 网络编程--URL获取数据/图片
  2. discuz论坛整合ucenter免激活,同步登录,同步退出解决方案(附源码)
  3. 小区的足球场地实地拍摄
  4. (仿头条APP项目)1.app载入界面相关功能实现
  5. Volatile可见性、缓存一致性协议、指令重排、内存屏障 - 手写笔记
  6. list index out of bounds_python3基础03列表(list)和元组(tuple)
  7. 【重难点】【JUC 04】synchronized 原理、ReentrantLock 原理、synchronized 和 Lock 的对比、CAS 无锁原理
  8. java 二进制 归属权限_java 二进制 权限管理
  9. android开发项目app实例_JNPF快速开发平台-快速开发Web+APP项目的java开发平台
  10. openwrt添加SLM750模块驱动
  11. 建筑模式语言(美)c.亚历山大.pdf,建筑模式语言(上下)(精)
  12. android来电自定义显示图片,自定义来电显示
  13. linux把ftp挂载成盘符,使用curlftpfs将ftp空间挂载到本地
  14. VHDL数字时钟设计及引脚锁定方法
  15. r语言中which的使用_R语言绘图 | 使用pheatmap快速绘制热图
  16. 淘东电商项目(14) -公众号获取注册码功能
  17. PlumeLog-Java分布式日志组件,支持百亿级别,日志从搜集到查询,不用去文件中翻阅日志方便快捷
  18. iPhone 13如何显示电量百分比?详细教程
  19. 【蓝桥杯 数独填数 DFS】
  20. Linux下使用U盘

热门文章

  1. 快速排序,归并排序的递归实现(c++)
  2. SC92F8003读24C64程序
  3. C++ 内联函数/宏/outo/for/nullptr
  4. 微信摇一摇插件ios_苹果ios微信摇一摇代码实现
  5. 解决Windows10 无线显示屏连接失败问题
  6. Android studio游戏开发就是这么简单:卡牌杀系列(核心UI篇:SufaceView的核心用法)
  7. F-散度(F-divergence)
  8. 什么是对象、什么是面对对象?
  9. 数据库-等值连接与自然连接的区别
  10. Spring BlazeDS Integration 的工作原理