Tank大战0.1版

原创 2012年07月02日 09:19:48
//In this version, I want this tank can shoot bullet.
//I have done this.
//*******I WANT TWO KEY CAN BE PRESS AT THE SAMETIME.******
//1.在这儿我的思路是,写两个线程分别来监听space键和上下左右键....但是没能成功. 还是不能实现一边走一边打... 在这个版本中....坦克的移动使用了
//2.键盘上下左右的监听,然后子弹使用了线程...因为需要让他自动飞...用ArrayList来装产生的子弹,每次按space键就生成一发子弹. 产生一个线程,但是
//3.使用过程中用Iterator遍历一直出问题,不知道什么原因,现在改成了直接用ArrayList自带方法实现.
//4.在实现窗口关闭的简单功能中使用了匿名类.
//5.利用tankDir来识别坦克的方向,根据方向来确定子弹的行驶路径.同时子弹中也加入了方向的属性.
//6.BulletThread中传入Bullet的引用根据子弹的方向属性来改变子弹的参数.
//7.使用Adapter.
//8.这个版本将解决闪烁问题.使用update 双缓冲机制. 重写update方法.

import java.awt.*;
import java.awt.event.*;
import java.util.*;

public class TankClient extends Frame {

	int i=100;
	int j=100;
	int k=i+30;
	int m=j+5;
	int tankDir=2;
	ArrayList<Bullet> BTA;
	Image offScreen;             //定义一张图片,先将图画在图片上.
	
	public void paint(Graphics g) {
		g.setColor(Color.green);
		g.fillRect(i, j, 30, 20);
		g.fillRect(k,m, 10, 10); 
		g.setColor(Color.red);
		int k=BTA.size();
		Bullet tp;
		while(k!=0) {			
			tp=BTA.get(k-1);
			g.fillOval(tp.x,tp.y, 5, 5);
			k--;
		}	
	}
	
	public void update(Graphics g) {  //可以看出画笔功能肯定都是用的这个方法....保留痕迹没有擦出之前的.
		if(offScreen==null) {
	//		offScreen =g.createImage(700,550);  //用Frame的画笔画一张图. 不是这样画...
			offScreen =this.createImage(700, 550);  //是用Frame的方法创建一张图片.
		}
		Graphics osg= offScreen.getGraphics();  //要在offScreen上画图,需要得到offScreen的画笔.
		osg.setColor(Color.yellow);
		osg.fillRect(0, 0, 700, 550);  //把以前画的用一个矩形刷掉.
		paint(osg);  //将所有要画的内容先画在offScreen上面. 这里可以重写上面代码...当然直接调用paint()方法更好.
		g.drawImage(offScreen, 0, 0, null);  //将offScreen图片中的内容再画到Frame中去.
	}

	
	public static void main(String[] args) {
		new TankClient().launchTank();
	}
	
	public void launchTank() {
		BTA=new ArrayList<Bullet>();
		setLocation(500,150);
		setSize(700,550);
		setBackground(Color.yellow);
		this.setResizable(false);
		setTitle("TankWar");
		setVisible(true);
		new KeyThread(this,new KeyMonitor1()).start();
		new KeyThread(this,new KeyMonitor2()).start();
		addWindowListener(new WindowAdapter(){          //USE ADAPTER-----||匿名类
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});
	}
	
private class Bullet extends Point {
	int dir;
	Bullet(int x,int y,int dir) {
		this.x=x;
		this.y=y;
		this.dir=dir;
		
	}
}

private class KeyThread extends Thread {
	TankClient x;
	KeyAdapter ka;
	KeyThread(TankClient x,KeyAdapter ka) {
		this.x=x;
		this.ka=ka;
	}
	public void run() {
		x.addKeyListener(ka);
	}
}

private class BulletThread extends Thread{
	Bullet BT;
	BulletThread(Bullet x) {
		BT=x;
	}
	public void run() {
		while((BT.x!=0)&&(BT.x!=700)&&(BT.y!=0)&&(BT.y!=550)) {
			if(BT.dir==1) {
			BT.x=BT.x-5;
			try {
				BulletThread.sleep(20);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			repaint();
			}
			if(BT.dir==2) {
				BT.x=BT.x+5;
				try {
					BulletThread.sleep(20);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				repaint();
				}
			if(BT.dir==3) {
				BT.y=BT.y-5;
				try {
					BulletThread.sleep(20);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				repaint();
				}
			if(BT.dir==4) {
				BT.y=BT.y+5;
				try {
					BulletThread.sleep(20);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				repaint();
				}
		}
		
		BTA.remove(BT);	
	}
	
}

class KeyMonitor1 extends KeyAdapter {

	@Override
	public void keyPressed(KeyEvent e) {
		if(e.getKeyCode()==e.VK_LEFT) {
			i=i-5;
			k=i-10;
			m=j+5;
			tankDir=1;
			repaint();
		}
		if(e.getKeyCode()==e.VK_RIGHT) {
			i=i+5;
			k=i+30;
			m=j+5;
			tankDir=2;
			repaint();
		}
		if(e.getKeyCode()==e.VK_UP) {
			j=j-5;
			k=i+10;
			m=j-10;
			tankDir=3;
			repaint();
		}
		if(e.getKeyCode()==e.VK_DOWN) {
			j=j+5;
			k=i+10;
			m=j+20;
			tankDir=4;
			repaint();
		}
		
	}			
}

class KeyMonitor2 extends KeyAdapter {

	public void keyPressed(KeyEvent e) {
		if(e.getKeyCode()==e.VK_SPACE) {
			if(tankDir==1) {
				Bullet tep=new Bullet(k,m+2,1);
				BTA.add(tep);
				new BulletThread(tep).start();
			}
			if(tankDir==2) {
				Bullet tep=new Bullet(k+10,m+2,2);
				BTA.add(tep);
				new BulletThread(tep).start();
			}
			if(tankDir==3) {
				Bullet tep=new Bullet(k+2,m,3);
				BTA.add(tep);
				new BulletThread(tep).start();
			}
			if(tankDir==4) {
				Bullet tep=new Bullet(k+2,m+10,4);
				BTA.add(tep);
				new BulletThread(tep).start();
			}
		}
	}
	
}
}


Tank大战,坦克移动

public class PlayerTank : MonoBehaviour {     public float speed;     public Image bg;     p...
  • weixin_39892706
  • weixin_39892706
  • 2017年10月28日 08:53
  • 38

Tank大战0.8 版本

说明:这个版本中添加了爆炸的效果. 1.爆炸效果在子弹击中坦克时发生. 2.要在窗口中看到爆炸,必须由窗口画出爆炸..... 1.新建爆炸类. import java.awt.Colo...
  • iwaich
  • iwaich
  • 2012年07月07日 04:56
  • 274

Web版tank大战

采用js技术创作的web版坦克大战,有用js模拟多线程技术,目前只支持IE,其他浏览器未写具体代码:这是一个web版的tank大战程序,可以进行初步的游戏任何人都可以修改或优化该程序若你修改或优化出更...
  • chenyijiu
  • chenyijiu
  • 2008年10月05日 23:10
  • 682

Java实现Tank大战联机版

前言                 在前面对于Java初学者开发简单的桌面游戏的碰撞检测的总结中,笔者特意去翻了翻U盘里面           的东西。发现以前用Java做的Tank大战游戏还静...
  • kiritor
  • kiritor
  • 2013年05月20日 08:43
  • 5106

POJ3635 Full Tank?(最短路+DP)

n个城市之间有m条双向路。每条路要耗费一定的油量。每个城市的油价是固定并且已经给出的。有q个询问,表示从城市s走到e,油箱的容量为c,求最便宜的方案。 dp(i,j)表示走到城市i,剩余油量为j的最...
  • cqbzwja
  • cqbzwja
  • 2016年03月27日 22:54
  • 609

What Is a Tank Circuit?

A tank circuit is an electronic circuit used in many applications, including  oscillators, TV and ra...
  • phenixyf
  • phenixyf
  • 2012年10月19日 16:03
  • 1145

poj 3635 Full Tank? ( 图上dp )

题意: 已知每个点的加油站的油价单价(即点权),每条路的长度(边权)。 有q个询问,每个询问包括起点s、终点e和油箱容量。 问从起点走到终点的最小花费。如果不可达输出impossible,否则输...
  • u012841845
  • u012841845
  • 2014年07月10日 23:20
  • 718

POJ 3635 Full Tank? 最短路变形

题意:给出一张图,n 网上大部分的思路都是类似于dij的那种扩展。 首先定义一个二维数组dp。 dp[i][j] 表示走到i点剩余j个单位的汽油时的最小花费 然后维护一个优先队列。  每...
  • sdj222555
  • sdj222555
  • 2012年06月26日 15:15
  • 1901

HDU5575 Discover Water Tank 2015上海现场赛D题 (树形dp,并查集,左偏树)

题目大意: 有一个1维的长度为N,高度无限的水柜,现在要用N-1个挡板将其分为N个长度为1的小格,然后向水柜中注水,水可以低于挡板也可以以溢出去(这样就要与旁边格子的水位相同),现在有M次探测,探测...
  • qq_19592437
  • qq_19592437
  • 2015年12月10日 17:17
  • 2329

在红心大战中作弊

“亲爱的朋友们,其实我并不是要偷走你们的心... - 凯撒大帝,第三场,第二幕”这是 Microsoft 网上红心大战 中的名言,我也由此来提及一下该游戏的作弊问题。其实原来初中电脑课我跟同学玩的时候...
  • frontgoggle
  • frontgoggle
  • 2006年08月25日 22:20
  • 2897
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Tank大战0.1版
举报原因:
原因补充:

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