โปรดดูรายละเอียดในหมายเหตุ ฉันจะไม่พูดถึงเรื่องไร้สาระมากเกินไป แค่ตระหนักถึงความคลาสสิกในวัยเด็ก
Blood.java
package com.hkm.TankWar;import java.awt.*;/** * คลาสลิ่มเลือด แทงค์ของเราสามารถฟื้นเลือดได้ด้วยการรับประทานมัน; * @author Hekangmin * */public class Blood { private int x,y,w, h; //ตำแหน่ง ความกว้าง และความสูงของลิ่มเลือด ส่วนตัว TankWarClient tc; //บันทึกจำนวนก้าวที่ลิ่มเลือดเคลื่อนไหว; บูลีนส่วนตัว live=true; live; } public void setLive(boolean live) { this.live = live; } /** * บันทึกตำแหน่งของก้อนเลือด; pos={{400,300},{400,320},{420,320},{440,300},{440,330},{480,400},{520,400},{540,400}}; เลือดสาธารณะ () { x=pos[0][0] ; y=pos[0][1]; } การวาดโมฆะสาธารณะ (กราฟิก g) { if(!live) return; Color c=g.getColor(); g.setColor(Color.CYAN); g.fillOval(x, y, w, h); (c); move(); } /** * ย้ายก้อนเลือด*/ public void move() { step++; ]; y=pos[ขั้นตอน][1]; } } สี่เหลี่ยมผืนผ้าสาธารณะ getRect() { คืนสี่เหลี่ยมผืนผ้าใหม่(x,y,w,h);
Explode.java
package com.hkm.TankWar;import java.awt.*;/** * Explode class* @author Hekangmin * */public class Explode { private int x,y;//ตำแหน่งที่เกิดการระเบิด private boolean Live=true ; int dia[]={4,8,12,16,32,40,20,14,4}; // ใช้การจำลองวงกลมเพื่อแสดงเส้นผ่านศูนย์กลางของวงกลม step=0;//ความแตกต่างถูกย้ายไปยังเส้นผ่านศูนย์กลางส่วนตัว TankWarClient tc;//ถือ Explode สาธารณะอ้างอิง (int x,int y,TankWarClient tc) { this.x=x this.y=y; =tc; } การวาดโมฆะสาธารณะ (กราฟิก g) { if(!Live) { tc.explodes.remove(this); if(step==dia.length)//หากถึงเส้นผ่านศูนย์กลางสุดท้าย มันจะระเบิดและตาย; { Live=false; step=0; return; } Color c=g.setColor(Color .YELLOW); g .fillOval(x, y, dia[ขั้นตอน], dia[ขั้นตอน]); g.setColor(c);
ขีปนาวุธ.java
แพ็คเกจ com.hkm.TankWar;นำเข้า java.awt.*;นำเข้า java.awt.Event.*;นำเข้า java.awt.event.KeyEvent;นำเข้า java.util.List;/** * Bullet class* @author Hekangmin * */ ขีปนาวุธคลาสสาธารณะ { ส่วนตัว int x,y;// ตำแหน่งของกระสุนส่วนตัว Tank.Direction dir;// ทิศทางของ int สุดท้ายคงที่ส่วนตัวของรถถัง XSPEED=10;//ความเร็วในการเคลื่อนที่ของรถถังในทิศทาง x, int สุดท้ายคงที่สาธารณะ YSPEED=10;//ความเร็วในการเคลื่อนที่ของรถถังในทิศทาง y, int สุดท้ายคงที่สาธารณะ WIDTH=10; HEIGHT=10; private boolean Live= true; // ตรวจสอบว่ากระสุนยังมีชีวิตอยู่หรือไม่ // แยกความแตกต่างระหว่างกระสุนศัตรูและกระสุนส่วนตัว TankWarClient tc; dir) { this.x = x; this.y = y; this.dir = dir; } ขีปนาวุธสาธารณะ (int x, int y, บูลีนดี, Tank.Direction dir, TankWarClient tc) { นี้ (x, y, dir ); this.good=good;//ตั้งค่าคุณสมบัติที่ดีและไม่ดีของรถถังและคุณสมบัติการส่งคืนความเสียหายของกระสุนให้เหมือนกัน } /** * Draw bullets* @param g คือแปรง*/ การวาดโมฆะสาธารณะ (กราฟิก g) { if(!Live) { tc.missiles.remove(this); return; } Color c=g.getColor(); สี .BLUE); } อื่น ๆ g.setColor(Color.ORANGE); g.fillOval(x, y, WIDTH, HEIGHT); } /** * ย้ายกระสุนตามทิศทางของรถถัง */ การเคลื่อนที่เป็นโมฆะส่วนตัว () { สวิตช์ (dir) { case L: x-=XSPEED; break; case LU: x-=XSPEED; ; กรณี U: y-=YSPEED; กรณี RU: x+=XSPEED; y+=YSPEED; กรณีที่ D: y+=YSPEED; กรณีที่ LD: x-=XSPEED; y >TankWarClient.GAME_HEIGHT)//หากกระสุนข้ามขอบเขต ปล่อยให้มันตาย; { Live=false; } } public boolean isLive() { return Live; } สี่เหลี่ยมผืนผ้าสาธารณะ getRect()// รับพื้นที่สี่เหลี่ยมของสัญลักษณ์แสดงหัวข้อย่อย; { กลับสี่เหลี่ยมผืนผ้าใหม่ (this.x, this.y, this.WIDTH, this.HEIGHT); กระสุนชนกับรถถัง * @param t คือรถถัง* @return คืนค่าจริงเพื่อระบุการชนกัน มิฉะนั้นจะไม่มีการชนกัน */ hitTank สาธารณะ (Tank t) { if(this.Live&&this.getRect().intersects(t.getRect())&&t.isLive()&&this.good!=t.isGood()) { ถ้า(t.isGood()) { t.setLife(t. getLife()-10); if(t.getLife()<=0) t.setLive(false); } อื่น ๆ { t.setLive (false); this.Live=false;///ตั้งค่ากระสุนให้ตาย ระเบิด e=new Explode(x,y,tc);//เกิดการระเบิด; tc.explodes.add(e); } /** * ตรวจสอบว่ากระสุนชนกับรถถังศัตรูหรือไม่ * @param tanks รถถังศัตรู* @returntrue หมายถึงการชนกัน false ไม่ชนกัน */ public boolean hitTanks(List<Tank> tanks) { for(int i=0;i<tanks.size();i++) { if(hitTank(tc.tanks.get(i))) { return true; } } return false; } /** * พิจารณาว่าสัญลักษณ์แสดงหัวข้อย่อย ชนกำแพง * @param w wall* @returntrue, hit, false, not hit; */ public boolean hitsWall(Wall w) { if(this.Live&&this.getRect().intersects(w.getRect())) { Live=false; return จริง; } กลับเท็จ;
แทงค์.ชวา
package com.hkm.TankWar;import java.awt.*;import java.awt.event.KeyEvent;import java.util.*;/** * Tank class* @author Hekangmin * */public class Tank { public static สุดท้าย int XSPEED=5;//ความเร็วคงที่ของถังสาธารณะ int YSPEED=5; BloodBar bb=new BloodBar();//blood bar ส่วนตัว int life=100; public int getLife() { return life; } public void setLife(int life) { this.life = life; } ส่วนตัว static Random r=new Random (); private static int step=r.nextInt(12)+3;//กำหนดตัวเลขเพื่อแสดงจำนวนขั้นตอนที่รถถังศัตรูใช้ในการเคลื่อนที่แบบสุ่ม bL=false,bU=false,bR=false,bD=false; enum Direction{L,LU,U,RU,R,RD,D,LD,STOP};//ใช้ประเภทการแจงนับเพื่อกำหนดทิศทางของถัง int x,y; private int oldX,oldY;//บันทึกตำแหน่งของรถถังในขั้นตอนก่อนหน้า; private boolean live=true;//ตรวจสอบว่าบูลีนสาธารณะยังมีชีวิตอยู่หรือไม่ () { return live; } public void setLive (บูลีน live) { this.live = live; } บูลีนส่วนตัวดี // เพิ่มทิศทางของถัง; TankWarClient tc ;//เพื่อเก็บการอ้างอิงของอีกฝ่ายเพื่ออำนวยความสะดวกในการเข้าถึงตัวแปรสมาชิก ทิศทาง dir=Direction.STOP;//กำหนดทิศทางของรถถังให้หยุดที่จุดเริ่มต้น; int y, ดีบูลีน, ทิศทาง dir, TankWarClient tc) { this.x=x; this.y=y; this.oldX=y; this.good=good; this.dir=tc;// ถือการอ้างอิงของอีกฝ่าย } public void Draw(Graphics g) { if(!live)//ถ้ามันตาย มันจะไม่ดึงอีกต่อไป; { if(!good) { tc.tanks.remove(this); if(tc.tanks.size()<5)//เพิ่มรถถังเมื่อมีน้อยกว่า 5 รถถัง; { for(int i=0;i<10;i++) { int posX=r.nextInt(800); posY =r.nextInt(600); tc.tanks.add(รถถังใหม่(posX,posY,false,Direction.D,tc));//ทำให้ตำแหน่งของรถถังปรากฏแบบสุ่ม} } } กลับ; } สี c=g.getColor(); if(good) { g.setColor(Color.RED); } else g.setColor(Color.BLACK); x, y, WIDTH, HEIGHT); g.setColor(c); switch(ptDir)//วาดทิศทางของถัง; g.drawLine(x+Tank.WIDTH/2, y+Tank.HEIGHT/2, x-10, y+Tank.HEIGHT/2);//วาดกระบอกปืนแล้ววาดเส้นตรงแทน หัก; : 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); ตัวแบ่ง RU: g.drawLine(x+Tank.WIDTH/2, y+Tank.HEIGHT/2, x+Tank.WIDTH+7, y-7); กรณี R: 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); ตัวแบ่ง LD: g.drawLine(x+Tank. WIDTH/2, y+Tank.HEIGHT/2, x-7, y+HEIGHT+7); ทำลาย; } ย้าย(); } การย้ายสาธารณะ () oldX=x;//บันทึกตำแหน่งก่อนหน้าของถัง oldY=y; switch(dir) { case L: x-=XSPEED; y -=YSPEED; ตัวเคส RU: x+=XSPEED; y+=YSPEED; case D: y+=YSPEED; break; case LD: x-=XSPEED; this.dir; /** * ป้องกันไม่ให้รถถังข้ามขอบเขต; */ 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.values();//แปลงประเภทการแจงนับให้เป็นอาร์เรย์ if(step==0) { step=r.nextInt(12)+3; int rn=r.nextInt(dirs.length);//สร้างจำนวนเต็มสุ่มภายในความยาว; dir=dirs[rn]; -; if(r.nextInt(40)>20) this.fire(); // ทำให้รถถังศัตรูยิงกระสุน; } } /** * กดปุ่มจัดการ* @param e แป้นพิมพ์เหตุการณ์; โมฆะสาธารณะ KeyPressed (KeyEvent e) { int key=e.getKeyCode(); switch(key) { case KeyEvent.VK_LEFT: bL=true; break; case KeyEvent.VK_RIGHT: bR=true; =true; break; case KeyEvent.VK_DOWN: bD=true; } locationDir(); } สาธารณะ keyReleased (KeyEvent e) { int key=e.getKeyCode(); สวิตช์ (คีย์) { case KeyEvent.VK_CONTROL: fire(); break; case KeyEvent.VK_LEFT: bL=false; ; break; case KeyEvent.VK_UP: bU=false; bD=false; break; case KeyEvent.VK_A: superFire(); break; case KeyEvent(); } locationDir(); การยิงขีปนาวุธสาธารณะ () { if (! live) return null; mx=this.x+Tank.WIDTH/2-Missile.WIDTH/2;//คำนวณตำแหน่งของกระสุน; int my=this.y+Tank.HEIGHT/2-Missile.HEIGHT/2; ขีปนาวุธใหม่ (mx,my,good,ptDir,this.tc);////ยิงกระสุนตามทิศทางของลำกล้อง tc.missiles.add(m); return m; } การยิงขีปนาวุธสาธารณะ(ทิศทาง dir) { if(!live) return null; int mx=this.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);//ยิงกระสุนตามทิศทางของรถถัง; tc.missiles.add(m); return m; ทิศทาง [] dirs=Direction.values(); for(int i=0;i<8;i++) { fire(dirs[i]); } public void locationDir() { if(bL&&!bU&&!bR&&!bD ) dir=Direction.L; อื่น ๆ 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; อื่น ๆ 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; อื่น ๆ if(!bL&&!bU&&!bR&!bD) dir=Direction.STOP; สี่เหลี่ยมผืนผ้าgetRect()//รับพื้นที่สี่เหลี่ยมของถัง{ คืนใหม่ สี่เหลี่ยมผืนผ้า(this.x,this.y,this.WIDTH,this.HEIGHT); } /** * รถถังชนกำแพง* @param w wall* @returntrue hit, false ไม่ได้โดน; */ public boolean colliedsWithWall( กำแพง w ) { if(this.live&&this.getRect().intersects(w.getRect())) { this.stay(); return false; } /** * จัดการการชนกันของรถถังเพื่อป้องกันไม่ให้พวกมันข้ามกัน * @param รถถังศัตรู; * @return จริงถ้าพวกมันชนกัน, เท็จถ้าพวกมันไม่ชนกัน; รถถัง> รถถัง) { for(int i=0;i<tanks.size();i++) { Tanks t=tanks.get(i); if(this!=t) { if(this.live&&this.isLive()&&this.getRect().intersects(t.getRect())) { this.stay();// กลับไปที่ตำแหน่งของขั้นตอนก่อนหน้า; // Return ตำแหน่งของขั้นตอนก่อนหน้า return true; } private void stay() { x=oldX; } /** เป็นคลาสภายในของ Tank; แถบเลือดจะปรากฏที่ด้านบนของหัวรถถังของเรา; * @author Hekangmin * */ คลาสส่วนตัว BloodBar { public void Draw(Graphics g) { Color c=g.getColor(); .setColor( Color.RED); g.drawRect(x,y-10,WIDTH,10); int w=WIDTH*life/100; g.fillRect(x,y-10,w,10); } } /** * กินเลือดอุดตันและเพิ่มเลือด * @param b เลือดอุดตัน* @returntrue ถ้ากิน, เท็จถ้าไม่ได้กิน; */ บูลีนสาธารณะ (เลือด b) { if(this.live&&b.isLive()&&this.getRect().intersects(b.getRect())) { this.life=100; b.setLive(false); return true; } return false; } /** * รถถังของเราจะฟื้นคืนชีพหลังจากการตาย; */ public void reBorn() { if(this.isGood()&&!isLive()) { this.setLive(จริง); this.setLife(100);
TankWarClient.java
package com.hkm.TankWar;import java.awt.*;import java.awt.event.*;import java.util.List;import java.util.ArrayList; * @ ผู้เขียน Hekangmin * */คลาสสาธารณะ TankWarClient ขยายเฟรม{/** * ความกว้างของหน้าต่างเกม; */ สาธารณะคงที่สุดท้าย int GAME_WIDTH=800; ความสูงของหน้าต่างเกม */ สาธารณะคงสุดท้าย int GAME_HEIGHT=600; Tank MyTank=new Tank(700,400,true,Tank.Direction.STOP,this); List<Tank> tanks=new ArrayList<Tank>(); รายการ <ระเบิด> ระเบิด=ใหม่ ArrayList<ระเบิด>(); รายการ<ขีปนาวุธ> ขีปนาวุธ=ใหม่ ArrayList<ขีปนาวุธ>(); กำแพง w1=ใหม่ กำแพง (300,200,20,200, นี้); กำแพง w2 = กำแพงใหม่ (600,300,30,150, นี้); Blood b = เลือดใหม่ (); /** * วาดภาพเสมือนจริง; */ Image OffScreenImage=null; ชื่อ)//ตั้งค่าข้อความ { super(name); } /** * Run window; */ public void launchFrame() { for(int i=0;i<10;i++)//เพิ่มรถถังศัตรูสิบคัน { tanks.add(รถถังใหม่(50+40*(i+1),50,false,Tank.Direction.D,this) } นี้ .setBounds(200,100,GAME_WIDTH,GAME_HEIGHT); this.setBackground(สี.สีเขียว); this.addWindowListener(ใหม่ WindowAdapter()//คลาสที่ไม่เปิดเผยตัวตน { public void windowClosing(WindowEvent e) { System.exit(0); } }); this.addKeyListener(ใหม่ KeyMonitor());//เพิ่มจอภาพแป้นพิมพ์; this.setResizable(false) ; //ขนาดของหน้าต่างไม่สามารถเปลี่ยนแปลงได้ this.setVisible(true); new Thread(new PaintThread()).start();//สร้าง thread ใหม่; สี (กราฟิก g) { g.drawString ("จำนวนขีปนาวุธ: "+ ขีปนาวุธ. ขนาด (), 10, 50); // สตริงการแสดงผล; g.drawString (" จำนวนการระเบิด: "+ explodes.size (), 10 , 70); g.drawString("จำนวนรถถัง: "+tanks.size(),10,90); g.drawString("ชีวิต Mytank: "+MyTank.getLife(),10,110); /** * วาดกำแพง; */ w1.draw(g); w2.draw(g); /** * ตรวจจับกระสุนและเหตุการณ์ต่าง ๆ ; */ สำหรับ (int i=0;i<missiles.size();i++) { ขีปนาวุธ m=missiles.get(i); m.hitsWall(w1); m.hitsWall(w2); m.hitTanks(รถถัง); m.hitTank(MyTank); m.draw(g); //if(!m.isLive()) //missiles.remove(m); ; } /** * วาดระเบิด; */ for(int i=0;i<explodes.size();i++) { Explode e=explodes.get(i); สำหรับ(int i=0;i<tanks.size();i++) { ถัง t=tanks.get(i); t.colliedsWithWall(w1); t.colliedsWithWall(w2); .draw(g); } b.draw(g); MyTank.eat(b); MyTank.draw(g); * ใช้เทคโนโลยีการบัฟเฟอร์สองครั้งเพื่อกำจัดปรากฏการณ์การกะพริบของรถถัง */ การอัปเดตโมฆะสาธารณะ (กราฟิก g) //g คือแปรงที่วาดบนหน้าจอ; ); กราฟิก gOffScreen=OffScreenImage.getGraphics();//gOffScreen คือแปรงของ OffScreenImage; Color c=gOffScreen.getColor(); gOffScreen.setColor(Color.GREEN); gOffScreen.setColor(c); paint(gOffScreen);//วาดภาพเสมือนจริง; g.drawImage(OffScreenImage,0,0,null);//ใช้แปรง g เพื่อวาดภาพเสมือนจริงบนหน้าจอ} คลาสส่วนตัว PaintThread ใช้งาน Runnable{ public void run() { while(true) { repaint();//วิธีการทาสีใหม่นี่คือการลอง{ ของคลาส Frame Thread.sleep (100); } catch (InterruptedException e) { e.printStackTrace (e) } คลาสส่วนตัว KeyMonitor ขยาย KeyAdapter { public void keyReleased (KeyEvent e) { MyTank.keyReleased (e); KeyEvent e) { MyTank.KeyPressed(e); } } สาธารณะคงเป็นโมฆะ main(String[] args) { ใหม่ TankWarClient("My Tank World").launchFrame();
วอลล์.java
package com.hkm.TankWar;import java.awt.*;/** * สร้างคลาสกำแพงสิ่งกีดขวาง; * @author Hekangmin * */ public class Wall { /** * x, y คือตำแหน่งของกำแพง, w , h คือความกว้างและความสูง; */ int x,y,w,h; /** * เก็บค่าอ้างอิง*/ TankWarClient tc; tc) { this.x = x; this.y = y; this.w = w; this.h = h; this.tc = tc; } การวาดโมฆะสาธารณะ (กราฟิก g) { สี c=g.getColor() ; g.setColor(Color.GRAY); g.fillRect(x,y,w,h); g.setColor(c); } /** * รับพื้นที่สี่เหลี่ยมของผนัง; สาธารณะ สี่เหลี่ยมผืนผ้า getRect() { คืนสี่เหลี่ยมผืนผ้าใหม่ (x, y, w, h);
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่าทุกคนจะชอบมัน