基于JAVA的简易坦克大战(七)

原创 2013年12月05日 09:47:56

4.2.3 炮弹类算法

1、炮弹类实现了炮弹的draw方法和子弹的move方法。

2、Draw方法是通过调用JAVA封装的内部方法来实现的。Move方法是根据坦克炮筒的方向和子弹的速度来改变子弹的坐标。再通过坦克大战管理类的线程重画来实现子弹的动态移动效果的。

3、炮弹类设计源码:
import java.awt.*;
public class Shell {
    
	private static final int Speech = 10;//子弹速度
	private static final int width = 10;
	private static final int height = 10;//子弹图形区域宽高
	private int x;
	private int y;//子弹坐标
	private boolean good;//子弹敌我识别
	private boolean live = true;
	public boolean isLive() {
		return live;
	}
	public void setLive(boolean live) {
		this.live = live;
	}
	public boolean isGood() {
		return good;
	}
	public void setGood(boolean good) {
		this.good = good;
	}
	private TankClient tc = null;
	Tank.Direction sDir = null;
	public static void main(String[] args) {
		// TODO Auto-generated method stub

	}
	public Shell(int x,int y,boolean good,Tank.Direction sDir,TankClient tc){
		this.x = x;
		this.y = y;
		this.good = good;
		this.sDir = sDir;
		this.tc = tc;
	}
	public void drawShell(Graphics g){
		Color c = g.getColor();
		g.setColor(Color.WHITE);
		g.fillOval(x, y, width, height);
		g.setColor(c);
		
		move();
	}
	//有方向弹药就会移动
	public void move(){
		switch(sDir){
		case L:x -= Speech;break; 
		case LU:x -= Speech;y -= Speech;break; 
		case LD:x -= Speech;y += Speech;break; 
		case R:x += Speech;break; 
		case RU:x += Speech;y -= Speech;break; 
		case RD:x += Speech;y += Speech;break; 
		case U:y -= Speech;break; 
		case D:y += Speech;break; 
		case STOP:
		}
		if(x < 0 || y < 0 || x > 800 || y >600 || !isLive())
		{
			tc.shells.remove(this);
			setLive(false);
		}
	}
	//获取子弹所占区域
    public Rectangle getRect(){
    	return new Rectangle(x,y,width,height);
    }
}

4.2.4 胶囊类算法

1、胶囊类实现了胶囊的draw方法和move方法以及和我方坦克的碰撞检测方法。

2、Draw方法是通过调用JAVA内部封装的方法来实现的。

3、Move方法是通过随机数的方式来判定移动方向的,再根据方向来改变胶囊的坐标,通过坦克大战管理类的线程重画来实现不规则移动效果的。

4、胶囊类型的随机是在坦克大战管理类的paint方法中实现的,每次重画就会在一定范围内随机数,通过随机数来改变胶囊的类型。

5、我方坦克所占的方框范围与胶囊的所占的方框范围重合时,判断我方坦克“吃”掉了胶囊,胶囊属性live = false,此时在线程重画时就不再将胶囊画出,直到再次创建出新的胶囊。

//胶囊类的设计源码:
import java.awt.*;
import java.util.Random;

public class Blood {
	private static final int Speech = 15;
	private int x = 400;
	private int y = 300;
	private int number;//胶囊类型
	private int oldX;
	private int oldY;
	private boolean live = true;
	private int width = 20;
	private int height = 20;
	private TankClient tc = null;
	enum Direction{L,LU,LD,R,RU,RD,U,D,STOP}
	Direction dir = Direction.R;
	public static void main(String[] args) {
		// TODO Auto-generated method stub
	}
	public boolean isLive() {
		return live;
	}
	public void setLive(boolean live) {
		this.live = live;
	}
	public Blood(int number,TankClient tc) {
		super();
		this.number = number;
		this.tc = tc;
	}

	public void drawBlood(Graphics g){
		Color c = g.getColor();
		if(isLive() && number == 0)//0号胶囊为回血胶囊
		{	
			g.setColor(Color.RED);
			g.draw3DRect(x, y, width, height,true);
			g.drawString("回血", x + width/2, y + height/2);
		}
		else if(isLive() && number == 1)//1号胶囊为减血胶囊
		{
			g.setColor(Color.ORANGE);
			g.draw3DRect(x, y, width, height,true);
			g.drawString("未知", x + width/2, y + height/2);
		}
		g.setColor(c);
		move();
	}
	public void move(){
		Random rn = new Random();
		int bDir = rn.nextInt(9);
		oldX = x;
		oldY = y;
		switch(bDir){
		case 0:x -= Speech;break; //L
		case 1:x -= Speech;y -= Speech;break;//LU 
		case 2:x -= Speech;y += Speech;break; //LD
		case 3:x += Speech;break; //R
		case 4:x += Speech;y -= Speech;break;//RU 
		case 5:x += Speech;y += Speech;break; //RD
		case 6:y -= Speech;break; //U
		case 7:y += Speech;break; //D
		case 8:stay();break;
		}
		if(x < 0 || y < 30 || x > 770 || y > 570)
			stay();
		//碰撞检测
		hitCheck();
	}
	public void stay(){
		x = oldX;
		y = oldY;
	}
	public Rectangle getRect(){
		return new Rectangle(x,y,width,height);
	}
	public void hitCheck(){
		if(getRect().intersects(tc.myTank.getRect()) && isLive() && number == 0)
		{
			tc.myTank.setLife(30);
			setLive(false);
		}
		else if(getRect().intersects(tc.myTank.getRect()) && isLive() && number == 1)
		{
			int tempLife = tc.myTank.getLife();
			tc.myTank.setLife(tempLife - 10);
			setLive(false);
			if(tc.myTank.getLife() == 0)
			{
				tc.myTank.setLive(false);
				tc.myTank.setScore(0);
				tc.myTank.setLevel(0);
			}
		}
	}
}



基于JAVA的简易坦克大战(四)

第三章 算法概要设计   3.1 软件结构 1.坦克大战游戏概念详见:2.3缩写及缩略语。 2.本坦克大战游戏按类(详见2.3)可以分为六大模块: (1)坦克大战管理类(Tankclient)。 (2...

基于JAVA的简易坦克大战(六)

4.2.2 坦克类算法 1、坦克类是坦克大战的重要模块,这里包含了坦克应该有的成员属性(详见逻辑结构设计)。坦克大战管理类的按键监听使用的就是在坦克类中实现的keyPressed方法和KeyRele...

基于JAVA的简易坦克大战(五)

第四章 算法详细设计   4.1 程序描述 本坦克大战游戏通过监听用户的键盘输入对我方坦克即游戏的相关模式进行相应的操作。 用户只要给出坦克方向,坦克便会根据方向相应的改变坦克的坐标,再通过坦...

基于JAVA的简易坦克大战(八)

4.2.5 爆炸效果类算法 1、爆炸效果类通过在子弹有效打击的时候,在子弹和击杀坦克接触的坐标上按规定的爆炸步数,画出不同半径的圆来模拟爆炸效果的。 2、爆炸效果类的设计源码: import j...

基于JAVA的简易坦克大战(三)

第一章 运行环境(软、硬件环境)   1.1 坦克大战游戏的运行软件环境   本坦克大战游戏是基于JAVA语言程序设计,利用Eclipse 3.7.0在Windows操作系统环境下开发测试实现...

坦克大战-java简易版

  • 2013年04月22日 17:32
  • 21KB
  • 下载

简易的java版坦克大战游戏

  • 2014年03月14日 21:52
  • 459KB
  • 下载

Java坦克大战 (七) 之图片版

本文来自:小易博客专栏。转载请注明出处:http://blog.csdn.net/oldinaction 在此小易将坦克大战这个项目分为几个版本,以此对J2SE的知识进行回顾和总结,希望这样...

简易坦克大战单机版

  • 2013年01月07日 09:54
  • 394B
  • 下载

Java坦克大战游戏(人机对战)

打开IDE,无意中看到了大二的时候用java写的一个坦克大战游戏,那时刚学习java语言,很渴望写一个游戏出来,于是拼命自学java GUI,现在看来java swing的用处并不大,这可能也是当时j...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:基于JAVA的简易坦克大战(七)
举报原因:
原因补充:

(最多只允许输入30个字)