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