ใช้คอลเลกชันชิงช้าเธรดและจุดความรู้อื่น ๆ ในภาษา Java เพื่อเขียนเกมสงครามถัง
(1) วาดหลักการของศัตรูและรถถังสหรัฐ:
มีตัวแปรประเภทบูลีนที่ดีภายในคลาสรถถัง ใช้เพื่อตัดสินค่ายของถัง เมื่อสร้างวัตถุถังค่าของความดีจะถูกส่งผ่านในวิธีการก่อสร้างคลาสถัง เมื่อวาดรถถังให้ตัดสินคุณค่าของความดีและแยกแยะสีของศัตรูและเรา
(2) หลักการของการเคลื่อนไหวของถัง:
เหตุการณ์การตอบสนองของการกดแป้นพิมพ์คีย์บอร์ดมอนิเตอร์ถูกเขียนขึ้นในคลาสรถถังคีย์ที่ถูกตรวจสอบลงลงและขวาจะถูกบันทึกและตัวแปรในแปดทิศทางของการเคลื่อนไหวของถังถูกสังเคราะห์ จากนั้นการเปลี่ยนแปลงที่สอดคล้องกันกับค่าของรถถังพิกัด x และ y ในแต่ละทิศทางสามารถทำได้เพื่อให้เกิดการเคลื่อนไหวของถังของเรา รถถังของศัตรูเคลื่อนที่โดยอัตโนมัติหมุนทิศทางของการเคลื่อนไหวของถังศัตรูผ่านจำนวนสุ่มและส่งออกจำนวนครั้งในแต่ละครั้ง การรวมกันของค่าสุ่มสองค่าช่วยให้การเคลื่อนไหวของถังข้าศึก
(3) หลักการของการเปิดตัวถังกระสุน:
ผ่านการตรวจสอบคีย์บอร์ดหลังจากตรวจจับคำสั่งกระสุนไฟให้เพิ่มคลาสกระสุนลงในคอลเลกชัน Bullet Class ของคลาสหลัก โอนทิศทางของกระบอกปืนตำแหน่งของถังและค่ายของถังไปยังกระสุน ในวิธีการวาดภาพสีหลักคอลเลกชันกระสุนจะถูกขี่จักรยาน หากมีกระสุนในชุดให้ดึงออกมา สิ่งนี้ช่วยให้การเปิดตัวกระสุน
(4) หลักการชนของรถถังกระสุนและผนัง:
ในประเภทผนังประเภทกระสุนประเภทถังวิธีการ getRect เพื่อให้ได้ช่วงของตัวเองจากนั้นทำการตรวจจับการชนกันที่สอดคล้องกันทุกครั้งที่มีการวาดถังและรถถัง (มีวิธีการชนกับผนังและถังด้านนอกถังในถังและกระสุนปืน หากช่วงของตัวเองและวัตถุที่ไม่ควรชนกันก็หมายความว่าวัตถุทั้งสองชนกัน
(5) หลักการของการไหลเวียนโลหิตของถัง:
หากลิ่มเลือดชนเข้ากับถังของเราอุดตันในเลือดจะตายและเลือดอุดตันจะหายดี
(6) หลักการของการฟื้นคืนชีพของถัง:
หลังจากตรวจจับคำสั่งการฟื้นคืนชีพของรถถังของเราโดยการตรวจสอบคีย์บอร์ดหากรถถังของเราอยู่ในสภาพตายสถานะสินค้าคงคลังถังของเราจะเปลี่ยนเป็นชีวิตและปริมาณเลือดของถังของเราจะได้รับการฟื้นฟูเพื่อสุขภาพที่สมบูรณ์
แนวคิดการเขียนโปรแกรม:
แนวคิดการเขียนโปรแกรมของสงครามถังเปิดเธรดในคลาสหลักและไม่หมุนรอบที่ 50 มิลลิวินาทีเพื่อวาดวิธีการ (วาดทุกอย่างในส่วนต่อประสานทั้งหมด) สิ่งต่าง ๆ ที่ถูกดึงรวมถึงถังข้าศึก (ความแตกต่างสี) กระสุนผนังลิ่มเลือดและการระเบิด ดังนั้นโดยรวมมีการเขียนหลายประเภท: ถังถังกระสุนขีปนาวุธผนังกำแพงเลือดและชั้นเรียนหลักของ Tankclient ในแต่ละชั้นเรียนมีวิธีการวาดภาพที่เขียนขึ้นเพื่อตระหนักถึงฟังก์ชั่นการวาดของคุณลักษณะของคลาสนี้ มีเหตุการณ์การฟังแป้นพิมพ์ในชั้นเรียนหลักที่เรียกว่าเหตุการณ์การฟังแป้นพิมพ์ของคลาสรถถังนี้ ผ่านการตรวจสอบคีย์บอร์ดจะมีการพิจารณาว่าการเคลื่อนไหวที่สอดคล้องกันของถังถูกสร้างขึ้นในขณะที่ถังข้าศึกกำลังเคลื่อนที่แบบสุ่ม และทุกครั้งที่มีการรีเฟรชรีเฟรชวิธีการชนต่าง ๆ จะถูกเรียกใช้เพื่อกำหนดสถานการณ์ของวัตถุบางอย่างที่ไม่ควรชน การสร้างวัตถุแต่ละชิ้นเช่นกระสุนคือการเพิ่มคลาสกระสุนใหม่ลงในคอลเลกชันคลาสกระสุนหลังจากที่มันถูกกระตุ้น เมื่อวาดให้กำหนดหมายเลขในชุดที่จะวาด หากรถถังอยู่นอกขอบเขตหรือฆ่ารถถังมันจะถูกลบในชุด หมวดหมู่อื่น ๆ ก็คล้ายกันดังนั้นฉันจะไม่เข้าไปดูรายละเอียด
แต่ละขั้นตอนในรหัสมีคำอธิบายที่สอดคล้องกัน
tankclient.java
นำเข้า java.awt.Color; นำเข้า java.awt.font; นำเข้า java.awt.graphics; นำเข้า java.awt.image; นำเข้า java.awt.event.keyadapter; นำเข้า java.awt.event.KeyEvent; java.util.arraylist; นำเข้า java.util.list; นำเข้า javax.swing.jframe; คลาสสาธารณะ tankclient ขยาย jframe { / ** * @param args * / image offscrennimage = null; // การจัดเก็บภาพบัฟเฟอร์สองครั้ง/*ขนาดเกม*/สาธารณะคงที่สุดท้าย int game_width = 800; // ความกว้างอินเตอร์เฟสสาธารณะคงที่สุดท้าย int game_heigth = 600; // High Interface Tank MyTank = New Tank (500,400, True, Color.red, Tank.direction.stop, this); // รายการคลาสรถถังของเรา <Secile> missiles = new ArrayList <Secile> (); // การรวบรวมรายการกระสุน <EXPLODE> ExploIT = New ArrayList <Explode> (); // รายการชุดระเบิด <Tank> Tanks = New ArrayList <PARTANK> (); // ถังชุด Wall Wall1 = กำแพงใหม่ (150,200,20,300, สิ่งนี้); // Wall 1 Wall Wall2 = กำแพงใหม่ (250,500,300,20, สิ่งนี้); // Wall 2 Wall Wall3 = กำแพงใหม่ (650,200,20,300, สิ่งนี้); // Wall 2 Wall Wall4 = กำแพงใหม่ (250,300,300,20, สิ่งนี้); // Wall 2 Wall WB = กำแพงใหม่ (750,550,40,40, สิ่งนี้); // wall2 เลือด b = เลือดใหม่ (); // Blood Dirm Public Static Void Main (String [] args) {// todo วิธีการที่สร้างขึ้นอัตโนมัติ stub tankclient tc = tankclient ใหม่ (); tc.lauchframe (); } โมฆะส่วนตัว lauchframe () {// todo วิธีการที่สร้างขึ้นอัตโนมัติ stub สำหรับ (int i = 0; i <10; i ++) {tanks.add (ถังใหม่ (50+40*(i+1), 50, false, color.blue, tank.direction.d, this); } this.setLocation (100, 100); // หน้าต่างพิกัดเริ่มต้นจุดนี้ setsize (game_width, game_heigth); // หน้าต่างขนาดเริ่มต้น this.settitle ("tankwar"); // ชื่อหน้าต่าง/*การฟังหน้าต่าง*/this.addwindowListener (windowadapter ใหม่ () {@Override/*เรียกใช้หลังจากจุดออกจากส้อม*/โมฆะสาธารณะการปิดหน้าต่าง (windowEvent e) {// todo วิธีการที่กำหนดอัตโนมัติระบบ this.addkeyListener (Keymoniton ใหม่ ()); // ตั้งค่าแป้นพิมพ์เพื่อฟังสิ่งนี้ setVisible (จริง); // ตั้งค่าหน้าต่างเพื่อแสดงสิ่งนี้ setResizable (เท็จ); // ตั้งค่าหน้าต่างให้ไม่เปลี่ยนขนาด this.getContentPane (). Setbackground (color.green); // ตั้งค่าสีด้านหน้าของหน้าต่างเป็นเธรดใหม่สีเขียว (ใหม่ paintThread ()). start (); // เริ่มคลาส PaintThread Run} @Override โมฆะสาธารณะสี (กราฟิก g) {// วิธีการที่สร้างขึ้นอัตโนมัติ toDo stub // กราฟิกคือ brush class super.paint (g); mytank.draw (g); Wall1.Draw (G); Wall2.Draw (G); Wall3.Draw (G); Wall4.Draw (G); wb.draw (g); B.Draw (G); mytank.eatblood (b); mytank.hitwall (Wall1); MyTank.hitwall (Wall2); mytank.hitwall (Wall3); mytank.hitwall (Wall4); /*Cycle Bullet Collection*/ for (int i = 0; i <missiles.size (); i ++) {ขีปนาวุธ m = missiles.get (i); // รับกระสุนปัจจุบัน M.Hittanks (ถัง); // กระสุนปืนของคุณเองฆ่าถังข้าศึก M.Hitwall (Wall1); // กระสุนและผนัง M.Hitwall (Wall2); M.Hitwall (Wall3); M.Hitwall (Wall4); M.Hittank (MyTank); // Bullet ศัตรูกระทบถัง M.Draw (G) ของตัวเอง; // วาดกระสุน} สำหรับ (int i = 0; i <explore.size (); i ++) {enepoit.get (i) .draw (g); // วาดระเบิด} สำหรับ (int i = 0; i <tanks.size (); i ++) {tank t = tanks.get (i); T.Draw (G); // วาดรถถังศัตรู T.Hittanks (ถัง); T.hitwall (Wall1); // ถังและผนัง T.hitwall (Wall2); T.hitwall (Wall3); T.hitwall (Wall4); } //g.setfont( นิวฟอนต์ ("宋体", font.bold, 20)); G.DrawString ("จำนวนขีปนาวุธ:"+missiles.size (), 10, 50); // แสดง g.DrawString ("จำนวนระเบิด:"+explode.size (), 10, 80); // แสดง g.drawstring ("จำนวนรถถัง:"+tanks.size (), 10, 110); G.DrawString ("MyTank Life:"+MyTank.getLife (), 10, 130); G.DrawString ("การกู้คืนเลือด:", 750, 540); G.DrawString ("ทิศทางการเคลื่อนไหวของไดเรกทอรีคีย์; E: ปล่อยเลือดเคลื่อนไหวเร็ว", 10, 590); G.DrawString ("Z: เปิดตัว Dongfeng-31; A: เปิดตัว Dongfeng-41;", 10, 570); G.DrawString ("F2: การฟื้นคืนชีพ; F3: การฟื้นคืนชีพของศัตรู (ถึงมากที่สุด 20)", 10, 550); G.DrawString ("R: การกู้คืนตำแหน่ง; Q: เต็มไปด้วยเลือด", 10, 530); } @Override /*repaint-> update-> paint* / public void update (กราฟิก g) {// วิธีการที่สร้างขึ้นอัตโนมัติ todo stub super.update (g); if (Offscrennimage == null) Offscrennimage = this.createImage (game_width, game_heigth); กราฟิก goffscrenn = offscrennimage.getGraphics (); // ตั้งค่าสีแปรงหน่วยความจำให้เป็นสีภาพเบื้องหน้าสี C = goffscrenn.getColor (); // บันทึกสีเบื้องหน้าก่อน goffscrenn.setColor (color.green); // ตั้งค่าสีของแปรงหน่วยความจำเป็นสีเขียว goffscrenn.fillrect (0, 0, game_width, game_heigth); // วาดภาพเป็นขนาดของขนาดเกม goffscrenn.setColor (c); // คืนค่าสี g.drawimage (Offscrennimage, 0, 0, null); // วาดภาพที่บันทึกไว้บนสีอินเทอร์เฟซ (Goffscrenn); // เรียกใช้แปรงหน่วยความจำเพื่อทาสีคลาสส่วนตัว PaintThread ใช้งาน Runnable {@Override โมฆะสาธารณะ Run () {// todo วิธีการที่สร้างขึ้นอัตโนมัติในขณะที่ (จริง) {repaint (); // เรียกใช้คำสั่งซื้อ repaint-> update-> ทาสีลอง {thread.sleep (50); // รีเฟรชหน้าจอทุก ๆ 50 มิลลิวินาที} catch (Exception e) {E.printStackTrace (); }}}} /*การตอบสนองของคีย์บอร์ด* / Keymoniton คลาสส่วนตัวขยาย KeyAdapter { /*กดการตอบสนองของแป้นพิมพ์* / @Override โมฆะสาธารณะ Keypressed (KeyEvent E) {// วิธีการที่สร้างอัตโนมัติ mytank.keypressed (e); } /*เพิ่มการตอบสนองของแป้นพิมพ์* / @Override โมฆะสาธารณะ Keylelease (KeyEvent E) {// วิธีการที่สร้างอัตโนมัติแบบอัตโนมัติ stub super.keylease (e); mytank.keyleased (e); -Tank.java
นำเข้า java.awt.color; นำเข้า java.awt.graphics; นำเข้า java.awt.image นำเข้า java.awt.rectangle; นำเข้า java.awt.event.keyevent; นำเข้า java.util.list; นำเข้า Java.util.random; y; // รถถังประสานงานส่วนตัว int oldx, oldy; // Tank ก่อนหน้าพิกัดสาธารณะคงที่ int สุดท้าย whith = 30; // ความกว้างของถังสาธารณะคงที่สุดท้าย int higth = 30; // Tank High Public Static Final Int XSPEED = 5; // ความยาวทิศทางการเคลื่อนไหวความเร็วสาธารณะคงที่ int yspeed = 5; // longarogue movement ความเร็วสีส่วนตัว; // ถังสีบูลีนส่วนตัว bl = false, bu = false, br = false, bd = false; // ค่าควบคุมสี่ทิศทาง enum ทิศทาง {l, lu, u, ru, r, rd, d, ld, stop}; // การเคลื่อนไหวของแปดทิศทางประกอบด้วยค่าสี่ทิศทางทิศทางทิศทางส่วนตัว dir = direction.top; // ทิศทางการส่งออกทิศทางส่วนตัว ptdir = direction.d; // ทิศทางดั้งเดิมของ BOOLEAN BOOLEAN ส่วนตัว // ตัดสินบูลีนส่วนตัวค่ายส่วนตัวของรถถัง Live = True; // ตัดสินว่ารถถังยังมีชีวิตอยู่แบบสุ่มแบบคงที่ส่วนตัว r = new Random (); // ตั้งค่าตัวแปรค่าสุ่มตัวแปรส่วนตัวแบบคงที่ขั้นตอน int = r.nextint (12) +3; // ข้าศึกรถถังการเคลื่อนไหวแบบสุ่มขั้นตอน 3-14 INT LIFE ส่วนตัว = 100; // ปริมาตรสุขภาพ bloodbar ส่วนตัว bb = New Bloodbar (); // cleck // imageicon icon = new imageicon ("res // mytank.jpg"); // imageicon icon2 = imageicon ใหม่ ("res // enemytank.jpg"); // image image = icon.getimage (); // image image2 = icon2.getimage (); TankClient ส่วนตัว; // การอนุญาตคลาสหลักถังสาธารณะ (int x, int y, บูลีนดี, สีสี) {super (); this.x = x; this.y = y; this.color = color; this.good = ดี; } ถังสาธารณะ (int x, int y, บูลีนดี, สีสี, ทิศทาง Dir, tankclient tc) {this (x, y, ดี, สี); this.dir = dir; this.tc = tc; } /*รับ Tank Health* / Public Int GetLife () {return Life; } /*ตั้งค่า Tank Health* / Public Void SetLife (int Life) {this.life = Life; } /*รับ Tank Camp* / Public Boolean Isgood () {return Good; } /*ตั้งค่าค่ายรถถัง* / โมฆะสาธารณะ setGood (บูลีนดี) {this.good = ดี; } /*รับสถานะการอยู่รอดของรถถัง* / บูลีนสาธารณะ iSlive () {return live; } /*ตั้งค่าสถานะการอยู่รอดของรถถัง* / โมฆะสาธารณะ setlive (บูลีนสด) {this.live = live; } /*วาด Tank* / Public Void Draw (กราฟิก g) {if (! live) {ถ้า (! ดี) {tc.tanks.remove (นี่); // ลบในชุดเมื่อถังข้าศึกตาย // tc.tanks.add (รถถังใหม่ (R.Neextint (700), R.Neextint (500), false, color.blue, direct.d, this.tc)); } กลับ; } /*บันทึกสีแปรงก่อนหน้าก่อนและคืนค่าสีแปรงหลังจากวาด* / สี c = g.getColor (); // รับแปรงสีปัจจุบัน G.SetColor (สี); // ตั้งค่าสีแปรงเป็นสีแดง/*วาดถัง*/g.filloval (x, y, whith, สูง); /*สองวิธีในการวาดศัตรูและรถถัง US ใช้รูปภาพหรือสีที่เพิ่มก่อนหน้านี้เพื่อแยกความแตกต่าง*/// ถ้า (ดี) // G.DrawImage (Image, X, Y, Whith, High, Null); // else // g.drawimage (image2, x, y, whith, สูง, null); ถ้า (ดี) bb.draw (g); // ถังของเราดึงแถบเลือด G.SetColor (color.black); /*วาดกระบอกปืนผ่านทิศทางของกระบอกปืน*/สวิตช์ (ptdir) {case l: g.drawline (x+tank.whith/2, y+tank.higth/2, x, y+tank.higth/2); หยุดพัก; กรณี lu: g.drawline (x+tank.whith/2, y+tank.higth/2, x, y); หยุดพัก; กรณี ru: g.drawline (x+tank.whith/2, y+tank.higth/2, x+tank.whith/2, y); หยุดพัก; กรณี r: g.drawline (x+tank.whith/2, y+tank.higth/2, x+tank.whith, y+tank.higth/2); หยุดพัก; Case RD: G.Drawline (x+tank.whith/2, y+tank.higth/2, x+tank.whith, y+tank.higth); หยุดพัก; กรณี D: G.Drawline (x+tank.whith/2, y+tank.higth/2, x, y+tank.higth); หยุดพัก; } G.SetColor (C); // คืนค่าการย้ายสีแปรง (); // ย้าย}/*การตรวจสอบแป้นพิมพ์; คีย์*/ โมฆะสาธารณะคีย์กด (KeyEvent E) {int key = e.getKeyCode (); // บันทึกคีย์ที่ฟังโดยคีย์บอร์ดเป็นจำนวนเต็ม/*คีย์บอร์ดรถถังมือถือ*/สวิตช์ (คีย์) {/*ย้ายคีย์*/เคส KeyEvent.vk_up: bu = true; หยุดพัก; Case KeyEvent.vk_down: bd = true; หยุดพัก; Case KeyEvent.vk_right: br = true; หยุดพัก; Case KeyEvent.vk_left: bl = true; หยุดพัก; } การตั้งค่า (); } /*การตรวจสอบแป้นพิมพ์; ยกคีย์*/ โมฆะสาธารณะ Keylelease (KeyEvent E) {int key = e.getKeyCode (); // บันทึกคีย์ที่ฟังโดยแป้นพิมพ์เป็นจำนวนเต็ม/*แป้นพิมพ์ย้ายถัง*/สวิตช์ (คีย์) {เคส KeyEvent.vk_up: bu = false; หยุดพัก; Case KeyEvent.vk_down: bd = false; หยุดพัก; Case KeyEvent.vk_right: br = false; หยุดพัก; Case KeyEvent.vk_left: BL = FALSE; หยุดพัก; Case KeyEvent.vk_z: // กระสุนเดี่ยวถ้า (สด) Fire (); หยุดพัก; Case KeyEvent.vk_f2: // การฟื้นคืนชีพของเราถ้า (! this.live) {this.live = true; this.setLife (100); } หยุดพัก; Case KeyeVent.vk_f3: // การฟื้นคืนชีพของ Enemesis Fuhuo (); หยุดพัก; Case KeyEvent.vk_a: // ขีปนาวุธ Invincible Superfire (); หยุดพัก; Case KeyEvent.vk_q: // กู้คืนถ้า (this.live) this.life = 100; หยุดพัก; Case KeyEvent.vk_e: // ปล่อยเลือดลิ่ม tc.b.fh (); หยุดพัก; /*กู้คืนรหัสตำแหน่ง*/ เคส keyevent.vk_r: x = 50; y = 50; หยุดพัก; } การตั้งค่า (); // ทิศทางการแต่งเพลง}/*ทิศทางการเคลื่อนไหวขององค์ประกอบ*/void steamentirection () {ถ้า (bl &&! bu &&! br &&! bd) dir = direction.l; อย่างอื่นถ้า (bl && bu &&! br &&! bd) dir = direction.lu; อย่างอื่นถ้า (! bl && bu &&! bd) dir = direction.u; อย่างอื่นถ้า (! bl && bu && br &&! bd) dir = direction.ru; อย่างอื่นถ้า (! bl &&! bu && br &&! bd) dir = direction.r; อย่างอื่นถ้า (! bl &&! bu && br && bd) dir = direction.rd; อย่างอื่นถ้า (! bl &&! bu &&! br && bd) dir = direction.d; อย่างอื่นถ้า (! bl &&! bu &&! br && bd) dir = direction.ld; อย่างอื่นถ้า (! bl &&! bu &&! bd) dir = direction.stop; } โมฆะย้าย () {// ย้าย/*บันทึกตำแหน่งของขั้นตอนก่อนหน้า*/oldx = x; เก่า = y; สวิตช์ (dir) {case l: x- = xspeed; หยุดพัก; กรณี lu: x- = xspeed; y- = yspeed; หยุดพัก; กรณี u: y- = yspeed; หยุดพัก; กรณี ru: x+= xspeed; y- = yspeed; หยุดพัก; กรณี r: x+= xspeed; หยุดพัก; Case RD: x+= xspeed; y+= yspeed; หยุดพัก; กรณี d: y+= yspeed; หยุดพัก; กรณี LD: x- = xspeed; y+= yspeed; หยุดพัก; กรณี LD: x- = xspeed; y+= yspeed; หยุดพัก; กรณีหยุด: ทำลาย; } /*Judge Tank Movement ออกจากขอบเขต (ขอบเขตเกม)* / ถ้า (x <5) x = 5; ถ้า (y <25) y = 25; if (x+whith> tc.game_width-5) x = tc.game_width-whith-5; if (y+higth> tc.game_heigth-5) y = tc.game_heigth-higth-5; ถ้า (dir! = direction.stop) // ถ้าถังไม่อยู่กับที่ให้เปลี่ยนทิศทางของบาร์เรล ptdir = dir; /*ถังข้าศึกเคลื่อนที่โดยอัตโนมัติ*/ ถ้า (! ดี) {ทิศทาง [] dirs = direction.values (); // ตั้งค่าตัวแปรทิศทางเป็นอาร์เรย์ถ้า (ขั้นตอน == 0) {step = r.nextint (12) +3; // การเคลื่อนไหวแบบสุ่มขั้นตอน int randomnumber = r.nextint (dirs.length); // ทิศทางการเคลื่อนไหวแบบสุ่ม dir = dirs [randomNumber]; } ขั้นตอน-; ถ้า (r.nextint (40)> 30) this.fire (); // กระสุนถูกยิงแบบสุ่ม}}/*การฟื้นคืนชีพของถังศัตรู*/โมฆะสาธารณะ fuhuo () {ถ้า (tc.tanks.size () <20) ในขณะที่ (จริง) {int x = r.nextint (700); int y = r.nextint (500); Tank t = ใหม่ถัง (x, y, false, color.blue, direction.d, tc); /*หากถังเกิดขึ้นกับผนังตำแหน่งการสุ่มอีกครั้งจนกว่าจะไม่ซ้อนทับถังใหม่จะถูกเพิ่มลงในชุด*/ if (t.getRect (). intersects (tc.wall1.getRect ()) || t.getRect () intersects (tc.wall2 || t.getRect (). intersects (tc.wall4.getRect ())) {ดำเนินการต่อ; } else {tc.tanks.add (t); หยุดพัก; }}}/*การเปิดตัวกระสุน*/โมฆะสาธารณะไฟ () {int x = this.x + whith/2 - missile.whith/2; // ควบคุมทิศทางกระสุนไปที่กลางถัง int y = this.y + higth/2 - missile.higth/2; tc.missiles.add (ขีปนาวุธใหม่ (ptdir, สี, x, y, ดี, tc)); // สร้างคลาสกระสุนใหม่เพื่อเข้าร่วมคอลเลกชันกระสุน} /*การชน; รับช่วงของถัง*/ สี่เหลี่ยมผืนผ้าสาธารณะ getRect () {ส่งคืนสี่เหลี่ยมผืนผ้าใหม่ (x, y, whith, higth); } /*ตำแหน่งขั้นตอนก่อนหน้าของใบเสร็จรับเงิน* / โมฆะส่วนตัวอยู่ () {x = oldx; y = เก่า; } /*หากคุณตีกำแพงให้โทรหาวิธีการพักและกลับไปที่ตำแหน่งขั้นตอนก่อนหน้า* / บูลีนสาธารณะ hitwall (ผนัง w) {ถ้า (this.live && this.getRect (). ตัดกัน (w.getRect ())) {this.stay (); กลับมาจริง; } return false; } /*เหตุการณ์การชนรถถัง* / บูลีนสาธารณะ hittanks (รายการ <Tank> รถถัง) {สำหรับ (int i = 0; i <tanks.size (); i ++) {tank t = tanks.get (i); ถ้า (นี่! = t) {// คุณไม่สามารถชนกับตัวเอง/*ถ้าคุณชนกันกลับไปที่ตำแหน่งก่อนหน้า*/ถ้า (this.live && t.islive () && this.getRect (). ตัด (t.getRect ())) {this.stay (); T.Stay (); กลับมาจริง; }} return false; } /*ฟังก์ชั่นการปล่อยก๊าซที่มีทิศทางไฟ* / ไฟขีปนาวุธสาธารณะ (ทิศทาง DIR) {ถ้า (ชีวิต) คืนค่า null; int x = this.x+whith/2-missile.whith/2; int y = this.y+higth/2-missile.higth/2; ขีปนาวุธ m = ขีปนาวุธใหม่ (dir, สี, x, y, ดี, this.tc); tc.missiles.add (m); กลับ M; } /*Superfire Missile* / Private Void Superfire () {Direction [] dirs = direction.values (); สำหรับ (int i = 0; i <8; i ++) {fire (dirs [i]); // การขี่จักรยานแปดทิศทาง}}/*เพิ่มคลาสลิ่มเลือด*/คลาสส่วนตัว bloodbar {/*วาดแถบเลือด*/การวาดโมฆะสาธารณะ (กราฟิก g) {color c = g.getColor (); G.SetColor (color.Red); G.DrawRect (X, Y-10, Whith, 10); int w = whith*Life/100; G.FillRect (X, Y-10, W, 10); G.SetColor (C); }} /*วิธีการกินเลือด* / บูลีนสาธารณะ eatblood (เลือด b) {ถ้า (this.live && b.islive () && this.isgood () && this.getRect (). intersects (b.getRect ()) {this.setLife (100); B.SetLive (เท็จ); กลับมาจริง; } if (this.getRect (). intersects (tc.wb.getRect ()))) this.life = 100; กลับเท็จ; -Missile.java
นำเข้า java.awt.color; นำเข้า java.awt.graphics; นำเข้า java.awt.rectangle; นำเข้า java.util.list; ขีปนาวุธระดับสาธารณะ { /*ข้อมูลกระสุน* / tank.direction dir; // Bullet Direction Color C; // Bullet Color int x, y; // Bullet ตำแหน่งสาธารณะคงที่ int xspeed = 15; // ความยาวการเคลื่อนไหวความเร็วสาธารณะคงที่ int yspeed = 15; // ความยาวการเคลื่อนไหวความเร็วสาธารณะคงที่ int whith = 10; // กระสุนความกว้างสาธารณะคงที่สุดท้าย int higth = 10; // Bullet Bullet High Private Boolean Live = true; // ตัดสินความอยู่รอดของ Bullet Private Boolean Good; // ตัดสินกระสุนและค่ายส่วนตัว tankclient tc; // การอนุญาตชั้นเรียนหลักขีปนาวุธสาธารณะ (tank.direction dir, color c, int x, int y) {super (); this.dir = dir; this.x = x; this.y = y; this.c = c; } ขีปนาวุธสาธารณะ (tank.direction dir, color c, int x, int y, บูลีนดี, tankclient tc) {this (dir, c, x, y); this.good = ดี; this.tc = tc; } /*รับความอยู่รอดของกระสุน* / บูลีนสาธารณะ islive () {return live; } /*ตั้งค่าการอยู่รอดของกระสุน* / โมฆะสาธารณะ setlive (บูลีนสด) {this.live = live; } โมฆะสาธารณะวาด (กราฟิก g) { /*ถ้ากระสุนตายให้ลบกระสุนในคอลเลกชันกระสุน* / ถ้า (! สด) {tc.missiles.remove (นี่); // ลบผลตอบแทนในคอลเลกชัน; } /*บันทึกสีแปรงก่อนหน้าก่อนและคืนค่าสีแปรงหลังจากวาด* / สี d = g.getColor (); // รับแปรงสีปัจจุบัน G.SetColor (C); // ตั้งค่าสีแปรงเป็นสีแดง/*พิมพ์กระสุน*/g.filloval (x, y, whith, สูง); G.SetColor (D); // คืนค่าการย้ายสีแปรง (); // ย้าย} โมฆะสาธารณะย้าย () {/*ตัดสินทิศทางการเคลื่อนไหวและตำแหน่งของถัง*/สวิตช์ (dir) {กรณี l: x- = xspeed; หยุดพัก; กรณี lu: x- = xspeed; y- = yspeed; หยุดพัก; กรณี u: y- = yspeed; หยุดพัก; กรณี ru: x+= xspeed; y- = yspeed; หยุดพัก; กรณี r: x+= xspeed; หยุดพัก; Case RD: x+= xspeed; y+= yspeed; หยุดพัก; กรณี d: y+= yspeed; หยุดพัก; กรณี LD: x- = xspeed; y+= yspeed; หยุดพัก; กรณีหยุด: ทำลาย; } /*ตัดสินสถานการณ์ขาออกของกระสุน หากขาออกกระสุนจะตายให้ลบในคอลเลกชันกระสุน*/ ถ้า (x <0 || y <0 || x> tankclient.game_width || y> tankclient.game_heigth) live = false; } /*การชน; รับช่วงของกระสุน*/ สี่เหลี่ยมผืนผ้าสาธารณะ getRect () {ส่งคืนสี่เหลี่ยมผืนผ้าใหม่ (x, y, whith, higth); } /*กระบวนการชนระหว่างกระสุนและถัง* /บูลีนสาธารณะ hittank (ถัง t) { /*ถ้ากระสุนและถังอยู่ในช่วงเดียวกันกระสุนและถังจะตายในเวลาเดียวกัน; และกระสุนสามารถฆ่ารถถังของฝ่ายตรงข้ามเท่านั้น*/ถ้า (this.live && this.getRect (). ตัด (t.getRect ()) && t.islive () && this.good! = t.isgood () {ถ้า (t.isgood (t.isgood () T.SetLife (T.GetLife ()-20); if (t.getLife () <= 0) t.setLive (เท็จ); } else {// bad tank t.setLive (false); // Death} this.live = false; // Bullet Death tc.explode.add (Explode ใหม่ (x, y, tc)); // การระเบิดใหม่เพิ่มชุดกลับจริง; } return false; } /*การยุบรถถังชุดเพื่อตัดสินการชนกันกระสุน* / บูลีนสาธารณะ hittanks (รายการ <tank> รถถัง) {สำหรับ (int i = 0; i <tanks.size (); i ++) {ถ้า (hittank (tanks.get (i))) กลับจริง; } return false; } /*กระบวนการชนระหว่างกระสุนและผนัง* / บูลีนสาธารณะ hitwall (ผนัง w) { /*ถ้าช่วงของกระสุนและผนังซ้อนทับกับการตายของกระสุน* / ถ้า (this.live && this.getRect () ตัดกัน (w.getRect ())) {this.live = false; // Bullet Death กลับมาเป็นจริง } return false; - Wall.java
นำเข้า java.awt.graphics; นำเข้า java.awt.rectangle; ผนังระดับสาธารณะ { /*ข้อมูลผนัง* / int x, y, w, h; // ตำแหน่งและความกว้างและความสูง tankclient ส่วนตัว TC; // การอนุญาตคลาสหลักผนังสาธารณะ (int x, int y, int w, int h, tankclient tc) {super (); this.x = x; this.y = y; this.w = w; this.h = h; this.tc = tc; } /*รับขอบเขตของผนัง* / สี่เหลี่ยมผืนผ้าสาธารณะ getRect () {ส่งคืนสี่เหลี่ยมผืนผ้าใหม่ (x, y, w, h); } /*วาดผนัง* / โมฆะสาธารณะวาด (กราฟิก g) {g.fillrect (x, y, w, h); -ระเบิด. java
นำเข้า java.awt.color; นำเข้า java.awt.graphics; คลาสสาธารณะระเบิด { /*แอตทริบิวต์การระเบิดของรถถัง* / int x, y; // ตำแหน่งการระเบิดบูลีนส่วนตัว Live = true; // มีขั้นตอนการระเบิด int = 0; // การควบคุมเวลาการระเบิด int [] เส้นผ่านศูนย์กลาง = ใหม่ int [] {4, 7, 12, 18, 26, 32, 49, 56, 65, 77, 80, 50, 40, 30, 14, 6}; // ช่วงการระเบิด // การอนุญาตระดับคลาสหลักระเบิดสาธารณะ (int x, int y, tankclient tc) {super (); this.x = x; this.y = y; this.tc = tc; } /*วาดระเบิด* / โมฆะสาธารณะวาด (กราฟิก g) {ถ้า (! สด) กลับ; // หากสถานะการตายของการระเบิดไม่สิ้นสุด/*หากเวลาการระเบิดสิ้นสุดลงการระเบิดจะไม่มีอยู่และลบในชุด*/ถ้า (ขั้นตอน == diameter.length) {live = false; // การระเบิดขั้นตอนการตาย = 0; // เวลาขั้นตอนคือ 0 tc.explode.remove (นี่); // ลบผลตอบแทนในชุด; } /*วาดระเบิด* / color c = g.getColor (); G.SetColor (color.orange); G.Filloval (X, Y, เส้นผ่านศูนย์กลาง [ขั้นตอน], เส้นผ่านศูนย์กลาง [ขั้นตอน]); G.SetColor (C); ขั้นตอน ++; -เลือด java
นำเข้า java.awt.color; นำเข้า java.awt.graphics; นำเข้า java.awt.rectangle; นำเข้า java.util.random; เลือดระดับสาธารณะ {/* ข้อมูลลิ่มเลือด*/ int x, y, w, h; // การอนุญาตคลาสหลักบูลีนส่วนตัว live = true; // เลือดล้นการอยู่รอดส่วนตัวคงที่แบบคงที่ r = new random (); // ตั้งค่าตัวแปรค่าสุ่ม/* รับสถานะการอยู่รอดของก้อนเลือด*/ บูลีนสาธารณะ iSlive () {return live; } /* ตั้งค่าสถานะการอยู่รอดของก้อนเลือด* / โมฆะสาธารณะ setlive (บูลีนสด) {this.live = live; } /*ค่าเริ่มต้นของตำแหน่งลิ่มเลือดเป็นแบบสุ่มค่า* / เลือดสาธารณะ () {x = r.nextint (600) +100; y = r.nextint (400) +100; w = h = 15; } /*วาดลิ่มเลือด* / โมฆะสาธารณะวาด (กราฟิก g) {ถ้า (สด) กลับมา; สี c = g.getColor (); G.SetColor (color.magenta); G.FillRect (X, Y, W, H); G.SetColor (C); } /*ปล่อยลิ่มเลือด* / โมฆะสาธารณะ fh () {ถ้า (สด) {x = r.nextint (600) +100; y = r.nextint (400) +100; live = true; }} /*รับช่วงเลือดลิ่ม* / สี่เหลี่ยมผืนผ้าสาธารณะ getRect () {ส่งคืนสี่เหลี่ยมผืนผ้าใหม่ (x, y, w, h); -ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น