packagetankwar;
	
	
		 
	
	
		importjava.awt.Color;
	
	
		importjava.awt.Font;
	
	
		importjava.awt.Graphics;
	
	
		importjava.awt.event.KeyEvent;
	
	
		importjava.awt.event.KeyListener;
	
	
		importjava.io.File;
	
	
		importjava.io.FileInputStream;
	
	
		importjava.util.ArrayList;
	
	
		importjava.util.Random;
	
	
		 
	
	
		importjavax.swing.BorderFactory;
	
	
		importjavax.swing.ImageIcon;
	
	
		importjavax.swing.JFrame;
	
	
		importjavax.swing.JPanel;
	
	
		 
	
	
		importtankwar.Tank.Direction;
	
	
		importbarrier.EnemyBorn;
	
	
		importbarrier.Gold;
	
	
		importbarrier.Home;
	
	
		importbarrier.Iron;
	
	
		importbarrier.SelfBorn;
	
	
		importbarrier.Wall;
	
	
		/**
	
	
		 * Java学习交流QQ群:589809992 我们一起学Java!
	
	
		 */
	
	
		publicclassTankWarimplementsKeyListener {
	
	
		  staticbooleanTIMEOUT =false;
	
	
		  privateJFrame f;
	
	
		  privateJPanel gamePanel;
	
	
		  privatePanelShow messgePanel;
	
	
		  privatemyPanel p;
	
	
		  privateTank myTank;
	
	
		  publicstaticfinalintAREA_WIDTH =830;
	
	
		  publicstaticfinalintAREA_HEIGHT =800;
	
	
		  privateArrayList<Missle> missles =newArrayList<Missle>();
	
	
		  privateArrayList<Tank> allTanks =newArrayList<Tank>();
	
	
		  privateArrayList<Boom> booms =newArrayList<Boom>();
	
	
		  privateArrayList<Wall> walls =newArrayList<Wall>();
	
	
		  privateArrayList<Iron> irons =newArrayList<Iron>();
	
	
		  privateArrayList<Gold> golds =newArrayList<Gold>();
	
	
		  privateArrayList<Item> items =newArrayList<Item>();
	
	
		  privateArrayList<EnemyBorn> enemyBorns =newArrayList<EnemyBorn>();
	
	
		  privateSelfBorn selfBorn;
	
	
		  privateHome home;
	
	
		  privateTank enemyTank;
	
	
		  privateRandom r;
	
	
		  privateImageIcon backGround;
	
	
		  privatefinalString map;
	
	
		  privateinttankMax;
	
	
		  privatebooleanover =false;
	
	
		  privatestaticintselfMax =3;
	
	
		  privatebooleanwin;
	
	
		  privatebooleanflash =false;
	
	
		  privateTankWar tw =this;
	
	
		  staticintSCORE =0;
	
	
		 
	
	
		  privatefinalJFrame mainF;
	
	
		  privateintstyle;
	
	
		 
	
	
		  publicTankWar(String map,inttankMax, JFrame mainF,intstyle)
	
	
		      throwsException {
	
	
		    this.map = map;
	
	
		    this.tankMax = tankMax;
	
	
		    this.mainF = mainF;
	
	
		    this.style = style;
	
	
		    init();
	
	
		  }
	
	
		 
	
	
		  privatevoidinit() {
	
	
		    f =newJFrame("坦克大战 V3.0");
	
	
		    gamePanel =newJPanel(null);
	
	
		    p =newmyPanel();
	
	
		    p.setBackground(Color.WHITE);
	
	
		    r =newRandom();
	
	
		    messgePanel =newPanelShow();
	
	
		    initMap(newFile("map/"+ map));
	
	
		 
	
	
		    try{
	
	
		      myTank =newTank(selfBorn.getX(), selfBorn.getY(),true, allTanks,
	
	
		          walls, irons, golds, missles, home, booms, style);
	
	
		    }catch(Exception e1) {
	
	
		    }
	
	
		    myTank.setDir(Direction.U);
	
	
		 
	
	
		    allTanks.add(myTank);
	
	
		    addTank();
	
	
		    try{
	
	
		      backGround =newImageIcon(
	
	
		          TankWar.class.getResource("/pic/whiteback.jpg"));
	
	
		    }catch(Exception e) {
	
	
		    }
	
	
		 
	
	
		    p.setBorder(BorderFactory.createEtchedBorder(Color.BLACK, Color.WHITE));
	
	
		    p.setSize(AREA_WIDTH, AREA_HEIGHT);
	
	
		    messgePanel.setBounds(AREA_WIDTH,0,200, AREA_HEIGHT);
	
	
		    gamePanel.add(messgePanel);
	
	
		    gamePanel.add(p);
	
	
		    f.add(gamePanel);
	
	
		    f.setBounds(0,0, AREA_WIDTH +200, AREA_HEIGHT);
	
	
		    f.setDefaultCloseOperation(3);
	
	
		    f.setResizable(true);
	
	
		    f.setFocusable(true);
	
	
		    f.addKeyListener(this);
	
	
		    f.setVisible(true);
	
	
		 
	
	
		    newThread(newRunnable() {
	
	
		      publicvoidrun() {
	
	
		        while(!over) {
	
	
		          if(!myTank.isLive()) {
	
	
		            selfMax--;
	
	
		            if(selfMax <0) {
	
	
		              f.removeKeyListener(tw);
	
	
		              over =true;
	
	
		              win =false;
	
	
		              break;
	
	
		            }else{
	
	
		              myTank.setLevel(1);
	
	
		              myTank.setX(selfBorn.getX());
	
	
		              myTank.setY(selfBorn.getY());
	
	
		              myTank.setDir(Direction.U);
	
	
		              myTank.setHp(50);
	
	
		              myTank.setLive(true);
	
	
		            }
	
	
		          }
	
	
		          if(tankMax <=0&& allTanks.size() ==1) {
	
	
		            f.removeKeyListener(tw);
	
	
		            over =true;
	
	
		            win =true;
	
	
		          }
	
	
		          if(!home.isLive()) {
	
	
		            f.removeKeyListener(tw);
	
	
		            over =true;
	
	
		            win =false;
	
	
		          }
	
	
		          p.repaint();
	
	
		          myTank.move();
	
	
		          for(inti =1; i < allTanks.size(); i++) {
	
	
		            allTanks.get(i).move();
	
	
		            allTanks.get(i).setNoFire(myTank.getNoFire() +1);
	
	
		            // if(allTanks.get(i).getX()%5==0&&allTanks.get(i).getY()%5==0)
	
	
		            aI(allTanks.get(i));
	
	
		          }
	
	
		          if(allTanks.size() <= enemyBorns.size() +1)
	
	
		            addTank();
	
	
		          myTank.setNoFire(myTank.getNoFire() +1);
	
	
		          messgePanel.setEnemyCount(tankMax);
	
	
		          messgePanel.setSelfCount(selfMax);
	
	
		          messgePanel.setScore(SCORE);
	
	
		          if(SCORE %500==0) {
	
	
		            SCORE +=100;
	
	
		            Item item =newItem(allTanks, booms, irons, home);
	
	
		            items.add(item);
	
	
		            item.start();
	
	
		          }
	
	
		          try{
	
	
		            Thread.sleep(30);
	
	
		          }catch(InterruptedException e) {
	
	
		          }
	
	
		        }
	
	
		 
	
	
		        over();
	
	
		      }
	
	
		 
	
	
		    }).start();
	
	
		 
	
	
		  }
	
	
		 
	
	
		  privateclassmyPanelextendsJPanel {
	
	
		    /**
	
	
		     *
	
	
		     */
	
	
		    privatestaticfinallongserialVersionUID = 4408440723797225328L;
	
	
		 
	
	
		    @Override
	
	
		    publicvoidpaintComponent(Graphics g) {
	
	
		      super.paintComponent(g);
	
	
		      g.drawImage(backGround.getImage(),0,0,null);
	
	
		      for(intj =0; j < walls.size(); j++) {
	
	
		        walls.get(j).draw(g);
	
	
		      }
	
	
		      for(intj =0; j < irons.size(); j++) {
	
	
		        irons.get(j).draw(g);
	
	
		      }
	
	
		      for(intj =0; j < golds.size(); j++) {
	
	
		        golds.get(j).draw(g);
	
	
		      }
	
	
		      for(intj =0; j < enemyBorns.size(); j++) {
	
	
		        enemyBorns.get(j).draw(g);
	
	
		      }
	
	
		      home.draw(g);
	
	
		      selfBorn.draw(g);
	
	
		 
	
	
		      for(intj =0; j < allTanks.size(); j++) {
	
	
		        allTanks.get(j).drawTank(g);
	
	
		      }
	
	
		      for(intj =0; j < irons.size(); j++) {
	
	
		        irons.get(j).draw(g);
	
	
		      }
	
	
		 
	
	
		      for(inti =0; i < missles.size(); i++) {
	
	
		        missles.get(i).drawMissle(g);
	
	
		        if(!missles.get(i).isLive())
	
	
		          missles.remove(i);
	
	
		      }
	
	
		      for(inti =0; i < booms.size(); i++) {
	
	
		        if(booms.get(i).isLive())
	
	
		          booms.get(i).drawBoom(g);
	
	
		        else
	
	
		          booms.remove(i);
	
	
		      }
	
	
		      for(intj =0; j < items.size(); j++) {
	
	
		        if(!items.get(j).isLive()) {
	
	
		          items.remove(j);
	
	
		          continue;
	
	
		        }
	
	
		        items.get(j).draw(g);
	
	
		      }
	
	
		      if(over)
	
	
		        drawOver(g);
	
	
		      messgePanel.repaint();
	
	
		    }
	
	
		  }
	
	
		 
	
	
		  @Override
	
	
		  publicvoidkeyTyped(KeyEvent e) {
	
	
		    // TODO Auto-generated method stub
	
	
		 
	
	
		  }
	
	
		 
	
	
		  @Override
	
	
		  publicvoidkeyPressed(KeyEvent e) {
	
	
		    if(over) {
	
	
		      if(e.getKeyCode() == KeyEvent.VK_F1) {
	
	
		        over =false;
	
	
		        missles.clear();
	
	
		        allTanks.clear();
	
	
		        booms.clear();
	
	
		        walls.clear();
	
	
		        irons.clear();
	
	
		        golds.clear();
	
	
		        enemyBorns.clear();
	
	
		        try{
	
	
		          init();
	
	
		        }catch(Exception e1) {
	
	
		        }
	
	
		      }else{
	
	
		        f.setVisible(false);
	
	
		        mainF.setSize(800,800);
	
	
		        mainF.setVisible(true);
	
	
		      }
	
	
		    }elseif(e.getKeyCode() == KeyEvent.VK_SPACE) {
	
	
		      myTank.fire();
	
	
		    }else{
	
	
		      myTank.keyPress(e);
	
	
		    }
	
	
		  }
	
	
		 
	
	
		  @Override
	
	
		  publicvoidkeyReleased(KeyEvent e) {
	
	
		 
	
	
		    myTank.keyReleased(e);
	
	
		  }
	
	
		 
	
	
		  publicvoidaI(Tank tank) {
	
	
		    if(TIMEOUT) {
	
	
		      tank.setUp(false);
	
	
		      tank.setLeft(false);
	
	
		      tank.setDown(false);
	
	
		      tank.setRight(false);
	
	
		      return;
	
	
		    }
	
	
		 
	
	
		    if(r.nextInt(40) ==0)
	
	
		      tank.fire();
	
	
		    if(r.nextInt(10) ==0) {
	
	
		      if(tank.getX() >= myTank.getX()
	
	
		          && tank.getX() <= myTank.getX() + Tank.SIZE
	
	
		          && tank.getY() > myTank.getY()) {
	
	
		        tank.setUp(true);
	
	
		        tank.setLeft(false);
	
	
		        tank.setDown(false);
	
	
		        tank.setRight(false);
	
	
		        tank.setDir(Direction.U);
	
	
		        return;
	
	
		      }elseif(tank.getX() >= myTank.getX()
	
	
		          && tank.getX() <= myTank.getX() + Tank.SIZE
	
	
		          && tank.getY() < myTank.getY()) {
	
	
		        tank.setUp(false);
	
	
		        tank.setLeft(false);
	
	
		        tank.setDown(true);
	
	
		        tank.setRight(false);
	
	
		        tank.setDir(Direction.D);
	
	
		        return;
	
	
		      }
	
	
		 
	
	
		      elseif(tank.getX() > myTank.getX()
	
	
		          && tank.getY() >= myTank.getY()
	
	
		          && tank.getY() <= myTank.getY() + Tank.SIZE) {
	
	
		        tank.setUp(false);
	
	
		        tank.setLeft(true);
	
	
		        tank.setDown(false);
	
	
		        tank.setRight(false);
	
	
		        tank.setDir(Direction.L);
	
	
		        return;
	
	
		      }elseif(tank.getX() < myTank.getX()
	
	
		          && tank.getY() >= myTank.getY()
	
	
		          && tank.getY() <= myTank.getY() + Tank.SIZE) {
	
	
		        tank.setUp(false);
	
	
		        tank.setLeft(false);
	
	
		        tank.setDown(false);
	
	
		        tank.setRight(true);
	
	
		        tank.setDir(Direction.R);
	
	
		        return;
	
	
		      }
	
	
		    }
	
	
		    if(tank.getX() <=0) {
	
	
		      tank.setUp(false);
	
	
		      tank.setLeft(false);
	
	
		      tank.setDown(false);
	
	
		      tank.setRight(true);
	
	
		      tank.setDir(Direction.R);
	
	
		    }
	
	
		    if(tank.getY() <=0) {
	
	
		      tank.setUp(false);
	
	
		      tank.setLeft(false);
	
	
		      tank.setDown(true);
	
	
		      tank.setRight(false);
	
	
		      tank.setDir(Direction.D);
	
	
		    }
	
	
		    if(tank.getX() >= AREA_WIDTH - Tank.SIZE) {
	
	
		      tank.setUp(false);
	
	
		      tank.setLeft(true);
	
	
		      tank.setDown(false);
	
	
		      tank.setRight(false);
	
	
		      tank.setDir(Direction.L);
	
	
		    }
	
	
		    if(tank.getY() >= AREA_HEIGHT - Tank.SIZE) {
	
	
		      tank.setUp(true);
	
	
		      tank.setLeft(false);
	
	
		      tank.setDown(false);
	
	
		      tank.setRight(false);
	
	
		      tank.setDir(Direction.U);
	
	
		    }elseif(r.nextInt(300) ==1) {
	
	
		      tank.setUp(true);
	
	
		      tank.setLeft(false);
	
	
		      tank.setDown(false);
	
	
		      tank.setRight(false);
	
	
		      tank.setDir(Direction.U);
	
	
		    }
	
	
		 
	
	
		    elseif(r.nextInt(300) ==2) {
	
	
		      tank.setUp(false);
	
	
		      tank.setLeft(true);
	
	
		      tank.setDown(false);
	
	
		      tank.setRight(false);
	
	
		      tank.setDir(Direction.L);
	
	
		    }elseif(r.nextInt(300) ==3) {
	
	
		      tank.setUp(false);
	
	
		      tank.setLeft(false);
	
	
		      tank.setDown(true);
	
	
		      tank.setRight(false);
	
	
		      tank.setDir(Direction.D);
	
	
		    }elseif(r.nextInt(300) ==4) {
	
	
		      tank.setUp(false);
	
	
		      tank.setLeft(false);
	
	
		      tank.setDown(false);
	
	
		      tank.setRight(true);
	
	
		      tank.setDir(Direction.R);
	
	
		    }
	
	
		  }
	
	
		 
	
	
		  publicvoidinitMap(File file) {
	
	
		    try{
	
	
		      FileInputStream read =newFileInputStream(file);
	
	
		      for(inti =0; i < AREA_HEIGHT /50; i++) {
	
	
		        for(intj =0; j < AREA_WIDTH /50; j++) {
	
	
		          switch(read.read()) {
	
	
		          case1:
	
	
		            walls.add(newWall(j *50, i *50));
	
	
		            break;
	
	
		          case2:
	
	
		            irons.add(newIron(j *50, i *50));
	
	
		            break;
	
	
		          case3:
	
	
		            golds.add(newGold(j *50, i *50));
	
	
		            break;
	
	
		          case4:
	
	
		            selfBorn =newSelfBorn(j *50, i *50);
	
	
		            break;
	
	
		          case5:
	
	
		            enemyBorns.add(newEnemyBorn(j *50, i *50));
	
	
		            break;
	
	
		          case6:
	
	
		            home =newHome(j *50, i *50);
	
	
		            break;
	
	
		          }
	
	
		        }
	
	
		      }
	
	
		      read.close();
	
	
		    }catch(Exception e) {
	
	
		    }
	
	
		    ;
	
	
		  }
	
	
		 
	
	
		  publicvoidaddTank() {
	
	
		    if(tankMax <=0)
	
	
		      return;
	
	
		    for(inti = allTanks.size(); i < enemyBorns.size() +1; i++) {
	
	
		      try{
	
	
		        inttemp = r.nextInt(enemyBorns.size());
	
	
		        enemyTank =newTank(enemyBorns.get(temp).getX(), enemyBorns
	
	
		            .get(temp).getY(),false, allTanks, walls, irons,
	
	
		            golds, missles, home, booms, r.nextInt(3) +1);
	
	
		      }catch(Exception e) {
	
	
		        e.printStackTrace();
	
	
		      }
	
	
		      enemyTank.setDir(Direction.D);
	
	
		      enemyTank.setDown(true);
	
	
		      allTanks.add(enemyTank);
	
	
		      tankMax--;
	
	
		      if(tankMax <=0)
	
	
		        return;
	
	
		    }
	
	
		  }
	
	
		 
	
	
		  publicstaticvoidaddMyTankLives() {
	
	
		    selfMax++;
	
	
		  }
	
	
		 
	
	
		  privatevoidover() {
	
	
		 
	
	
		    for(inti =0; i < AREA_HEIGHT /50; i++) {
	
	
		      for(intj =0; j < AREA_WIDTH /50; j++) {
	
	
		        irons.add(newIron(j *50, i *50));
	
	
		        p.repaint();
	
	
		        try{
	
	
		          Thread.sleep(5);
	
	
		        }catch(InterruptedException e) {
	
	
		        }
	
	
		      }
	
	
		    }
	
	
		    while(true) {
	
	
		      flash = !flash;
	
	
		      p.repaint();
	
	
		      try{
	
	
		        Thread.sleep(1000);
	
	
		      }catch(InterruptedException e) {
	
	
		      }
	
	
		      f.addKeyListener(this);
	
	
		    }
	
	
		  }
	
	
		 
	
	
		  privatevoiddrawOver(Graphics g) {
	
	
		    p.repaint();
	
	
		    g.setColor(Color.red);
	
	
		    g.setFont(newFont("Arial",1,100));
	
	
		    g.drawString("GAME OVER",100,200);
	
	
		    g.setFont(newFont("Arial",2,50));
	
	
		    if(win)
	
	
		      g.drawString("Congratulation! You Win!",100,400);
	
	
		    else
	
	
		      g.drawString("So Sorry, You Lose!",100,400);
	
	
		    if(flash) {
	
	
		      g.setFont(newFont("Arial",2,30));
	
	
		      g.setColor(Color.BLACK);
	
	
		      g.drawString("Press F1 to try again...,",150,500);
	
	
		      g.drawString("Press the other Key to Return the Title...,",150,
	
	
		          600);
	
	
		    }
	
	
		  }
	
	
		}