


| 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; |
| 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); |
| } |
| } |
| } |