Silakan lihat catatan untuk detailnya. Saya tidak akan membahas terlalu banyak omong kosong di sini, cukup wujudkan cerita klasik masa kecil.
Darah.java
paket com.hkm.TankWar;import java.awt.*;/** * Kelas bekuan darah, tangki kita dapat memulihkan darah dengan memakannya; * @author Hekangmin * */public class Blood { private int x,y,w, h; //Posisi, lebar dan tinggi bekuan darah; private TankWarClient tc; private int step=0;//Catat jumlah langkah bekuan darah bergerak live=true; live; } public void setLive(boolean live) { this.live = live; } /** * Catat lokasi bekuan darah */ private int[][] pos={{400,300},{400,320},{420,320},{440,300},{440,330},{480,400},{520,400},{540,400}}; Darah publik() { x=pos[0][0] ; } public void draw(Grafik g) { if(!live) return; Warna c=g.getColor(); g.setColor(Color.CYAN); g.fillOval(x, y, w, h); (c); move(); } /** * Pindahkan bekuan darah*/ public void move() { langkah++; if(langkah>=pos.panjang) langkah=0; ]; y=pos[langkah][1];
Meledak.java
paket com.hkm.TankWar;import java.awt.*;/** * Explode class* @author Hekangmin * */public class Explode { private int x,y;//Lokasi terjadinya ledakan private boolean Live=true ; int dia[]={4,8,12,16,32,40,20,14,4}; // Gunakan simulasi lingkaran untuk merepresentasikan diameter lingkaran; langkah=0;//Selisihnya dipindahkan ke diameter private TankWarClient tc;//Memegang referensi public Explode(int x,int y,TankWarClient tc) { this.x=x; =tc; } public void draw(Grafik g) { if(!Live) { tc.explodes.remove(ini kembali); if(step==dia.length)//Jika mencapai diameter terakhir, ia akan meledak dan mati; { Live=false=0; color c=g.getColor(); .KUNING); g .fillOval(x, y, dia[langkah], dia[langkah]); g.setColor(c);
Rudal.java
paket com.hkm.TankWar;import java.awt.*;import java.awt.Event.*;import java.awt.event.KeyEvent;import java.util.List;/** * Kelas peluru* @penulis Hekangmin * */ Rudal kelas publik { private int x,y;//Posisi peluru private Tank.Arah arah;//Arah tank private static final int XSPEED=10;//Kecepatan gerak tangki pada arah x, int akhir statis privat YSPEED=10;//Kecepatan gerak tangki pada arah y, int akhir statis publik WIDTH=10; HEIGHT=10; private boolean Live= true; // Tentukan apakah peluru tersebut masih hidup private boolean good; // Bedakan antara peluru musuh dan peluru kita private TankWarClient tc; dir) { ini.x = x; ini.y = y; ini.dir = dir; } Rudal publik(int x,int y,boolean bagus,Tank.Direction dir,TankWarClient tc) { ini(x,y,dir ); this.good=good;//Atur atribut baik dan buruk tangki serta atribut pengembalian kerusakan peluru ke sama; this.tc=tc; g adalah kuas*/ public void draw(Grafik g) { if(!Live) { tc.missiles.remove(this } Warna c=g.getColor(); Warna .BIRU); } lain g.setColor(Warna.ORANGE); g.fillOval(x, y, LEBAR, TINGGI); g.setColor(c); } /** * Gerakkan peluru sesuai arah tangki */ private void move() { switch(dir) { case L: x-=XSPEED; ; pecah; kasus U: y-=YSPEED; kasus R: x+=XSPEED; y+=YSPEED; kerusakan; kasus D: y+=YSPEED; kerusakan; kasus LD: x-=XSPEED; y+=YSPEED; >TankWarClient.GAME_HEIGHT)//Jika peluru melewati batas, biarkan mati; { Live=false; } } public boolean isLive() { return Live; } public Rectangle getRect()//Dapatkan luas persegi panjang dari peluru; { return new Rectangle(this.x, this.y, this.WIDTH, this.HEIGHT); peluru bertabrakan dengan tangki; * @param t adalah tangki* @return mengembalikan nilai true untuk menunjukkan tabrakan, jika tidak, tidak ada tabrakan; */ 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); jika(t.getLife()<=0) t.setLive(salah); this.Live=false;///Menyetel peluru hingga mati; Explode e=new Explode(x,y,tc);//Terjadi ledakan; tc.explodes.add(e); } /** * Tentukan apakah peluru bertabrakan dengan tank musuh; * @param tank tank musuh* @returntrue artinya tabrakan, false tidak bertabrakan */ public boolean hitTanks(Daftar<Tank> tank) { for(int i=0;i<tanks.size();i++) { if(hitTank(tc.tanks.get(i))) { return true; } } return false; membentur tembok * @param w tembok* @returntrue, pukul, salah, tidak mengenai; */ public boolean hitsWall(Dinding w) { if(ini.Live&&ini.getRect().intersects(w.getRect())) { Live=false; mengembalikan nilai benar;
Tank.java
paket 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;//tangki kecepatan arah x public static final int YSPEED=5; public static final int WIDTH=30; public static final int HEIGHT=30; BloodBar bb=new BloodBar();//batang darah private int life=100; public int getLife() { return life; } public void setLife(int life) { this.life = life; (); private static int step=r.nextInt(12)+3;//Tentukan angka untuk mewakili jumlah langkah yang diambil tank musuh untuk bergerak secara acak; bL=false,bU=false,bR=false,bD=false; enum Direction{L,LU,U,RU,R,RD,D,LD,STOP};//Gunakan tipe enumerasi untuk menentukan arah tangki; int x,y; private int oldX,oldY;//catat posisi tangki pada langkah sebelumnya; private boolean live=true;//tentukan apakah tangki masih hidup public boolean isLive() { return live } public void setLive (boolean live) { this.live = live; } private boolean bagus;//Apakah tangkinya bagus atau jelek? public boolean isGood() { return good } private Direction ptDir=Direction.D;//Tambahkan arah laras; TankWarClient tc ;//Untuk menyimpan referensi pihak lain untuk memfasilitasi akses ke variabel anggotanya; Direction dir=Direction.STOP;//Mengatur arah tangki untuk berhenti di awal; int y, boolean bagus, Arah dir,TankWarClient tc) { ini.x=x; ini.y=y; ini.oldX=x; ini.oldY=y; Memegang referensi pihak lain; } public void draw(Graphics g) { if(!live)//Jika mati, maka tidak akan draw lagi; { if(!good) { tc.tanks.remove(this); if(tc.tanks.size()<5)//Tambahkan tangki ketika jumlah tangki kurang dari 5; { 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));//Membuat lokasi tangki tampak acak} } } return; } Warna c=g.getColor(); if(bagus) { g.setColor(Color.RED(g } else g.setColor(Color.BLACK); x, y, LEBAR, TINGGI); g.setColor(c); switch(ptDir)//Gambarkan arah laras; g.drawLine(x+Tank.WIDTH/2, y+Tank.HEIGHT/2, x-10, y+Tank.HEIGHT/2);//Gambarlah laras senapan dan gambarlah garis lurus putus; : 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; 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; 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); LEBAR/2, y+Tangki.TINGGI/2, x-7, y+TINGGI+7); oldX=x;//Rekam posisi tangki sebelumnya oldY=y; switch(dir) { case L: x-=XSPEED; case LU: x-=XSPEED; y -=YSPEED; istirahat; kasus RU: x+=XSPEED; y-=YSPEED; kasus R: x+=XSPEED; y+=YSPEED; istirahat; kasus D: y+=YSPEED; istirahat; kasus LD: x-=XSPEED; y+=YSPEED; istirahat; this.dir; /** * Mencegah tank melintasi batas; */ if(x<0) x=0; 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();//Mengubah tipe enumerasi menjadi array; if(langkah==0) { langkah=r.nextInt(12)+3; int rn=r.nextInt(dirs.length);//Buat bilangan bulat acak dengan panjang; dir=dirs[rn]; -; if(r.nextInt(40)>20) this.fire(); // Membuat tank musuh menembakkan peluru; public void KeyPressed(KeyEvent e) { int key=e.getKeyCode(); switch(kunci) { case KeyEvent.VK_LEFT: bL=true; case KeyEvent.VK_RIGHT: bR=true; =benar; rusak; kasus KeyEvent.VK_DOWN: bD=benar; } locationDir(); keyReleased(KeyEvent e) { int key=e.getKeyCode(); switch(kunci) { case KeyEvent.VK_CONTROL: fire(); case KeyEvent.VK_LEFT: bL=false; ; pecah; huruf besar KeyEvent.VK_UP: bU=salah; bD=false; case KeyEvent.VK_A: superFire(); break; case KeyEvent.VK_F2: reBorn(); tembakan Rudal publik() { if(!live) return null; mx=this.x+Tank.WIDTH/2-Missile.WIDTH/2;//Hitung posisi peluncuran peluru; int my=this.y+Tank.HEIGHT/2-Missile.HEIGHT/2; Rudal baru (mx,my,good,ptDir,this.tc);////Luncurkan peluru sesuai dengan arah laras tc.missiles.add(m); return } tembakan Rudal publik(Arah dir) { if(!live) return null; int mx=ini.x+Tank.WIDTH/2-Missile.WIDTH/2; int my=this.y+Tank.HEIGHT/2-Missile.HEIGHT/2; new Missile(mx,my,good,dir,this.tc);//Meluncurkan peluru sesuai dengan arah tank; tc.missiles.add(m); return m; Arah[] dirs=Arah.nilai(); for(int i=0;i<8;i++) { api(dirs[i]); } public void locationDir() { if(bL&&!bU&&!bR&&!bD ) dir=Arah.L; lain jika(bL&&bU&&!bR&&!bD) dir=Arah.LU lain; if(!bL&&bU&&!bR&&!bD) dir=Arah.U; lain jika(!bL&&bU&&bR&&!bD) dir=Arah.RU lain if(!bL&&!bU&&bR&&!bD) dir=Arah.R; !bU&&bR&&bD) dir=Arah.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 } publik Rectangle getRect()//Dapatkan luas persegi panjang tangki{ return new Rectangle(this.x,this.y,this.WIDTH,this.HEIGHT); } /** * Tangki menabrak dinding* @param w dinding* @returntrue memukul, false tidak mengenai */ public boolean colliedsWithWall( Dinding w ) { if(this.live&&this.getRect().intersects(w.getRect())) { this.stay(); mengembalikan nilai true; /** * Menangani tabrakan tank-tank untuk mencegah mereka saling bersilangan; * @param tank tank musuh; * @return true jika bertabrakan, false jika tidak; Tangki> tank) { for(int i=0;i<tanks.size();i++) { Tangki t=tanks.get(i); if(this.live&&this.isLive()&&this.getRect().intersects(t.getRect())) { this.stay();//Kembali ke posisi langkah sebelumnya t.stay();// //Kembalikan Posisi langkah sebelumnya return true } } } return false; } private void stay() { x=oldX; Ini adalah kelas internal Tank; batang darah ditampilkan di bagian atas kepala tangki kita; * @author Hekangmin * */ private class BloodBar { public void draw(Graphics g) { Color c=g.getColor(); .setColor( Warna.MERAH); g.drawRect(x,y-10,WIDTH,10); g.fillRect(x,y-10,w,10); } } /** * Makan gumpalan darah dan tambahkan darah; * @param b gumpalan darah* @returntrue jika dimakan, false jika tidak dimakan; (Darah b) { if(this.live&&b.isLive()&&this.getRect().intersects(b.getRect())) { this.life=100; b.setLive(false); return true } return false } /** * Tangki kita akan dibangkitkan setelah kematian; */ public void reBorn() { if(this.isGood()&&!this.isLive()) { ini.setLive(benar); ini.setLife(100);
TankWarClient.java
package com.hkm.TankWar;import java.awt.*;import java.awt.event.*;import java.util.List;import java.util.ArrayList; /** * Ini adalah jendela permainan yang sedang berjalan; * @ author Hekangmin * */ TankWarClient kelas publik memperluas Bingkai{/** * Lebar jendela permainan; */ public static final int GAME_WIDTH=800; Ketinggian jendela permainan; */ public static final int GAME_HEIGHT=600; Tank MyTank=new Tank(700,400,true,Tank.Direction.STOP,this); Daftar< Meledak> meledak=Daftar Array baru<Meledak>(); Daftar<Rudal> rudal=Daftar Array<Rudal>() baru w1=baru Wall(300,200,20,200,this); nama)//Atur teks { super(nama } /** * Jalankan jendela; */ public void launchFrame() { for(int i=0;i<10;i++)//Tambahkan sepuluh tank musuh { tank.add(new Tank(50+40*(i+1),50,false,Tank.Direction.D,this) } ini .setBounds(200,100,GAME_WIDTH,GAME_HEIGHT); this.setBackground(Color.GREEN); this.addWindowListener(baru WindowAdapter()//Kelas anonim { public void windowClosing(WindowEvent e) { System.exit(0 } }); //Ukuran jendela tidak dapat diubah; this.setVisible(true); new Thread(new PaintThread()).start();//Buat thread baru } public void paint(Grafik g) { g.drawString("Jumlah rudal: "+misil.size(), 10, 50);//Tampilkan string; g.drawString("Jumlah ledakan: "+explodes.size(),10 , 70); g.drawString("jumlah tangki: "+tangki.ukuran(),10,90); "+MyTank.getLife(),10,110); /** * Gambar dinding; */ w1.draw(g); w2.draw(g); /** * Mendeteksi peluru dan berbagai peristiwa; */ for (int i=0;i<misil.ukuran();i++) { Rudal m=misil.get(i); m.hitsWall(w1); m.hitTanks(tank); m.hitTank(MyTank); m.draw(g); //if(!m.isLive()) //misil.hapus(m); ; } /** * Gambar ledakan; */ for(int i=0;i<explodes.size();i++) { Meledak e=explodes.get(i); for(int i=0;i<tanks.size();i++) { Tangki t=tanks.get(i); t.colliedsWithTanks(w1); t.colliedsWithWall(w2); .draw(g); } b.draw(g); Tangki Saya.makan(b); Tangki Saya.draw(g); * Gunakan teknologi buffering ganda untuk menghilangkan fenomena kedipan tangki; */ public void update(Graphics g) //g adalah kuas yang digambar di layar; ); gOffScreen=OffScreenImage.getGraphics();//gOffScreen adalah kuas OffScreenImage; Warna c=gOffScreen.getColor(); gOffScreen.setColor(Color.GREEN.fillRect(0, 0, GAME_WIDTH, GAME_HEIGHT); gOffScreen.setColor(c); paint(gOffScreen);//Menggambar pada gambar virtual; g.drawImage(OffScreenImage,0,0,null);//Gunakan kuas g untuk menggambar sesuatu pada gambar virtual di layar} private class PaintThread mengimplementasikan Runnable{ public void run() { while(true) { repaint();//Metode repaint di sini adalah try{ dari kelas Frame Thread.sleep(100); }catch(InterruptedException e){ e.printStackTrace(); } } } } kelas privat KeyMonitor extends KeyAdapter { public void keyPressed(KeyEvent e) { MyTank.keyReleased(e); KeyEvent e) { MyTank.KeyPressed(e); main(String[] args) { new TankWarClient("Dunia Tank Saya").launchFrame();
Dinding.java
paket com.hkm.TankWar;import java.awt.*;/** * Hasilkan kelas dinding penghalang; * @author Hekangmin * */ public class Wall { /** * x, y adalah posisi dinding, w , h adalah lebar dan tinggi; */ int x,y,w,h; /** * menyimpan referensi*/ TankWarClient tc; public Wall(int x, int y, int w, int h, TankWarClient tc) { ini.x = x; ini.y = y; ini.w = w; ini.h = h; ini.tc = tc; } public void draw(Grafik g) { Warna c=g.getColor() ; g.setColor(Color.GRAY); g.fillRect(x,y,w,h); g.setColor(c); publik Persegi panjang getRect() { kembalikan Persegi Panjang baru(x,y,w,h);
Di atas adalah keseluruhan isi artikel ini, saya harap Anda semua menyukainya.