Weitere Informationen finden Sie in den Anmerkungen. Ich werde hier nicht zu viel Unsinn erzählen, sondern nur einen Klassiker aus meiner Kindheit realisieren.
Blood.java
package com.hkm.TankWar;import java.awt.*;/** * Blutgerinnselklasse, unser Tank kann Blut durch Essen zurückgewinnen * @author Hekangmin * */public class Blood { private int x,y,w, h; //Die Position, Breite und Höhe des Blutgerinnsels; private int step=0;//Zeichne die Anzahl der Schritte auf, die das Blutgerinnsel zurücklegt live; } public void setLive(boolean live) { this.live = live } /** * Notieren Sie den Ort des Blutgerinnsels */ 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]; w=h=18; } public void draw(Graphics g) { if(!live) return; Color c=g.getColor(); g.fillOval(x, y, w, h); (c); move(); } /** * Verschiebe das Blutgerinnsel*/ public void move() { if(step>=pos.length) step=0; ]; y=pos[step][1]; } } public Rechteck getRect() { return new Rechteck(x,y,w,h);
Explode.java
package com.hkm.TankWar;import java.awt.*;/** * Explode class* @author Hekangmin * */public class Explode { private int x,y;//Der Ort, an dem die Explosion aufgetreten ist private boolean Live=true ; int dia[]={4,8,12,16,32,40,20,14,4}; // Kreissimulation verwenden, um den Durchmesser des Kreises darzustellen; step=0;//Die Differenz wird auf den Durchmesser verschoben private TankWarClient tc;//Halten der Referenz public Explode(int x,int y,TankWarClient tc) { this.x=x; this.y=y; =tc; } public void draw(Graphics g) { if(!Live) { tc.explodes.remove(this); if(step==dia.length)//Wenn es den letzten Durchmesser erreicht, wird es explodieren und sterben .YELLOW); g .fillOval(x, y, dia[step], dia[step]);
Missile.java
package com.hkm.TankWar;import java.awt.*;import java.awt.Event.*;import java.awt.event.KeyEvent;import java.util.List;/** * Bullet-Klasse* @author Hekangmin * */ public class Missile { private int x,y;//Die Position des Geschosses private Tank.Direction dir;//Die Richtung des Panzers private static final int XSPEED=10;//Die Bewegungsgeschwindigkeit des Panzers in x-Richtung, private static final int YSPEED=10;//Die Bewegungsgeschwindigkeit des Panzers in y-Richtung, public static final int WIDTH=10; HEIGHT=10; private boolean Live= true; // Bestimmen Sie, ob die Kugel lebendig ist. private boolean good; dir) { this.x = x; this.y = y; this.dir = dir } public Missile(int x,int y,boolean good,TankWarClient tc) { this(x,y,dir ); this.good=good;//Setze die guten und schlechten Attribute des Panzers und das Schadensrückgabeattribut des Geschosses auf dasselbe; g ist der Pinsel*/ public void draw(Graphics g) { if(!Live) { tc.missiles.remove(this); color c=g.getColor(); Color .BLUE); } else g.setColor(Color.ORANGE); g.fillOval(x, y, WIDTH, HEIGHT); } /** * Bewege die Kugel entsprechend der Richtung des Panzers */ private void move() { switch(dir) { case L: x-=XSPEED; break; ; Pause; Fall U: y-=YSPEED; Fall RU: x+=XSPEED; y+=YSPEED; break; case LD: x-=XSPEED; if(x<0||y<0||x>TankWarClient.GAME_WIDTH; >TankWarClient.GAME_HEIGHT)//Wenn die Kugel die Grenze überschreitet, lass sie sterben { Live=false} } public boolean isLive() { return Live; } public Rechteck getRect()//Holen Sie sich den rechteckigen Bereich des Aufzählungszeichens; { return new Rectangle(this.x, this.y, this.WIDTH, this.HEIGHT); Bullet kollidiert mit dem Tank; * @param t ist der Tank* @return gibt true zurück, um eine Kollision anzuzeigen, andernfalls gibt es keine Kollision */ 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); this.Live=false;///Setze die Kugel zum Tode; Explode(x,y,tc);//Eine Explosion tritt auf; tc.explodes.add(e); return true; } /** * Bestimmen Sie, ob die Kugel mit dem feindlichen Panzer kollidiert; * @param tanks feindlicher Panzer* @returntrue bedeutet Kollision, false kollidiert nicht */ public boolean hitTanks(List<Tank> tanks) { for(int i=0;i<tanks.size();i++) { if(hitTank(tc.tanks.get(i))) { return true; } } return false } /** * Bestimmen Sie, ob die Kugel trifft die Wand * @param w wall* @returntrue, hit, false, not hit */ public boolean hitsWall(Wall w) { if(this.Live&&this.getRect().intersects(w.getRect())) { Live=false } return true;
Tank.java
package com.hkm.TankWar;import java.awt.*;import java.awt.event.KeyEvent;import java.util.*;/** * Tank class* @author Hekangmin * */public class Tank { public static final int XSPEED=5;//tank x-direction speed public static final int YSPEED=5; public static final int WIDTH=30; BloodBar bb=new BloodBar();//blood bar private int life() { return life; } public void setLife(int life) { this.life = life; private static Random r=new Random (); private static int step=r.nextInt(12)+3;//Definieren Sie eine Zahl, die die Anzahl der Schritte darstellt, die der feindliche Panzer benötigt, um sich zufällig zu bewegen bL=false,bU=false,bR=false,bD=false; enum Direction{L,LU,U,RU,R,RD,D,LD,STOP};//Aufzählungstyp verwenden, um die Tankrichtung privat zu definieren; int x,y; private int oldX,oldY;//zeichnen Sie die Position des Tanks im vorherigen Schritt auf; private boolean live=true;//bestimmen Sie, ob er aktiv ist public boolean isLive() { return live } public void setLive (boolean live) { this.live = live; } private boolean good;//Ist der Tank gut oder schlecht? public boolean isGood() { return good } private Direction ptDir=Direction.D;//Füge die Richtung des Fasses hinzu; TankWarClient tc ;//Um die Referenz der anderen Partei zu halten, um den Zugriff auf ihre Mitgliedsvariablen zu erleichtern; Richtung dir=Direction.STOP;//Stellen Sie die Richtung des Panzers so ein, dass er am Anfang stoppt public Tank(int x, int y, boolescher Wert, Richtung dir,TankWarClient tc) { this.y=y; this.oldY=y; this.tc=tc; Halten Sie die Referenz der anderen Partei; } public void draw(Graphics g) { if(!live)//Wenn es stirbt, wird es nicht mehr zeichnen { if(!good) { tc.tanks.remove(this); if(tc.tanks.size()<5)//Tanks hinzufügen, wenn weniger als 5 Tanks vorhanden sind { 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));//Lass den Standort des Tanks zufällig erscheinen} } } return; } Color c=g.getColor(); if(good) { bb.draw(g } else g.fillOval( x, y, WIDTH, HEIGHT); g.setColor(c); switch(ptDir)//Zeichne die Richtung des Fasses { case L: g.drawLine(x+Tank.WIDTH/2, y+Tank.HEIGHT/2, x-10, y+Tank.HEIGHT/2);//Zeichne den Waffenlauf und zeichne stattdessen eine gerade Linie; : 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); break case RU: g.drawLine(x+Tank.WIDTH/2, y+Tank.HEIGHT/2, x+Tank.WIDTH+7, y-7); g.drawLine(x+Tank.WIDTH/2, y+Tank.HEIGHT/2, x+Tank.WIDTH+10, y+Tank.HEIGHT/2); break; case RD: g.drawLine(x+Tank. 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); break; case LD: g.drawLine(x+Tank. WIDTH/2, y+Tank.HEIGHT/2, x-7, y+HEIGHT+7); oldX=x;//Zeichne die vorherige Position des Tanks auf oldY=y; switch(dir) { case L: x-=XSPEED; break; y -=YSPEED; Fall RU: x+=XSPEED; y-=YSPEED Fall RD: x+=XSPEED; y+=YSPEED; break; case LD: x-=XSPEED; break } if(this.dir!=Direction.STOP) this.dir; /** * Verhindern Sie, dass Panzer die Grenze überschreiten; if(x+Tank.WIDTH>TankWarClient.GAME_WIDTH) x=TankWarClient.GAME_WIDTH-30; if(y+Tank.HEIGHT>TankWarClient.GAME_HEIGHT) y=TankWarClient.GAME_HEIGHT-30; if(!good) { Direction[] dirs =Direction.values();//Konvertieren Sie den Aufzählungstyp in ein Array; if(step==0) { step=r.nextInt(12)+3; int rn=r.nextInt(dirs.length);//Generiere eine zufällige Ganzzahl innerhalb der Länge; -; if(r.nextInt(40)>20) this.fire(); // Den gegnerischen Panzer dazu bringen, Kugeln abzufeuern; } } /** * Tastendrücke verarbeiten* @param e Keyboard Event; public void KeyPressed(KeyEvent e) { int key=e.getKeyCode(); switch(key) { case KeyEvent.VK_LEFT: bL=true; break; case KeyEvent.VK_UP: bU =true; break; case KeyEvent.VK_DOWN: bD=true; public void; keyReleased(KeyEvent e) { int key=e.getKeyCode(); switch(key) { case KeyEvent.VK_CONTROL: fire(); break; case KeyEvent.VK_RIGHT: bR=false ; break; case KeyEvent.VK_UP: bU=false; break; bD=false; case KeyEvent.VK_A: superFire(); public Missile fire() { if(!live) return null; mx=this.x+Tank.WIDTH/2-Missile.WIDTH/2;//Berechnen Sie die Position des Geschossabschusses int my=this.y+Tank.HEIGHT/2-Missile.HEIGHT/2; new Missile (mx,my,good,ptDir,this.tc);////Kugeln entsprechend der Laufrichtung abfeuern tc.missiles.add(m); return m } public Missile fire(Direction dir) { if(!live) return null; int mx=this.x+Tank.WIDTH/2; int my=this.y+Tank.HEIGHT/2-Missile m= new Missile(mx,my,good,dir,this.tc);//Raketen entsprechend der Richtung des Panzers abfeuern; tc.missiles.add(m); return m; Direction[] dirs=Direction.values(); for(int i=0;i<8;i++) { fire(dirs[i]); } } public void locationDir() { if(bL&&!bU&&!bR&&!bD ) dir=Direction.L; else if(bL&&bU&&!bR&&!bD) dir=Direction.LU; 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; !bU&&bR&&bD) dir=Direction.RD; 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; Rechteck getRect()//Erhalte die rechteckige Fläche des Tanks{ return new Rechteck(this.x,this.y,this.WIDTH,this.HEIGHT); } /** * Der Panzer ist gegen die Wand gestoßen* @param w wall* @returntrue hat getroffen, false hat nicht getroffen */ public boolean colliedsWithWall( Wall w) { if(this.live&&this.getRect().intersects(w.getRect())) { this.stay(} return true; /** * Panzer-Panzer-Kollisionen behandeln, um zu verhindern, dass sie einander kreuzen; * @param tanks feindliche Panzer; * @return true, wenn sie kollidieren, false, wenn sie nicht kollidieren; Tank> Tanks) { for(int i=0;i<tanks.size();i++) { Tank t=tanks.get(i); if(this!=t) { if(this.live&&this.isLive()&&this.getRect().intersects(t.getRect())) { this.stay();//Zurück zur Position des vorherigen Schritts t.stay();// //Return Die Position des vorherigen Schritts return true; } } } return false } private void Stay() { x=oldX } /** * Es ist die interne Klasse von Tank; der Blutbalken wird oben auf dem Kopf unseres Tanks angezeigt; * @author Hekangmin * */ private class BloodBar { public void draw(Graphics g) { Color c=g.getColor(); .setColor( Color.RED); g.drawRect(x,y-10,WIDTH,10); g.fillRect(x,y-10,w,10); } } /** * Blutgerinnsel essen und Blut hinzufügen; * @param b Blutgerinnsel* @returntrue, wenn nicht gegessen; (Blood b) { if(this.live&&b.isLive()&&this.getRect().intersects(b.getRect())) { this.life=100; b.setLive(false); return true; return false; { 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; /** * Dies ist das laufende Fenster des Spiels; * @ Autor Hekangmin * */public class TankWarClient erweitert Frame{/** * Breite des Spielfensters */ public static final int GAME_WIDTH=800 /** * Die Höhe des Spielfensters; */ public static final int GAME_HEIGHT=600; Tank MyTank=new Tank(700,400,true,Tank.Direction.STOP,this); List<Tank> tanks=new ArrayList<Tank>(); List< Explode> explosions=new ArrayList<Explode>(); List<Missile> missiles=new ArrayList<Missile>(); Wall w1=new Wall(300,200,20,this); Wall w2=new Wall(600,300,30,150,this); Blood b=new Blood(); /** * Ein virtuelles Bild zeichnen; */ Image OffScreenImage=null; name)//Text festlegen { super(name); } /** * Fenster ausführen */ public void launchFrame() { for(int i=0;i<10;i++)//Füge zehn feindliche Panzer hinzu { 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); this.addWindowListener(new WindowAdapter()//Anonymous class { public void windowClosing(WindowEvent e) { System.exit(0 } });//Tastaturmonitor hinzufügen; //Die Größe des Fensters kann nicht geändert werden; this.setVisible(true); new Thread(new PaintThread()).start();//Erstelle einen neuen Thread } public void paint(Graphics g) { g.drawString("Missile count: "+missiles.size(), 10, 50);//Display string; g.drawString("Explodes count: "+explodes.size(),10 , 70); g.drawString("tanks count: "+tanks.size(),10,90); "+MyTank.getLife(),10,110); /** * Zeichne die Wand; */ w1.draw(g); w2.draw(g); /** * Erkenne Kugeln und verschiedene Ereignisse; */ for (int i=0;i<missiles.size();i++) { Missile m=missiles.get(i); m.hitsWall(w1); m.hitTanks(tanks); m.hitTank(MyTank); //if(!m.isLive()) //missiles.remove(m); ; } /** * Explosionen zeichnen; */ for(int i=0;i<explodes.size();i++) { Explode e=explodes.get(i); for(int i=0;i<tanks.size();i++) { Tank t=tanks.get(i); t.colliedsWithWall(w2); t.colliedsWithTanks(t). .draw(g); } b.draw(g); * Verwenden Sie die Doppelpuffertechnologie, um das Phänomen des Tankflimmerns zu beseitigen. */ public void update(Graphics g) //g ist der auf dem Bildschirm gezeichnete Pinsel { if(OffScreenImage==null) OffScreenImage=this.createImage(GAME_WIDTH, GAME_HEIGHT ); Grafiken gOffScreen=OffScreenImage.getGraphics();//gOffScreen ist der Pinsel von OffScreenImage; gOffScreen.setColor(Color.GREEN); gOffScreen.setColor(c); paint(gOffScreen);//Zeichnen Sie auf dem virtuellen Bild; g.drawImage(OffScreenImage,0,0,null);//Verwenden Sie den g-Pinsel, um Dinge auf dem virtuellen Bild auf dem Bildschirm zu zeichnen} Die private Klasse PaintThread implementiert Runnable{ public void run() { while(true) { repaint();//Die Repaint-Methode hier ist der try{ der Frame-Klasse Thread.sleep(100); }catch(InterruptedException e){ e.printStackTrace(); private class KeyAdapter { public void keyReleased(KeyEvent e) { MyTank.keyReleased(e); KeyEvent e) { MyTank.KeyPressed(e); } public static void main(String[] args) { new TankWarClient("My Tank World").launchFrame();
Wall.java
package com.hkm.TankWar;import java.awt.*;/** * Generiere die Hinderniswandklasse; * @author Hekangmin * */ public class Wall { /** * x, y ist die Position der Wand, w , h ist die Breite und Höhe; */ int x,y,w,h; /** * enthält die Referenz*/ TankWarClient tc; tc) { this.x = x; this.w = this.h = h; ; g.setColor(Color.GRAY); g.fillRect(x,y,w,h); g.setColor(c); öffentlich Rechteck getRect() { return new Rechteck(x,y,w,h);
Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, er gefällt Ihnen allen.