Veuillez vous référer aux notes pour plus de détails. Je n'entrerai pas dans des bêtises ici, je réaliserai simplement un classique de l'enfance.
Sang.java
package com.hkm.TankWar;import java.awt.*;/** * Classe de caillot de sang, notre tank peut récupérer du sang en le mangeant * */public class Blood { private int x,y,w, h; //La position, la largeur et la hauteur du caillot de sang ; private TankWarClient tc; private int step=0;//Enregistre le nombre de pas effectués par le caillot de sang ; private boolean live=true ; live; } public void setLive(boolean live) { this.live = live; } /** * Enregistrez l'emplacement du caillot de sang ; 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(Graphics g) { if(!live) return; Color c=g.getColor(); g.setColor(Color.CYAN); (c); move(); } /** * Déplacer le caillot de sang*/ public void move() { step++; if(step>=pos.length) step=0; ]; y=pos[étape][1]; } } public Rectangle getRect() { return new Rectangle(x,y,w,h } }
Explode.java
package com.hkm.TankWar;import java.awt.*;/** * Explode class* @author Hekangmin * */public class Explode { private int x,y;//L'emplacement où l'explosion s'est produite private boolean Live=true ; int dia[]={4,8,12,16,32,40,20,14,4}; // Utiliser la simulation de cercle pour représenter le diamètre du cercle int ; step=0;//La différence est déplacée vers le diamètre private TankWarClient tc;//Maintien de la référence public Explode(int x,int y,TankWarClient tc) { this.x=x; =tc; } public void draw(Graphics g) { if(!Live) { tc.explodes.remove(this); if(step==dia.length)//S'il atteint le dernier diamètre, il explosera et mourra ; { Live=false step=0; .YELLOW); g .fillOval(x, y, dia[étape], dia[étape]); g.setColor(c);
Missile.java
package com.hkm.TankWar;importer java.awt.*;importer java.awt.Event.*;importer java.awt.event.KeyEvent;importer java.util.List;/** * Classe Bullet* @author Hekangmin * */ public class Missile { private int x,y;//La position de la balle private Tank.Direction dir;//La direction du tank private static final int XSPEED=10;//La vitesse de déplacement du réservoir dans la direction x, privé statique final int YSPEED=10;//La vitesse de déplacement du réservoir dans la direction y, public static final int WIDTH=10; HEIGHT=10; private boolean Live= true; // Déterminer si la balle est vivante private boolean good; // Distinguer les balles ennemies de nos propres balles private TankWarClient 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, TankWarClient tc) { this (x, y, dir ); this.good=good;//Définissez les attributs bons et mauvais du char et l'attribut de retour de dégâts de la balle sur les mêmes this.tc=tc; } /** * Dessiner des balles* @param ; g est le pinceau*/ public void draw(Graphics g) { if(!Live) { tc.missiles.remove(this } Color c=g.getColor(); Couleur .BLUE); } else g.setColor(Color.ORANGE); g.fillOval(x, y, WIDTH, HEIGHT); } /** * Déplacez la balle en fonction de la direction du char */ private void move() { switch(dir) { case L: x-=XSPEED; break LU: x-=XSPEED; ; cas U : y-=YSPEED ; cas RU : x+=XSPEED ; cas R : x+=XSPEED ; y+=YSPEED; cas D : y+=YSPEED ; cas LD : x-=XSPEED ; >TankWarClient.GAME_HEIGHT)//Si la balle traverse la limite, laissez-la mourir ; { Live=false; } } public boolean isLive() { return Live; } public Rectangle getRect()//Obtenir la zone rectangulaire de la puce ; { return new Rectangle(this.x, this.y, this.WIDTH, this.HEIGHT } /** * Déterminer si le la balle entre en collision avec le char ; * @param t est le char* @return renvoie true pour indiquer une collision, sinon il n'y a pas de collision */ 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;///Mettre la balle à mort ; Explode e=new Explode(x,y,tc);//Une explosion se produit ; tc.explodes.add(e); return true; } /** * Déterminez si la balle est entrée en collision avec le char ennemi ; * @param tanks tank ennemi* @returntrue signifie collision, false n'entre pas en collision */ public boolean hitTanks(List<Tank> tanks) { for(int i=0;i<tanks.size();i++) { if(hitTank(tc.tanks.get(i))) { return true } } return false } /** * Déterminez si la puce ; frappe le mur * @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;
Réservoir.java
package com.hkm.TankWar;importer java.awt.*;importer java.awt.event.KeyEvent;importer java.util.*;/** * Classe Tank* @author Hekangmin * */public class Tank { public static final int XSPEED=5;//vitesse du réservoir dans la direction X public static final int YSPEED=5 public static final int WIDTH=30 ; BloodBar bb=new BloodBar();//barre de sang 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;//Définir un nombre pour représenter le nombre de pas que le char ennemi prend pour se déplacer de manière aléatoire ; bL=false,bU=false,bR=false,bD=false; enum Direction{L,LU,U,RU,R,RD,D,LD,STOP};//Utiliser le type d'énumération pour définir la direction du réservoir privé ; int x,y; private int oldX,oldY;//enregistrer la position du tank à l'étape précédente; private boolean live=true;//déterminer s'il est vivant public boolean isLive() { return live } public void setLive; (booléen live) { this.live = live; } private boolean good;//Le tank est-il bon ou mauvais ? public boolean isGood() { return good; } private Direction ptDir=Direction.D;//Ajoute la direction du canon ; TankWarClient tc ;//Afin de conserver la référence de l'autre partie pour faciliter l'accès à ses variables membres ; Direction dir=Direction.STOP;//Définir la direction du char pour qu'il s'arrête au début public Tank(int x, int y, booléen bon, Direction dir,TankWarClient tc) { this.x=x; this.y=y; this.oldX=x; this.good=good; Conservez la référence de l'autre partie ; } public void draw(Graphics g) { if(!live)//S'il meurt, il ne dessinera plus { if(!good) { tc.tanks.remove(this); if(tc.tanks.size()<5)//Ajouter des réservoirs lorsqu'il y a moins de 5 réservoirs ; { 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));//Rendre l'emplacement du réservoir aléatoire} } } return; } Couleur c=g.getColor(); if(good) { g.setColor(Color.RED); bb.draw(g); else g.setColor(Color.BLACK); x, y, WIDTH, HEIGHT); g.setColor(c); switch(ptDir)//Dessine la direction du canon { case L : g.drawLine(x+Tank.WIDTH/2, y+Tank.HEIGHT/2, x-10, y+Tank.HEIGHT/2);//Dessinez le canon du pistolet et tracez une ligne droite, cassure LU ; : 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) cas RU : g.drawLine(x+Tank.WIDTH/2, y+Tank.HEIGHT/2, x+Tank.WIDTH+7, y-7) ; cas R : g.drawLine(x+Tank.WIDTH/2, y+Tank.HEIGHT/2, x+Tank.WIDTH+10, y+Tank.HEIGHT/2) cas 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) cas LD : g.drawLine(x+Tank. WIDTH/2, y+Tank.HEIGHT/2, x-7, y+HEIGHT+7); break(); oldX=x;//Enregistre la position précédente du réservoir oldY=y; switch(dir) { case L: x-=XSPEED; break; case LU: x-=XSPEED; y -=YSPEED ; cas RU : x+=XSPEED ; y-=YSPEED ; cas R : x+=XSPEED ; y+=YSPEED; break; cas D: y+=YSPEED; break; cas LD: x-=XSPEED; break; this.dir; /** * Empêcher les chars de franchir la frontière ; */ 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 if(!good) { Direction[] répertoires; =Direction.values();//Convertir le type d'énumération en tableau; if(step==0) { step=r.nextInt(12)+3; int rn=r.nextInt(dirs.length);//Générer un entier aléatoire dans la longueur ; -; if(r.nextInt(40)>20) this.fire(); // Faire tirer des balles au char ennemi ; } } /** * Gérer les pressions sur les touches* @param e événement clavier ; public void KeyPressed(KeyEvent e) { int key=e.getKeyCode(); switch(key) { case KeyEvent.VK_LEFT : bL=true; case KeyEvent.VK_RIGHT : bR=true; =true; cas KeyEvent.VK_DOWN: bD=true } locationDir(); keyReleased(KeyEvent e) { int key=e.getKeyCode(); switch(key) { case KeyEvent.VK_CONTROL : fire(); case KeyEvent.VK_LEFT : bL=false; case KeyEvent.VK_RIGHT : bR=false; ; break ; cas KeyEvent.VK_UP : bU=false ; cas KeyEvent.VK_DOWN : bD=false; case KeyEvent.VK_A: superFire(); case KeyEvent.VK_F2: reBorn(); locationDir(); public Missile fire() { if(!live) return null; mx=this.x+Tank.WIDTH/2-Missile.WIDTH/2;//Calculer la position du lancement de la balle int my=this.y+Tank.HEIGHT/2-Missile.HEIGHT/2; new Missile (mx,my,good,ptDir,this.tc);////Lancement de balles selon la direction du canon tc.missiles.add(m } public Tir de missile(Direction dir) { if(!live) return null; int mx=this.x+Tank.WIDTH/2-Missile.WIDTH/2; new Missile(mx,my,good,dir,this.tc);//Lancez les balles selon la direction du char; 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 sinon if(bL&&bU&&!bR&&!bD) dir=Direction.LU sinon; if(!bL&&bU&&!bR&&!bD) dir=Direction.U sinon if(!bL&&bU&&bR&&!bD) dir=Direction.RU; else if(!bL&&!bU&&bR&&!bD) dir=Direction.R; !bU&&bR&&bD) dir=Direction.RD sinon; if(!bL&&!bU&&!bR&&bD) dir=Direction.D sinon if(bL&&!bU&&!bR&&bD) dir=Direction.LD; else if(!bL&&!bU&&!bR&&!bD) dir=Direction.STOP } public; Rectangle getRect()//Obtenir la zone rectangulaire du réservoir{ return new Rectangle(this.x,this.y,this.WIDTH,this.HEIGHT); } /** * Le char a heurté le mur* @param w wall* @returntrue hit, false n'a pas touché */ public boolean colliedsWithWall( Mur w ) { if(this.live&&this.getRect().intersects(w.getRect())) { this.stay(); return false; /** * Gérer les collisions entre chars pour les empêcher de se croiser ; * @param tanks les chars ennemis * @return true s'ils entrent en collision, false s'ils ne le font pas ; */ public boolean colliedsWithTanks(java.util.List<; Réservoir> réservoirs) { for(int i=0;i<tanks.size();i++) { Réservoir t=tanks.get(i); if(this!=t) { if(this.live&&this.isLive()&&this.getRect().intersects(t.getRect())) { this.stay();//Retour à la position de l'étape précédente t.stay();// //Return La position de l'étape précédente return true; } } } return false; } private void stay() { x=oldX; C'est la classe interne de Tank ; la barre de sang est affichée sur le dessus de la tête de notre tank ; * @author Hekangmin * */ private class BloodBar { public void draw(Graphics g) { Color c=g.getColor(); .setColor( Couleur.RED); g.drawRect(x,y-10,WIDTH,10); g.fillRect(x,y-10,w,10); } } /** * Manger des caillots de sang et ajouter du sang ; * @param b caillots de sang* @returntrue si mangé, false s'il n'est pas mangé */ public boolean eat; (Sang b) { if(this.live&&b.isLive()&&this.getRect().intersects(b.getRect())) { this.life=100; b.setLive(false); return true; } return false; } /** * Notre tank sera ressuscité après la mort */ 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; /** * Ceci est la fenêtre en cours d'exécution du jeu ; * @ author Hekangmin * */public class TankWarClient extends Frame{/** * Largeur de la fenêtre de jeu */ public static final int GAME_WIDTH=800 ; La hauteur de la fenêtre de jeu ; */ 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> explosives=new ArrayList<Explode>(); List<Missile> missiles=new ArrayList<Missile>(); Wall(300,200,20,200,this); Wall w2=new Wall(600,300,30,150,this); Blood b=new Blood(); /** * Dessinez une image virtuelle ; */ Image OffScreenImage=null; nom)//Définir le texte { super(nom); /** * Exécuter la fenêtre */ public void launchFrame() { for(int i=0;i<10;i++)//Ajouter dix chars ennemis { 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(nouveau); WindowAdapter()//Anonymous class { public void windowClosing(WindowEvent e) { System.exit(0); } }); this.addKeyListener(new KeyMonitor());//Ajouter un moniteur de clavier ; //La taille de la fenêtre ne peut pas être modifiée ; this.setVisible(true); new Thread(new PaintThread()).start();//Créer un nouveau fil de discussion } public void; paint(Graphiques g) { g.drawString("Nombre de missiles : "+missiles.size(), 10, 50);//Afficher la chaîne ; g.drawString("Nombre d'explosions : "+explodes.size(),10 , 70); g.drawString("nombre de réservoirs : "+tanks.size(),10,90); g.drawString("Vie de mon réservoir : "+MyTank.getLife(),10,110); /** * Dessine le mur; */ w1.draw(g); w2.draw(g); /** * Détecte les balles et divers événements; */ for (int i=0;i<missiles.size();i++) { Missile m=missiles.get(i); m.hitsWall(w1); m.hitTanks(tanks); m.hitTank(MyTank); m.draw(g); //if(!m.isLive()) //missiles.remove(m); ; } /** * Dessiner des explosions ; */ for(int i=0;i<explodes.size();i++) { Explode e=explodes.get(i); for(int i=0;i<tanks.size();i++) { Réservoir t=tanks.get(i); t.colliedsWithWall(w1); t.colliedsWithWall(w2); .draw(g); } b.draw(g); MonTank.eat(b); * Utilisez la technologie de double tampon pour éliminer le phénomène de scintillement du réservoir ; */ public void update(Graphics g) //g est le pinceau dessiné sur l'écran ; ); Graphiques gOffScreen=OffScreenImage.getGraphics();//gOffScreen est le pinceau de OffScreenImage; Color c=gOffScreen.getColor(); gOffScreen.setColor(Color.GREEN); gOffScreen.setColor(c); paint(gOffScreen);//Dessinez sur l'image virtuelle; g.drawImage(OffScreenImage,0,0,null);//Utilisez le pinceau g pour dessiner des éléments sur l'image virtuelle à l'écran} private class PaintThread implémente Runnable{ public void run() { while(true) { repaint();//La méthode repaint ici est le try{ de la classe Frame Thread.sleep(100); }catch(InterruptedException e){ e.printStackTrace(); } } } } classe privée KeyMonitor extends KeyAdapter { public void keyReleased(KeyEvent e) { MyTank.keyReleased(e } public void keyPressed( KeyEvent e) { MyTank.KeyPressed(e); } } public static void main(String[] args) { new TankWarClient("Mon Tank World").launchFrame( } }
Mur.java
package com.hkm.TankWar;import java.awt.*;/** * Générer la classe du mur d'obstacles * * @author Hekangmin * */ public class Wall { /** * x, y est la position du mur, w , h est la largeur et la hauteur ; */ int x,y,w,h; /** * contient la référence*/ TankWarClient tc; tc) { this.x = x; this.y = y; this.w = w; this.h = h; this.tc = tc; } public void draw(Graphiques g) { Couleur c=g.getColor() ; g.setColor(Color.GRAY); g.fillRect(x,y,w,h); g.setColor(c); } /** * Obtenez la zone rectangulaire du mur ; publique Rectangle getRect() { return new Rectangle(x,y,w,h } }
Ce qui précède représente l’intégralité du contenu de cet article, j’espère que vous l’aimerez tous.