Por favor, consulte as notas para obter detalhes. Não vou entrar em muitas bobagens aqui, apenas realizarei um clássico da infância.
Sangue.java
package com.hkm.TankWar;import java.awt.*;/** * Classe de coágulo sanguíneo, nosso tanque pode recuperar sangue comendo-o; h; //A posição, largura e altura do coágulo sanguíneo; private TankWarClient tc; private int step=0;//Registra o número de passos que o coágulo sanguíneo se move; live; } public void setLive(boolean live) { this.live = live } /** * Registra a localização do coágulo sanguíneo */ private int[][] pos={{400.300},{400.320},{420.320},{440.300},{440.330},{480.400},{520.400},{540.400}} public Blood() { x=pos[0][0] ; y=pos[0][1]; } public void draw(Gráficos g) { if(!live) return; (c); move(); } /** * Move o coágulo de sangue*/ public void move() { step++; ]; y=pos[etapa][1]; } public Rectangle getRect() { return new Rectangle(x,y,w,h);
Explodir.java
package com.hkm.TankWar;import java.awt.*;/** * Explode class* @author Hekangmin * */public class Explode { private int x,y;//O local onde ocorreu a explosão private boolean Live=true ; int dia[]={4,8,12,16,32,40,20,14,4} // Use simulação de círculo para representar o diâmetro do círculo int; step=0;//A diferença é movida para o diâmetro private TankWarClient tc;//Mantendo a referência public Explode(int x,int y,TankWarClient tc) { this.x=x; =tc; } public void draw(Gráficos g) { if(!Live) { tc.explodes.remove(this }); if(step==dia.length)//Se atingir o último diâmetro, ele explodirá e morrerá; { Live=false; .AMARELO); g .fillOval(x, y, dia[etapa], dia[etapa]);
Míssil.java
pacote com.hkm.TankWar;importar java.awt.*;importar java.awt.Event.*;importar java.awt.event.KeyEvent;importar java.util.List;/** * Bullet class* @author Hekangmin * */ public class Missile { private int x,y;//A posição da bala private Tank.Direction dir;//A direção do tanque private static final int XSPEED=10;//A velocidade de movimento do tanque na direção x, private static final int YSPEED=10;//A velocidade de movimento do tanque na direção y, public static final int WIDTH=10; HEIGHT=10; private boolean Live= true; // Determina se a bala está viva private boolean good; // Distinguir entre balas inimigas e nossas próprias balas private TankWarClient tc; dir) { this.x = x; this.y = y; this.dir = dir } public Missile(int x,int y,boolean good,Tank.Direction dir,TankWarClient tc) { this(x,y,dir ); this.good=good;//Define os atributos bons e ruins do tanque e o atributo de retorno de dano da bala para o mesmo; g é o pincel*/ public void draw(Gráficos g) { if(!Live) { tc.missiles.remove(this } Color c=g.getColor(); Cor .AZUL); } else g.setColor(Color.ORANGE); g.fillOval(x, y, WIDTH, HEIGHT); } /** * Mova a bala de acordo com a direção do tanque */ private void move() { switch(dir) { case L: x-=XSPEED; ; quebra; caso U: y-=YSPEED; caso RU: x+=XSPEED; y+=YSPEED; caso D: y+=YSPEED; caso LD: x-=XSPEED;|y intervalo; >TankWarClient.GAME_HEIGHT)//Se a bala cruzar o limite, deixe-a morrer { Live=false } } public boolean isLive() { return; Live; } public Rectangle getRect()//Obtém a área retangular do marcador; { return new Rectangle(this.x, this.y, this.WIDTH, this.HEIGHT } /** * Determine se o bala colide com o tanque; * @param t é o tanque* @return retorna true para indicar uma colisão, caso contrário não há colisão */ 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()-10); if(t.getLife()<=0) t.setLive(false }else{ t.setLive(false }); this.Live=false;///Define a bala para a morte; Explode e=new Explode(x,y,tc);//Ocorre uma explosão; } /** * Determine se a bala colidiu com o tanque inimigo * @param tanks tanque inimigo* @returntrue significa colisão, false não colide */ public boolean hitTanks(List<Tank> tanks) { for(int i=0;i<tanks.size();i++) { if(hitTank(tc.tanks.get(i))) { return true } } return false } /** * Determine se o marcador; atinge a parede * @param w wall* @returntrue, hit, false, not hit */ public boolean hitsWall(Wall w) { if(this.Live&&this.getRect().intersects(w.getRect())) { Live=false;
Tanque.java
pacote com.hkm.TankWar;importar java.awt.*;importar java.awt.event.KeyEvent;importar java.util.*;/** * Tank class* @author Hekangmin * */public class Tank { public static final int XSPEED=5;//velocidade na direção x do tanque public static final int YSPEED=5; BloodBar bb=new BloodBar();//barra de sangue private int life=100; public int getLife() { return life } public void setLife(int life) { this.life = life } private static Random r=new Random; (); private static int step=r.nextInt(12)+3;//Define um número para representar o número de passos que o tanque inimigo dá para se mover aleatoriamente private boolean; bL=false,bU=false,bR=false,bD=false; enum Direction{L,LU,U,RU,R,RD,D,LD,STOP};//Use o tipo de enumeração para definir a direção do tanque private; int x,y; private int oldX,oldY;//grava a posição do tanque na etapa anterior; private boolean live=true;//determina se ele está ativo public boolean isLive() { return live } public void setLive; (booleano live) { this.live = live } private boolean good;//O tanque é bom ou ruim? public boolean isGood() { return good; TankWarClient tc ;//Para manter a referência da outra parte para facilitar o acesso às suas variáveis de membro Direction dir=Direction.STOP;//Define a direção do tanque para parar no início public Tank(int x, int y, booleano bom, Direção dir,TankWarClient tc) { isto.x=x; isto.tc=tc;// Segure a referência da outra parte; } public void draw(Graphics g) { if(!live)//Se morrer, não empatará mais { if(!good) { tc.tanks.remove(this); if(tc.tanks.size()<5)//Adicionar tanques quando houver menos de 5 tanques { for(int i=0;i<10;i++) { int posX=r.nextInt(800); posY =r.nextInt(600); tc.tanks.add(new Tank(posX,posY,false,Direction.D,tc));//Faz com que a localização do tanque pareça aleatória} } } return; } Cor c=g.getColor(); if(good) { g.setColor(Color.RED); x, y, WIDTH, HEIGHT); g.setColor(c); switch(ptDir)//Desenhe a direção do barril { case L: g.drawLine(x+Tank.WIDTH/2, y+Tank.HEIGHT/2, x-10, y+Tank.HEIGHT/2);//Desenhe o cano da arma e desenhe uma linha reta case LU break; : g.drawLine(x+Tank.WIDTH/2, y+Tank.HEIGHT/2, x-7, y-7); g.drawLine(x+Tank.WIDTH/2, y+Tank.HEIGHT/2, x+Tank.WIDTH/2, y-10); y+Tanque.ALTURA/2, x+Tanque.WIDTH+7, y-7); g.drawLine(x+Tank.WIDTH/2, y+Tank.HEIGHT/2, x+Tank.WIDTH+10, y+Tank.HEIGHT/2); WIDTH/2, y+Tank.HEIGHT/2, x+Tank.WIDTH+7, y+Tank.HEIGHT+7); g.drawLine(x+Tank.WIDTH/2, y+Tank.HEIGHT/2, x+Tank.WIDTH/2, y+Tank.HEIGHT+10); WIDTH/2, y+Tank.HEIGHT/2, x-7, y+HEIGHT+7); oldX=x;//Registra a posição anterior do tanque oldY=y; switch(dir) { case L: x-=XSPEED; case LU: x-=XSPEED; y -=YSPEED; caso RU: x+=XSPEED; y-=YSPEED; caso R: x+=XSPEED; y+=YSPEED; caso D: y+=YSPEED; caso LD: x-=XSPEED; y+=YSPEED; this.dir; /** * Impedir que os tanques cruzem a fronteira */ if(x<0) x=0 if(y<25) y=25; if(x+Tank.WIDTH>TankWarClient.GAME_WIDTH) x=TankWarClient.GAME_WIDTH-30; if(y+Tank.HEIGHT>TankWarClient.GAME_HEIGHT) y=TankWarClient.GAME_HEIGHT-30; =Direction.values();//Converte o tipo de enumeração em um array; if(step==0) { step=r.nextInt(12)+3; int rn=r.nextInt(dirs.length);//Gera um número inteiro aleatório dentro do comprimento; -; if(r.nextInt(40)>20) this.fire(); // Faça o tanque inimigo disparar balas */ public void KeyPressed(KeyEvent e) { int key=e.getKeyCode(); switch(key) { case KeyEvent.VK_LEFT: bL=true; =verdadeiro;caso KeyEvent.VK_DOWN: bD=verdadeiro; keyReleased(KeyEvent e) { int key=e.getKeyCode(); switch(key) { case KeyEvent.VK_RIGHT: bR=false; ; quebra; caso KeyEvent.VK_UP: bU = falso; bD=false; case KeyEvent.VK_A: superFire(); case KeyEvent.VK_F2: reBorn(); public Disparo de míssil() { if(!live) return null; mx=this.x+Tank.WIDTH/2-Missile.WIDTH/2;//Calcular a posição do lançamento da bala int my=this.y+Tank.HEIGHT/2-Missile.HEIGHT/2; new Missile (mx,my,good,ptDir,this.tc);////Lança balas de acordo com a direção do cano tc.missiles.add(m); return m; { if(!live) return null; int mx=this.x+Tank.WIDTH/2-Missile.WIDTH/2; new Missile(mx,my,good,dir,this.tc);//Lança balas de acordo com a direção do tanque; tc.missiles.add(m); Direção[] dirs=Direção.values(); for(int i=0;i<8;i++) { fire(dirs[i] } public void locationDir() { if(bL&&!bU&&!bR&&!bD ) dir=Direção.L; senão if(bL&&bU&&!bR&&!bD) dir=Direção.LU; if(!bL&&bU&&!bR&&!bD) dir=Direção.U; else if(!bL&&bU&&bR&&!bD) dir=Direção.RU; !bU&&bR&&bD) dir=Direção.RD; if(!bL&&!bU&&!bR&&bD) dir=Direção.D; else if(bL&&!bU&&!bR&&bD) dir=Direção.LD; else if(!bL&&!bU&&!bR&&!bD) dir=Direção.STOP } public Rectangle getRect()//Obtém a área retangular do tanque{ return new Rectangle(this.x,this.y,this.WIDTH,this.HEIGHT } /** * O tanque atingiu a parede* @param w wall* @returntrue hit, false não atingiu */ public boolean colliesWithWall(; Parede w) { if(this.live&&this.getRect().intersects(w.getRect())) { this.stay(); /** * Lidar com colisões tanque-tanque para evitar que eles se cruzem; * @param tanques tanques inimigos; Tanque> tanques) { for(int i=0;i<tanks.size();i++) { Tanque t=tanks.get(i); if(this.live&&this.isLive()&&this.getRect().intersects(t.getRect())) { this.stay();//Retorna à posição do passo anterior t.stay();// //Retornar A posição da etapa anterior return true } } } return false } private void stay() { x=oldX; É a classe interna do Tank; a barra de sangue é exibida no topo da cabeça do nosso tanque; .setColor( Color.RED); g.drawRect(x,y-10,WIDTH,10); g.fillRect(x,y-10,w,10); (Sangue b) { if(this.live&&b.isLive()&&this.getRect().intersects(b.getRect())) { this.life=100; b.setLive(false); return true } return false } /** * Nosso tanque será ressuscitado */ public void reBorn() { if(this.isGood()&&!this.isLive()) { this.setLive(true); this.setLife(100);
TankWarClient.java
package com.hkm.TankWar;import java.awt.*;import java.awt.event.*;import java.util.List;import java.util.ArrayList /** * Esta é a janela de execução do jogo; * @ autor Hekangmin * */public class TankWarClient extends Frame{/** * Largura da janela do jogo */ public static final int GAME_WIDTH=800; A altura da janela do jogo; */ public static final int GAME_HEIGHT=600; Tank MyTank=new Tank(700,400,true,Tank.Direction.STOP,this); List<Explodir> explode=new ArrayList<Explodir>(); List<Míssil> mísseis=new ArrayList<Míssil>(); Wall(300,200,20,200,this); Wall w2=new Wall(600,300,30,150,this); Blood b=new Blood(); nome)//Definir texto { super(nome } /** * Executar janela */ public void launchFrame() { for(int); i=0;i<10;i++)//Adicionar dez tanques inimigos { tanks.add(new Tank(50+40*(i+1),50,false,Tank.Direction.D,this } this)); .setBounds(200.100,GAME_WIDTH,GAME_HEIGHT); this.setBackground(Color.GREEN); WindowAdapter()//Classe anônima { public void windowClosing(WindowEvent e) { System.exit(0); //O tamanho da janela não pode ser alterado; this.setVisible(true); new Thread(new PaintThread()).start();//Cria um novo thread } public void; paint(Gráficos g) { g.drawString("Contagem de mísseis: "+missiles.size(), 10, 50);//Display string; g.drawString("Contagem de explosões: "+explodes.size(),10 , 70); g.drawString("contagem de tanques: "+tanks.size(),10,90); "+MyTank.getLife(),10,110); /** * Desenhe a parede; */ w1.draw(g); w2.draw(g); /** * Detecte balas e vários eventos; */ for (int i=0;i<missiles.size();i++) { Míssil m=missiles.get(i); m.hitsWall(w1); m.hitTanks(tanques); m.hitTank(MyTank); m.draw(g); //if(!m.isLive()) //missiles.remove(m); ; } /** * Desenhar explosões */ for(int i=0;i<explodes.size();i++) { Explode e=explodes.get(i); for(int i=0;i<tanks.size();i++) { Tanque t=tanks.get(i); t.colliedsWithWall(w1); .draw(g); } b.draw(g); * Use tecnologia de buffer duplo para eliminar o fenômeno de oscilação do tanque */ public void update(Graphics g) //g é o pincel desenhado na tela; ); gOffScreen=OffScreenImage.getGraphics();//gOffScreen é o pincel de OffScreenImage; gOffScreen.setColor(c); paint(gOffScreen);//Desenhe na imagem virtual; g.drawImage(OffScreenImage,0,0,null);//Use o pincel g para desenhar coisas na imagem virtual na tela} classe privada PaintThread implements Runnable{ public void run() { while(true) { repaint();//O método repaint aqui é o try{ da classe Frame Thread.sleep(100); }catch(InterruptedException e){ e.printStackTrace(); } } } } classe privada KeyMonitor estende KeyAdapter { public void keyReleased(KeyEvent e) { MyTank.keyReleased(e } public void keyPressed(e); KeyEvent e) { MyTank.KeyPressed(e } } public static void); main(String[] args) { new TankWarClient("Meu Mundo Tank").launchFrame();
Parede.java
package com.hkm.TankWar;import java.awt.*;/** * Gere a classe da parede de obstáculo; * @author Hekangmin * */ public class Wall { /** * x, y é a posição da parede, w , h é a largura e a altura */ int x,y,w,h; /** * contém a referência*/ TankWarClient tc; tc) { this.x = x; this.y = y; this.w = w; this.h = h; this.tc = tc } public void draw(Gráficos g) { Cor c=g.getColor() ; g.setColor(Color.GRAY); g.fillRect(x,y,w,h); g.setColor(c); público Retângulo getRect() { return new Rectangle(x,y,w,h } }
O texto acima é todo o conteúdo deste artigo, espero que todos gostem.