import javax.swing.JFrame;
import javax.swing.JPanel;
import java.applet.Applet;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.Toolkit;
import java.awt.Dimension;
import java.awt.Color;
import java.awt.Component;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Random;
import java.awt.Rectangle;
class frame extends JPanel implements KeyListener{
Tank tank=new Tank(50,50,this,true);
Tank bad1=new Tank(180,180,this,false);
Tank bad2=new Tank(240,300,this,false);
Tank bad3=new Tank(300,350,this,false);
Tank bad4=new Tank(400,450,this,false);
Tank bad5=new Tank(500,550,this,false);
ArrayList list=new ArrayList();
Bullet zidan=null;
frame(){
this.addKeyListener(this);
thread tt=new thread();
tt.start();
}
class thread extends Thread{
public void run(){
while(true){
try{
sleep(100);
}
catch(Exception e){
}
repaint();
}
}
}
public void paintChildren(Graphics g){
//public void paintComponent(Graphics g)
super.paintComponents(g);
/* Iterator ite=list.iterator();
while(ite.hasNext()){
zidan=((Bullet)ite.next());
zidan.hitTank(tank);
zidan.hitTank(bad1);
zidan.hitTank(bad2);
zidan.hitTank(bad3);
zidan.hitTank(bad4);
zidan.hitTank(bad5);
zidan.crash(list);
zidan.drawBullet(g);
}
*/
for(int i=0;i<list.size();i++){
zidan = (Bullet)list.get(i);
if(zidan.x<0||zidan.y<30||zidan.x>760||zidan.y>560){
list.remove(i);
}
zidan.hitTank(tank);
zidan.hitTank(bad1);
zidan.hitTank(bad2);
zidan.hitTank(bad3);
zidan.hitTank(bad4);
zidan.hitTank(bad5);
zidan.crash(list);
if(zidan.crash(list)){
list.remove(i);
}
zidan.drawBullet(g);
}
System.out.println(list.size());
tank.draw(g);
bad1.draw(g);
bad2.draw(g);
bad3.draw(g);
bad4.draw(g);
bad5.draw(g);
}
public void keyTyped(KeyEvent e){
}
public void keyPressed(KeyEvent e){
tank.pressed(e);
}
public void keyReleased(KeyEvent e){
tank.released(e);
}
}
//********************************************
class Gun{//炮管
int gunx1;
int guny1;
int gunx2;
int guny2;
int gundir;
public Gun(){
}
public Gun(int gx2,int gy2){
gunx2=gx2;
guny2=gy2;
}
public void drawGun(Graphics g,int x,int y,int dir){
gunx1=x+15;
guny1=y+15;
gundir=dir;
switch(gundir){
case 1:
gunx2=gunx1-30;
guny2=guny1;
break;
case 2:
gunx2=gunx1-21;
guny2=guny1-21;
break;
case 3:
guny2=guny1-30;
gunx2=gunx1;
break;
case 4:
gunx2=gunx1+21;
guny2=guny1-21;
break;
case 5:
gunx2=gunx1+30;
guny2=guny1;
break;
case 6:
gunx2=gunx1+21;
guny2=guny1+21;
break;
case 7:
guny2=guny1+30;
gunx2=gunx1;
break;
case 8:
gunx2=gunx1-21;
guny2=guny1+21;
break;
case 0:
break;
}
// System.out.println(gunx2+" "+guny2);
g.setColor(Color.BLACK);
g.drawLine(gunx1,guny1,gunx2,guny2);
}
}
//***********************************************************************
class Tank{//坦克
int x;
int y;
int dir=0;
frame bb;
boolean good=true;
boolean live=true;
static int dir2=5;
static int dir3=4;
static int dir4=0;
int setcolor=1;
Gun gun=null;
private boolean bL=false, bU=false, bR=false, bD = false,fire=false,boom=false;
public static final int XSPEED = 10;
public static final int YSPEED = 10;
Random ran=new Random();
int step=ran.nextInt(12)+3;
Tank(int x,int y,frame bb,boolean good){
this.x=x;
this.y=y;
this.good=good;
this.bb=bb;
gun=new Gun();
if(!good){
gun=new Gun(x+30,y+30);
}
}
public void draw(Graphics g){
if(!live){
return;
}
if(x<0)x=0;
if(y<30)y=30;
if(x>760)x=760;
if(y>560)y=560;
if(good){
g.setColor(Color.RED);
g.fillOval(x,y,30,30);
if(dir==0){
gun.drawGun(g,x,y,dir2);
}
else gun.drawGun(g,x,y,dir);
if(fire){
if(dir==0){
bb.list.add(new Bullet(gun.gunx2-5,gun.guny2-5,dir2,true));
}
else bb.list.add(new Bullet(gun.gunx2-5,gun.guny2-5,dir,true));
}
if(boom){
bb.list.add(new Bullet(x,y,dir4,true,setcolor));
System.out.println(x+" "+y);
}
}
if(!good){
g.setColor(Color.GREEN);
g.fillOval(x,y,30,30);
if(step==0){
step=ran.nextInt(12)+3;
dir=ran.nextInt(8);
}
step--;
gun.drawGun(g,x,y,dir);
if(ran.nextInt(40)>35){
if(dir==0) {
bb.list.add(new Bullet(gun.gunx2-5,gun.guny2-5,dir2,false));
}
else bb.list.add(new Bullet(gun.gunx2-5,gun.guny2-5,dir,false));
}
}
switch(dir) {
case 1: //左
x -= XSPEED;
break;
case 2: //左上
x -= XSPEED;
y -= YSPEED;
break;
case 3: //上
y -= YSPEED;
break;
case 4: //右上
x += XSPEED;
y -= YSPEED;
break;
case 5: //右
x += XSPEED;
break;
case 6: //右下
x += XSPEED;
y += YSPEED;
break;
case 7: //下
y += YSPEED;
break;
case 8: //左下
x -= XSPEED;
y += YSPEED;
break;
case 0:
break;
}
}
public void pressed(KeyEvent e){
int key=e.getKeyCode();
switch(key){
case KeyEvent.VK_UP:
bU=true;
break;
case KeyEvent.VK_DOWN:
bD=true;
break;
case KeyEvent.VK_LEFT:
bL=true;
break;
case KeyEvent.VK_RIGHT:
bR=true;
break;
case KeyEvent.VK_CONTROL:
fire=true;
break;
case KeyEvent.VK_SHIFT:
boom=true;
break;
}
if(bL && !bU && !bR && !bD) dir=1;
else if(bL && bU && !bR && !bD) dir = 2;
else if(!bL && bU && !bR && !bD) dir = 3;
else if(!bL && bU && bR && !bD) dir = 4;
else if(!bL && !bU && bR && !bD) dir = 5;
else if(!bL && !bU && bR && bD) dir = 6;
else if(!bL && !bU && !bR && bD) dir = 7;
else if(bL && !bU && !bR && bD) dir = 8;
else if(!bL && !bU && !bR && !bD) dir = 0;
}
public void released(KeyEvent e){
if(dir==0){
}
else dir2=dir;
int key=e.getKeyCode();
switch(key){
case KeyEvent.VK_UP:
bU=false;
break;
case KeyEvent.VK_DOWN:
bD=false;
break;
case KeyEvent.VK_LEFT:
bL=false;
break;
case KeyEvent.VK_RIGHT:
bR=false;
break;
case KeyEvent.VK_CONTROL:
fire=false;
break;
case KeyEvent.VK_SHIFT:
boom=false;
break;
}
if(bL && !bU && !bR && !bD) dir=1;
else if(bL && bU && !bR && !bD) dir = 2;
else if(!bL && bU && !bR && !bD) dir = 3;
else if(!bL && bU && bR && !bD) dir = 4;
else if(!bL && !bU && bR && !bD) dir = 5;
else if(!bL && !bU && bR && bD) dir = 6;
else if(!bL && !bU && !bR && bD) dir = 7;
else if(bL && !bU && !bR && bD) dir = 8;
else if(!bL && !bU && !bR && !bD) dir = 0;
}
public Rectangle getRect() {
return new Rectangle(x, y, 30, 30);
}
public boolean isLive() {
return live;
}
public void setLive(boolean live) {
this.live = live;
}
public boolean isGood() {
return good;
}
}
//******************************Bullet
class Bullet{
int x;
int y;
int dir=2;
int setcolor;
boolean live=true;
boolean good=true;
public Bullet(int x,int y,int dir,boolean good){
this.x=x;
this.y=y;
this.dir=dir;
this.good=good;
}
public Bullet(int x,int y,int dir,bo