The game runs as follows:
TankClient
Package tank; import java. awt. *; import java. awt. event. *; import java. util. list; import java. util. arrayList; /*** the role of this class is the main window of the tank game */public class TankClient extends Frame {/*** width of the entire tank game */public static final int GAME_WIDTH = 800; public static final int GAME_HEIGHT = 600; Tank myTank = new Tank (50, 50, true, Tank. direction. STOP, this); Wall w1 = new Wall (100,200, 20,150, this), w2 = new Wall (300,100, 300, 20, this); List <Explode> explodes = new ArrayList <Explode> (); List <Missile> missiles = new ArrayList <Missile> (); list <Tank> tanks = new ArrayList <Tank> (); Image offScreenImage = null; Blood B = new Blood (); public void paint (Graphics g) {/** specify the number of bullet-explosion-Tanks * and the tank life value */g. drawString ("missiles count:" + missiles. size (), 10, 50); g. drawString ("explodes count:" + explodes. size (), 10, 70); g. drawString ("t Anks count: "+ tanks. size (), 10, 90); g. drawString ("tanks life:" + myTank. getLife (), 10,110); if (tanks. size () <= 0) {for (int I = 0; I <5; I ++) {tanks. add (new Tank (50 + 40 * (I + 1), 50, false, Tank. direction. d, this) ;}}for (int I = 0; I <missiles. size (); I ++) {Missile m = missiles. get (I); m. hitTanks (tanks); m. hitTank (myTank); m. hitWall (w1); m. hitWall (w2); m. draw (g); // if (! M. isLive () missiles. remove (m); // else m. draw (g) ;}for (int I = 0; I <explodes. size (); I ++) {Explode e = explodes. get (I); e. draw (g) ;}for (int I = 0; I <tanks. size (); I ++) {Tank t = tanks. get (I); t. collidesWithWall (w1); t. collidesWithWall (w2); t. collidesWithTanks (tanks); t. draw (g);} myTank. draw (g); myTank. eat (B); w1.draw (g); w2.draw (g); B. draw (g);} public void update (Graphics g) {if (offScreenImage = null) {offScreenImage = this. createImage (GAME_WIDTH, GAME_HEIGHT);} Graphics gOffScreen = offScreenImage. getGraphics (); Color c = gOffScreen. getColor (); gOffScreen. setColor (Color. GREEN); gOffScreen. fillRect (0, 0, GAME_WIDTH, GAME_HEIGHT); gOffScreen. setColor (c); paint (gOffScreen); g. drawImage (offScreenImage, 0, 0, null);}/*** this method displays the tank Main Window **/public void lauchFrame () {for (int I = 0; I <10; I ++) {tanks. add (new Tank (50 + 40 * (I + 1), 50, false, Tank. direction. d, this);} // this. setLocation (400,300); this. setSize (GAME_WIDTH, GAME_HEIGHT); this. setTitle ("TankWar"); this. addWindowListener (new WindowAdapter () {public void windowClosing (invalid wevent e) {System. exit (0) ;}}); this. setResizable (false); this. setBackground (Color. GREEN); this. addKeyListener (new KeyMonitor (); setVisible (true); new Thread (new PaintThread ()). start ();} public static void main (String [] args) {TankClient tc = new TankClient (); tc. lauchFrame ();} private class PaintThread implements Runnable {public void run () {while (true) {repaint (); try {Thread. sleep (50);} catch (InterruptedException e) {e. printStackTrace () ;}}} private class KeyMonitor extends KeyAdapter {public void keyReleased (KeyEvent e) {myTank. keyReleased (e);} public void keyPressed (KeyEvent e) {myTank. keyPressed (e );}}}
Tank
Package tank; import java. awt. *; import java. awt. event. *; import java. util. *; public class Tank {public static final int XSPEED = 5; public static final int YSPEED = 5; public static final int WIDTH = 30; public static final int HEIGHT = 30; private boolean live = true; private BloodBar bb = new BloodBar (); private int life = 100; TankClient tc; private boolean good; private int x, y; private int oldX, oldY; priv Ate static Random r = new Random (); private boolean bL = false, bU = false, bR = false, bD = false; enum Direction {L, LU, U, RU, r, RD, D, LD, STOP}; private Direction dir = Direction. STOP; private Direction ptDir = Direction. d; private int step = r. nextInt (12) + 3; public Tank (int x, int y, boolean good) {this. x = x; this. y = y; this. oldX = x; this. oldY = y; this. good = good;} public Tank (int x, int y, boolean g Ood, Direction dir, TankClient tc) {this (x, y, good); this. dir = dir; this. tc = tc;} public void draw (Graphics g) {if (! Live) {if (! Good) {tc. tanks. remove (this) ;}return;} Color c = g. getColor (); if (good) g. setColor (Color. RED); else g. setColor (Color. BLUE); g. fillOval (x, y, WIDTH, HEIGHT); g. setColor (c); if (good) bb. draw (g); switch (ptDir) {case L: g. drawLine (x + Tank. WIDTH/2, y + Tank. HEIGHT/2, x, y + Tank. HEIGHT/2); break; case LU: g. drawLine (x + Tank. WIDTH/2, y + Tank. HEIGHT/2, x, y); break; case U: g. drawLine (x + Tank. WIDTH/2, y + Tank. HEIG HT/2, x + Tank. WIDTH/2, y); break; case RU: g. drawLine (x + Tank. WIDTH/2, y + Tank. HEIGHT/2, x + Tank. WIDTH, y); break; case R: g. drawLine (x + Tank. WIDTH/2, y + Tank. HEIGHT/2, x + Tank. WIDTH, y + Tank. HEIGHT/2); break; case RD: g. drawLine (x + Tank. WIDTH/2, y + Tank. HEIGHT/2, x + Tank. WIDTH, y + Tank. HEIGHT); break; case D: g. drawLine (x + Tank. WIDTH/2, y + Tank. HEIGHT/2, x + Tank. WIDTH/2, y + Tank. HEIGHT); break; Case LD: g. drawLine (x + Tank. WIDTH/2, y + Tank. HEIGHT/2, x, y + Tank. HEIGHT); break;} move ();} void move () {this. oldX = x; this. oldY = y; switch (dir) {case L: x-= XSPEED; break; case LU: x-= XSPEED; y-= YSPEED; break; case U: y-= YSPEED; break; case RU: x + = XSPEED; y-= YSPEED; break; case R: x + = XSPEED; break; case RD: x + = XSPEED; y + = YSPEED; break; case D: y + = YSPEED; break; case LD: x-= XSPEED; y + = YSPEED; break; ca Se STOP: break;} if (this. dir! = Direction. STOP) {this. ptDir = this. dir;} if (x <0) x = 0; if (y <30) y = 30; if (x + Tank. WIDTH> TankClient. GAME_WIDTH) x = TankClient. GAME_WIDTH-Tank. WIDTH; if (y + Tank. HEIGHT> TankClient. GAME_HEIGHT) y = TankClient. GAME_HEIGHT-Tank. HEIGHT; if (! Good) {Direction [] dirs = Direction. values (); if (step = 0) {step = r. nextInt (12) + 3; int rn = r. nextInt (dirs. length); dir = dirs [rn];} step --; if (r. nextInt (40)> 38) this. fire () ;}} private void stay () {x = oldX; y = oldY;} public void keyPressed (KeyEvent e) {int key = e. getKeyCode (); switch (key) {case KeyEvent. VK_F2: if (! This. live) {this. live = true; this. life = 100;} break; case KeyEvent. VK_LEFT: bL = true; break; case KeyEvent. VK_UP: bU = true; break; case KeyEvent. VK_RIGHT: bR = true; break; case KeyEvent. VK_DOWN: bD = true; break;} locateDirection ();} void locateDirection () {if (bL &&! BU &&! BR &&! BD) dir = Direction. L; else if (bL & bU &&! BR &&! BD) dir = Direction. LU; else if (! BL & bU &&! BR &&! BD) dir = Direction. U; else if (! BL & bU & bR &&! BD) dir = Direction. RU; else if (! BL &&! BU & bR &&! BD) dir = Direction. R; else if (! BL &&! BU & bR & bD) dir = Direction. RD; else if (! BL &&! BU &&! BR & bD) dir = Direction. D; else if (bL &&! BU &&! BR & bD) dir = Direction. LD; else if (! BL &&! BU &&! BR &&! BD) dir = Direction. STOP;} public void keyReleased (KeyEvent e) {int key = e. getKeyCode (); switch (key) {case KeyEvent. VK_CONTROL: fire (); break; case KeyEvent. VK_LEFT: bL = false; break; case KeyEvent. VK_UP: bU = false; break; case KeyEvent. VK_RIGHT: bR = false; break; case KeyEvent. VK_DOWN: bD = false; break; case KeyEvent. VK_A: superFire (); break;} locateDirection ();} public Missile fire () {if (! Live) return null; int x = this. x + Tank. WIDTH/2-Missile. WIDTH/2; int y = this. y + Tank. HEIGHT/2-Missile. HEIGHT/2; Missile m = new Missile (x, y, good, ptDir, this. tc); tc. missiles. add (m); return m;} public Missile fire (Direction dir) {if (! Live) return null; int x = this. x + Tank. WIDTH/2-Missile. WIDTH/2; int y = this. y + Tank. HEIGHT/2-Missile. HEIGHT/2; Missile m = new Missile (x, y, good, dir, this. tc); tc. missiles. add (m); return m;} public Rectangle getRect () {return new Rectangle (x, y, WIDTH, HEIGHT);} public boolean isLive () {return live ;} public void setLive (boolean live) {this. live = live;} public boolean isGood () {return good ;}/*** Hit the Wall * @ param w hit the Wall * @ return hit return true, otherwise false */public boolean collidesWithWall (Wall w) {if (this. live & this. getRect (). intersects (w. getRect () {this. stay (); return true;} return false;} public boolean collidesWithTanks (java. util. list <Tank> tanks) {for (int I = 0; I <tanks. size (); I ++) {Tank t = tanks. get (I); if (this! = T) {if (this. live & t. isLive () & this. getRect (). intersects (t. getRect () {this. stay (); t. stay (); return true ;}}return false;} private void superFire () {Direction [] dirs = Direction. values (); for (int I = 0; I <8; I ++) {fire (dirs [I]) ;}} public int getLife () {return life ;} public void setLife (int life) {this. life = life;} private class BloodBar {public void draw (Graphics g) {Color c = g. getColor (); g. setColor (Color. RED); g. drawRect (x, y-10, WIDTH, 10); int w = WIDTH * life/100; g. fillRect (x, y-10, w, 10); g. setColor (c) ;}} public boolean eat (Blood B) {if (this. live & B. isLive () & this. getRect (). intersects (B. getRect () {this. life = 100; B. setLive (false); return true;} return false ;}}
Wall
package tank;import java.awt.*;public class Wall {int x, y, w, h;TankClient tc ;public Wall(int x, int y, int w, int h, TankClient tc) {this.x = x;this.y = y;this.w = w;this.h = h;this.tc = tc;}public void draw(Graphics g) {g.fillRect(x, y, w, h);}public Rectangle getRect() {return new Rectangle(x, y, w, h);}}
Explode
package tank;import java.awt.*;public class Explode {int x, y;private boolean live = true;private TankClient tc ;int[] diameter = {4, 7, 12, 18, 26, 32, 49, 30, 14, 6};int step = 0;public Explode(int x, int y, TankClient tc) {this.x = x;this.y = y;this.tc = tc;}public void draw(Graphics g) {if(!live) {tc.explodes.remove(this);return;}if(step == diameter.length) {live = false;step = 0;return;}Color c = g.getColor();g.setColor(Color.ORANGE);g.fillOval(x, y, diameter[step], diameter[step]);g.setColor(c);step ++;}}
Bloode
Package tank; import java. awt. *; public class Blood {int x, y, w, h; TankClient tc; int step = 0; private boolean live = true; // specifies the trajectory of the block motion, the private int [] [] pos = {350,300}, {360,300}, {375,275}, {400,200}, {360,270}, {365,290 }, {340,280 }}; public Blood () {x = pos [0] [0]; y = pos [0] [1]; w = h = 15 ;} public void draw (Graphics g) {if (! Live) return; Color c = g. getColor (); g. setColor (Color. MAGENTA); g. fillRect (x, y, w, h); g. setColor (c); move ();} private void move () {step ++; if (step = pos. length) {step = 0;} x = pos [step] [0]; y = pos [step] [1];} public Rectangle getRect () {return new Rectangle (x, y, w, h);} public boolean isLive () {return live;} public void setLive (boolean live) {this. live = live ;}}
Missile
package tank;import java.awt.*;import java.util.List;public class Missile {public static final int XSPEED = 10;public static final int YSPEED = 10;public static final int WIDTH = 10;public static final int HEIGHT = 10;int x, y;Tank.Direction dir;private boolean good;private boolean live = true;private TankClient tc;public Missile(int x, int y, Tank.Direction dir) {this.x = x;this.y = y;this.dir = dir;}public Missile(int x, int y, boolean good, Tank.Direction dir, TankClient tc) {this(x, y, dir);this.good = good;this.tc = tc;}public void draw(Graphics g) {if(!live) {tc.missiles.remove(this);return;}Color c = g.getColor();g.setColor(Color.BLACK);g.fillOval(x, y, WIDTH, HEIGHT);g.setColor(c);move();}private void move() {switch(dir) {case L:x -= XSPEED;break;case LU:x -= XSPEED;y -= YSPEED;break;case U:y -= YSPEED;break;case RU:x += XSPEED;y -= YSPEED;break;case R:x += XSPEED;break;case RD:x += XSPEED;y += YSPEED;break;case D:y += YSPEED;break;case LD:x -= XSPEED;y += YSPEED;break;case STOP:break;}if(x < 0 || y < 0 || x > TankClient.GAME_WIDTH || y > TankClient.GAME_HEIGHT) {live = false;}}public boolean isLive() {return live;}public Rectangle getRect() {return new Rectangle(x, y, WIDTH, HEIGHT);}public boolean hitTank(Tank t) {if(this.live && this.getRect().intersects(t.getRect()) && t.isLive() && this.good != t.isGood()) {if(t.isGood()) {t.setLife(t.getLife()-20);if(t.getLife() <= 0) t.setLive(false);} else {t.setLive(false);}this.live = false;Explode e = new Explode(x, y, tc);tc.explodes.add(e);return true;}return false;}public boolean hitTanks(List<Tank> tanks) {for(int i=0; i<tanks.size(); i++) {if(hitTank(tanks.get(i))) {return true;}}return false;}public boolean hitWall(Wall w) {if(this.live && this.getRect().intersects(w.getRect())) {this.live = false;return true;}return false;}}