java坦克大战源码,深入理解java多线程,和线程的生命周期

这是很多年前写的,坦克大战,对理解java有很好的帮助,尤其是多线程。每一个线程都是一个生命,包括坦克的出生到被打死,还有炮弹的。源码在后面有公布。

这个是个单机版游戏,可以进行存档,记录分数等基本功能。

初始化界面
java坦克大战
游戏进行中

java坦克大战
粉色坦克是敌军坦克,黄色坦克是自己,每打掉一个坦克分数会加1,打完所有敌军坦克后进入下一局,打更多的坦克。

按下键盘上W S A D键分别表示上下左右运动键,K键表示发射炮弹。

java坦克大战

话说我为了截这个坦克被打掉的图费了老大的力气。

打掉敌军4个坦克
java坦克大战

代码太多,这里只贴部分代码了,后面会附上所有源码。

@Override
public void paint(Graphics g) {
	if(b){
		super.paint(g);
		g.fillRect(0, 0, 600, 600);
		//敌人坦克剩余数
		this.tankDraw(630, 40, g, 3, 2);
		//自己坦克剩余数
		this.tankDraw(630, 100, g, mytank.gettankType(), 2);
		//分数
		Font scoreFont=new Font(null,Font.BOLD,18);
		g.setColor(Color.BLACK);
		g.drawString("分数:", 610, 160);
		g.drawString(new Integer(scoreCount).toString(), 640, 160);
		
		//画自己坦克
		if(mytank.isLive){
		    this.tankDraw(mytank.getTankx(), mytank.getTanky(), g, mytank.gettankType(), mytank.getTankdirect());
		}
		//画敌人坦克
		for(int i=0;i<eneVc.size();i++){
			Enemy nowEnemy=eneVc.get(i);
			if(nowEnemy.isLive){
			   this.tankDraw(nowEnemy.getTankx(), nowEnemy.getTanky(), g, nowEnemy.gettankType(), nowEnemy.getTankdirect());
			}
			if(!nowEnemy.isLive){
				eneVc.removeElement(nowEnemy);
			}	
		}
		//画敌人坦克炮弹
		for(int i=0;i<allShell.size();i++){
    		Shell noweneshell=allShell.get(i);
    		if(noweneshell!=null&&noweneshell.isLive){
    		   g.draw3DRect(noweneshell.getSx(), noweneshell.getSy(), 2, 2, false);
    		}else{
    			allShell.remove(noweneshell);
    		}			
		}
		//画我坦克的炮弹
		for(int i=0;i<mytank.vecShell.size();i++){
			Shell myShell=mytank.vecShell.get(i);
			if(myShell!=null&&myShell.isLive){//炮弹重发射到毁灭过程画炮弹
				g.setColor(Color.YELLOW);
				g.draw3DRect(myShell.getSx(), myShell.getSy(), 1, 1, false);
			}
			if(!myShell.isLive){
				mytank.vecShell.removeElement(myShell);
			}
		}
		//画被击中爆炸效果
		for(int i=0;i<bombVc.size();i++){
			Bomb nowb=bombVc.get(i);
			if(nowb.isLive){
				if(nowb.life>6){
					g.drawImage(bomb1,nowb.bx,nowb.by, 50, 50, this);
				}else if(nowb.life>3){
					g.drawImage(bomb2,nowb.bx,nowb.by, 50, 50, this);
				}else{
					g.drawImage(bomb3,nowb.bx,nowb.by, 50, 50, this);
				}
			}
			nowb.lifeDown();
			if(!nowb.isLive){
				bombVc.removeElement(nowb);
			}
		}
	}	
	else{//游戏结束
	   g.setColor(Color.CYAN);
	   Font tankFont=new Font(null, Font.BOLD, 50);
	   g.setFont(tankFont);
	   g.drawString("游戏结束", 200, 200);
	}
}
//画坦克
public void tankDraw(int x,int y,Graphics g, int tankType,int tankdirect){
	int tt=tankType;
	switch (tt) {
	case 0:
		g.setColor(Color.YELLOW);
		break;
	case 1:
		g.setColor(Color.ORANGE);
		break;
	case 2:
		g.setColor(Color.CYAN);
		break;
	case 3:
		g.setColor(Color.PINK);
		break;	
	default:
		g.setColor(Color.WHITE);
		break;
	}
	//根据炮筒端点为坐标确定坦克位置
	if(tankdirect==0){//0向右
		g.fill3DRect(x-12, y-8, 24, 16, false);
		g.drawLine(x, y, x+20, y);
		g.fillOval(x-5, y-5, 10, 10);
		g.fill3DRect(x-20, y-16, 40, 10, false);
		g.fill3DRect(x-20, y+8, 40, 10, false);
	}else if(tankdirect==1){//1向左
		g.fill3DRect(x-12, y-8, 24, 16, false);
		g.drawLine(x, y, x-20, y);
		g.fillOval(x-5, y-5, 10, 10);
		g.fill3DRect(x-20, y-16, 40, 10, false);
		g.fill3DRect(x-20, y+8, 40, 10, false);			
	}else if(tankdirect==2){//2向上
		g.fill3DRect(x-8, y-12, 16, 24, false);
		g.drawLine(x, y, x, y-20);
		g.fillOval(x-5, y-5, 10, 10);
		g.fill3DRect(x+8, y-20, 10, 40, false);
		g.fill3DRect(x-18, y-20, 10, 40, false);				
	}else if(tankdirect==3){//3向下
		g.fill3DRect(x-8, y-12, 16, 24, false);
		g.drawLine(x, y, x, y+20);
		g.fillOval(x-5, y-5, 10, 10);
		g.fill3DRect(x+8, y-20, 10, 40, false);
		g.fill3DRect(x-18, y-20, 10, 40, false);			
	}
}

我用的java版本1.8
java坦克大战
源码下载,请赏点积分
https://download.csdn.net/download/lb87626/12403337

或者加我v: lb87626 单独发你哈

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我是杂牌军

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值