استخدم المجموعات ، التقلبات ، المواضيع ونقاط المعرفة الأخرى في لغة Java لكتابة لعبة حرب الدبابات.
(1) ارسم مبدأ الدبابات العدو والولايات المتحدة:
هناك متغير نوع منطقي جيد داخل فئة الخزان. تستخدم للحكم على معسكر دبابة. عند إنشاء كائن دبابة ، يتم تمرير قيمة الخير في طريقة بناء فئة الخزان. عند رسم الدبابات ، احكم على قيمة الخير وتميز لون العدو والولايات المتحدة ؛
(2) مبدأ حركة الخزان:
يتم كتابة حدث استجابة لوحة مفاتيح لوحة المفاتيح في فئة الخزان ، ويتم تسجيل المفاتيح المراقبة لأعلى وأسفل واليسرى واليمين ، ويتم تصنيع المتغيرات في ثمانية اتجاهات من حركة الخزان. بعد ذلك ، يمكن إجراء التغييرات المقابلة لقيم إحداثيات الخزان x و y في كل اتجاه لتحقيق حركة الخزان لدينا. تتحرك خزانات العدو تلقائيًا ، وتداول اتجاه حركة خزان العدو بشكل عشوائي من خلال رقم عشوائي ، وإخراج عدد مرات كل حركة بشكل عشوائي. يتيح الجمع بين قيمتين عشوائيتين حركة خزانات العدو.
(3) مبدأ إطلاق الخزانات الرصاص:
من خلال مراقبة لوحة المفاتيح ، بعد اكتشاف أمر إطلاق النار ، أضف فئة رصاصة إلى مجموعة فئة الرصاص من الفئة الرئيسية. نقل اتجاه برميل البنادق ، وموقف الخزان ، ومعسكر الخزان إلى الرصاص. في طريقة رسم الطلاء الرئيسية ، سيتم تدوير مجموعة الرصاص. إذا كانت هناك رصاصات في المجموعة ، ارسمها. هذا يتيح إطلاق الرصاص.
(4) مبدأ الاصطدام في الدبابات والرصاص والجدران:
في فئة الحائط من نوع الخزان من نوع الخزان ، طريقة GetRect للحصول على نطاقها الخاص ، ثم إجراء اكتشاف التصادم المقابل في كل مرة يتم فيها رسم الخزان والرصاصة (هناك طرق للتصادم مع الجدار والخزان خارج الخزان في الخزان ، وفي الرصاصة ، هناك طرق للتصادم مع الجدار والخزان.). إذا كان نطاق الذات والكائن الذي لا ينبغي تصادمه ، فهذا يعني أن الكائنين يصطدمان.
(5) مبدأ الدورة الدموية للدبابات:
إذا تصطدم جلطات الدم بخزاننا ، فسوف تموت جلطات الدم ، وسيتم استرداد جلطات الدم بالكامل.
(6) مبدأ قيامة الخزان:
بعد اكتشاف ترتيب القيامة لخزاننا عن طريق مراقبة لوحة المفاتيح ، إذا كان خزاننا في حالة ميتة ، فسيتم تغيير حالة مخزون الخزانات لدينا إلى حي وسيتم استعادة حجم الدم في خزاننا إلى الصحة الكاملة.
أفكار البرمجة:
تفتح فكرة البرمجة الخاصة بحرب الخزان خيطًا في الفصل الرئيسي ، ولا تدور في 50 ميلي ثانية لرسم الطريقة (ارسم كل شيء في الواجهة بأكملها). وتشمل الأشياء المرسومة خزانات العدو (تمييز اللون) ، الرصاص ، الجدران ، جلطات الدم ، والانفجارات. في المجموع ، تم كتابة عدة فئات: خزانات الدبابات ، الرصاص الصاروخي ، جدران الجدران ، جلطات الدم ، والفصول الرئيسية للدبابات. في كل فصل ، هناك طريقة رسم مكتوبة لتحقيق وظيفة الرسم لسمات هذه الفئة. يوجد حدث للاستماع إلى لوحة المفاتيح في الفصل الرئيسي يسمى حدث الاستماع إلى لوحة المفاتيح لفئة الخزان هذه. من خلال مراقبة لوحة المفاتيح ، يتم تحديد أن حركة الخزان المقابلة ، بينما يتحرك خزان العدو عشوائيًا. وفي كل مرة يتم تحديث التحديث ، يتم استدعاء طرق التصادم المختلفة لتحديد موقف بعض الكائنات التي لا ينبغي تصادمها. إن إنشاء كل كائن ، مثل الرصاص ، هو إضافة فئة رصاصة جديدة إلى مجموعة من فئة الرصاص بعد تشغيلها. عند الرسم ، حدد الرقم في المجموعة للرسم. إذا كان الخزان خارج الحدود أو يقتل الخزان ، فسيتم حذفه في المجموعة. فئات أخرى متشابهة أيضًا ، لذلك لن أخوض في التفاصيل.
كل خطوة في الكود لها شرح مقابل.
tankclient.java
استيراد java.awt.color ؛ استيراد java.awt.font ؛ استيراد java.awt.graphics ؛ استيراد java.awt.image ؛ استيراد java.awt.event.keyadapter ؛ import java.awt.event.keyevent ؛ import java.awt.event.windowaDapter ؛ java.util.arraylist ؛ import java.util.list ؛ import javax.swing.jframe ؛ public class tankclient يمتد Jframe { / ** * param args * / image OffsCrennImage = null ؛ // تخزين صورة ذاكرة مزدوجة المخزن المؤقت/*حجم اللعبة*/عام الثابت النهائي int game_width = 800 ؛ // واجهة العرض العامة الثابتة النهائية int game_heigth = 600 ؛ . // قائمة فئة الخزانات الخاصة بنا <Missile> Massiles = New ArrayList <Mishile> () ؛ // مجموعة قائمة الرصاص <explode> exploit = new ArrayList <Fephlode> () ؛ // قائمة مجموعة الانفجار <Cans> tanks = new ArrayList <anch> () ؛ // Tank Set Wall1 = جدار جديد (150،200،20،300 ، هذا) ؛ // الجدار 1 Wall2 = جدار جديد (250،500،300،20 ، هذا) ؛ // Wall 2 Wall3 Wall3 = جدار جديد (650،200،20،300 ، هذا) ؛ // Wall 2 Wall4 = جدار جديد (250،300،300،20 ، هذا) ؛ // WALL 2 WALL WB = NEW WALL (750،550،40،40 ، this) ؛ // Wall2 Blood B = New Blood () ؛ // Flood Class Public Static Void Main (String [] args) {// todo method method method method tanclient tc = new tankclient () ؛ tc.lauchframe () ؛ } private void lauchframe () {// todo method method method tuto for (int i = 0 ؛ i <10 ؛ i ++) {tanks.add (tank new (50+40*(i+1) ، 50 ، false. } this.setLocation (100 ، 100) ؛ // window point point this.setsize (game_width ، game_heigth) ؛ // نافذة الحجم الأولي this.settitle ("tankwar") ؛ // اسم النافذة/*الاستماع إلى نافذة*/this.addwIndOwListener (new windowadapter () {Override/*run بعد خروج النقطة من الشوكة*/public void windowclosing (windowevent e) {// to to todo method method system.exit (0) ؛ // exit}}) ؛ this.addKeyListener (New Keymoniton ()) ؛ // قم بتعيين لوحة المفاتيح للاستماع إلى this.setVisible (true) ؛ // اضبط النافذة لعرض this.setResible (false) ؛ // قم بتعيين النافذة لعدم تغيير حجم this.getContentPane (). الانتكاس (color.green) ؛ // قم بتعيين اللون الأمامي النافذة على مؤشر ترابط أخضر جديد (جديد paintthread ()). start () ؛ // ابدأ تشغيل فئة PaintThread Run} Override Public Void Paint (Graphics G) {// TODO Method Method Method Cub // Graphics هي فئة الفرشاة 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 (ب) ؛ mytank.hitwall (wall1) ؛ mytank.hitwall (wall2) ؛ mytank.hitwall (wall3) ؛ mytank.hitwall (wall4) ؛ /*Cycle Bullet Collection*/ for (int i = 0 ؛ i <massiles.size () ؛ i ++) {missile m = massiles.get (i) ؛ // احصل على الرصاصة الحالية M.Hittanks (الدبابات) ؛ // رصاصتك الخاصة تقتل دبابة العدو M.Hitwall (Wall1) ؛ // Bullet and Wall M.Hitwall (Wall2) ؛ M.Hitwall (Wall3) ؛ M.Hitwall (Wall4) ؛ M.Thank (Mytank) ؛ // رصاصة العدو تضرب دبابة M.Draw (G) ؛ // draw bullet} لـ (int i = 0 ؛ i <explore.size () ؛ i ++) {exploit.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(new font ("宋体" ، font.bold ، 20)) ؛ G.DrawString ("عدد الصواريخ:"+massiles.size () ، 10 ، 50) ؛ // show g.drawString ("explode count:"+explode.size () ، 10 ، 80) ؛ // show g.drawString ("Tanks Count:"+tanks.size () ، 10 ، 110) ؛ G.DrawString ("MyTank Life:"+MyTank.getLife () ، 10 ، 130) ؛ G.DrawString ("استرداد الدم:" ، 750 ، 540) ؛ G.DrawString ("اتجاه حركة مفتاح الدليل ؛ ه: إطلاق الدم السريع" دم سريع "، 10 ، 590) ؛ G.DrawString ("Z: Launch Dongfeng-31 ؛ A: إطلاق Dongfeng-41 ؛" ، 10 ، 570) ؛ G.DrawString ("F2: القيامة ؛ F3: قيامة العدو (إلى أكثر من 20)" ، 10 ، 550) ؛ G.DrawString ("R: Restore ؛ Q: مليء بالدم" ، 10 ، 530) ؛ } Override /*Repaint-> update-> paint* / public void update (Graphics g) {// todo method method method super.update (g) ؛ if (OffScrennimage == null) OffScrennImage = this.createImage (game_width ، game_heigth) ؛ Graphics goffscrenn = OffScrennimage.getGraphics () ؛ // قم بتعيين لون فرشاة الذاكرة على لون الصورة المقدمة C = goffscrenn.getColor () ؛ // احفظ اللون الأمامي أولاً ، goffscrenn.setColor (color.green) ؛ // قم بتعيين لون فرشاة الذاكرة على Green Goffscrenn.fillRect (0 ، 0 ، game_width ، game_heigth) ؛ // ارسم الصورة باعتبارها حجم حجم اللعبة Goffscrenn.setColor (C) ؛ // استعادة اللون g.drawImage (OffsCrennimage ، 0 ، 0 ، null) ؛ // ارسم الصورة المحفوظة على الطلاء الواجهة (Goffscrenn) ؛ . // RUN ORDER REPAINT-> UPDATE-> paint try {thread.sleep (50) ؛ // تحديث الشاشة كل 50 مللي ثانية} catch (استثناء e) {eprintstacktrace () ؛ }}}} /*استجابة لوحة المفاتيح* / فئة خاصة keymoniton يمتد KeyAdapter { /*اضغط على لوحة المفاتيح* / Override public void keypressed (keyevent e) {// todo method method method cub super.keypression (e) ؛ mytank.keypressed (e) ؛ } /*قم برفع استجابة لوحة المفاتيح* / Override public void keyreleSeped (keyevent e) {// todo method method method tuto super.keyreleseped (e) ؛ mytank.keyreleseped (e) ؛ }}}Tank.java
استيراد java.awt.color ؛ استيراد java.awt.graphics ؛ استيراد java.awt.image ؛ استيراد java.awt.rectangle ؛ استيراد java.awt.event.keyevent ينسق الخاص int oldx ، oldy ؛ // Tank Previpinates Public Static Final Whith = 30 ؛ // Tank Width Public Static Final Higth = 30 ؛ // Tank High Public Static Final int xspeed = 5 ؛ // طول الحركة الاتجاهية السرعة العامة الثابتة int yspeed = 5 ؛ // Longarogue Movement SPEED Color Private Color ؛ // tank color boolean bl = false ، bu = false ، br = false ، bd = false ؛ // أربع قيم التحكم في الاتجاه تعداد الاتجاه {l ، lu ، u ، ru ، r ، rd ، d ، ld ، stop} ؛ // تتكون حركة ثمانية اتجاهات من أربعة اتجاهات قيم الاتجاه الخاص dir = direction.stop ؛ // اتجاه الإخراج الاتجاه الخاص ptdir = direction.d ؛ // الاتجاه الأصلي لمدفع المنطق الخاص ؛ . . // عدو دبابة الحركة العشوائية خطوات 3-14 Private Int Life = 100 ؛ // Health Goote Private Bloodbar BB = New Bloodbar () ؛ // cleck // imageicon icon = new imageicon ("res // mytank.jpg") ؛ // imageicon icon2 = new imageicon ("res // inemytank.jpg") ؛ // Image Image = icon.getImage () ؛ // image2 = icon2getimage () ؛ Tankclient الخاص TC ؛ // أذونات الفئة الرئيسية الخزان العام (int x ، int y ، جيد ، لون اللون) {super () ؛ this.x = x ؛ this.y = y ؛ this.color = اللون ؛ this.good = جيد ؛ } الخزان العام (int x ، int y ، جيد ، لون اللون ، اتجاه الاتجاه ، tankclient tc) {this (x ، y ، good ، color) ؛ this.dir = dir ؛ this.tc = tc ؛ } /*GET TANK Health* / public int getLife () {return life ؛ } /*set tank health* / public void setlife (int life) {this.life = life ؛ } /*get tank camp* / public boolean isgood () {return Good ؛ } /*Set Tank Camp* / public void setgood (boolean good) {this.good = good ؛ } /*احصل على حالة بقاء الدبابة* / public boolean isLive () {return live ؛ } /*اضبط حالة بقاء الخزان* / public void setLive (Boolean Live) {this.live = live ؛ } /*draw tank* / public void draw (Graphics g) {if (! live) {if (! good) {tc.tanks.remove (this) ؛ // حذف في المجموعة عندما يموت خزان العدو // tc.tanks.add (دبابة جديدة (R.NextInt (700) ، R.Nextint (500) ، false ، color.blue ، direction.d ، this.tc)) ؛ } يعود؛ } /*احفظ لون الفرشاة السابق أولاً ، واستعادة لون الفرشاة بعد رسم* / color C = G.GetColor () ؛ // احصل على لون الفرشاة الحالي G.SetColor (اللون) ؛ // قم بتعيين لون الفرشاة على الخزان الأحمر/*رسم*/g.filloval (x ، y ، whith ، عالية) ؛ /*طريقتان لرسم الدبابات العدو والولايات المتحدة ، استخدم الصور أو الألوان المضافة مسبقًا لتمييز*/// إذا (جيد) // g.drawimage (الصورة ، x ، y ، whith ، عالية ، فارغة) ؛ // else // g.drawimage (image2 ، x ، y ، whith ، high ، null) ؛ إذا (جيد) bb.draw (g) ؛ // يرسم الخزان الخاص بنا شريط الدم G.SetColor (color.black) ؛ /*ارسم برميل البندقية من خلال اتجاه برميل البندقية*/switch (ptdir) {case l: g.drawline (x+tank.whith/2 ، y+tank.higth/2 ، x ، y+tank.higth/2) ؛ استراحة؛ CASE LU: G.Drawline (x+tank.whith/2 ، y+tank.higth/2 ، x ، y) ؛ استراحة؛ CASE RU: G.Drawline (x+tank.whith/2 ، y+tank.higth/2 ، x+tank.whith/2 ، y) ؛ استراحة؛ Case 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) ؛ // استعادة لون الفرشاة Move () ؛ // Move}/*مراقبة لوحة المفاتيح ؛ مفتاح*/ public void keypressed (keyevent e) {int key = e.getKeyCode () ؛ . استراحة؛ case keyevent.vk_down: bd = true ؛ استراحة؛ case keyevent.vk_right: br = true ؛ استراحة؛ case keyevent.vk_left: bl = true ؛ استراحة؛ } الموجود () ؛ } /*مراقبة لوحة المفاتيح ؛ ارفع المفتاح*/ public void keyreleSever (keyevent e) {int key = e.getKeyCode () ؛ . استراحة؛ case keyevent.vk_down: bd = false ؛ استراحة؛ case keyevent.vk_right: br = false ؛ استراحة؛ case keyevent.vk_left: bl = false ؛ استراحة؛ Case keyevent.vk_z: // bullet single if (live) fire () ؛ استراحة؛ case keyevent.vk_f2: // قيامتنا if (! this.live) {this.live = true ؛ this.setLife (100) ؛ } استراحة؛ CASE keyevent.vk_f3: // eferrection refrection fuhuo () ؛ استراحة؛ Case keyevent.vk_a: // superfire superfire () استراحة؛ case keyevent.vk_q: // استرداد إذا (this.live) this.life = 100 ؛ استراحة؛ case keyevent.vk_e: // reger Blood Clot tc.b.fh () ؛ استراحة؛ /*استعادة مفتاح الموضع*/ case keyevent.vk_r: x = 50 ؛ y = 50 ؛ استراحة؛ } الموجود () ؛ // اتجاه التكوين}/*اتجاه حركة التكوين*/void scareirection () {if (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 ؛ آخر if (! bl &&! bu && br &&! bd) dir = direction.r ؛ آخر إذا (! bl &&! bu && br && bd) dir = direction.rd ؛ آخر إذا (! bl &&! bu &&! br && bd) dir = direction.d ؛ آخر if (! bl &&! bu &&! br && bd) dir = direction.ld ؛ آخر إذا (! bl &&! bu &&! bd) dir = direction.stop ؛ } void move () {// move/*سجل موضع الخطوة السابقة*/oldx = x ؛ oldy = y ؛ Switch (dir) {case l: x- = xspeed ؛ استراحة؛ CASE 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 ؛ استراحة؛ CASE LD: X- = XSPEED ؛ y+= yspeed ؛ استراحة؛ CASE LD: X- = XSPEED ؛ y+= yspeed ؛ استراحة؛ توقف القضية: كسر. } /*القاضي حركة الخزان خارج الحدود (حدود اللعبة)* / if (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 ؛ if (dir! = direction.stop) // إذا لم يكن الخزان ثابتًا ، فقم بتغيير اتجاه البرميل ptdir = dir ؛ /*يتحرك خزان العدو تلقائيًا*/ if (! جيد) {Direction [] dirs = direction.values () ؛ // قم بتعيين متغير الاتجاه إلى صفيف if (step == 0) {step = r.nextint (12) +3 ؛ // حركة عشوائية خطوة int randomnumber = r.nextint (dirs.length) ؛ // اتجاه حركة عشوائي dir = dirs [randomnumber] ؛ } خطوة--؛ if (R.NextInt (40)> 30) this.fire () ؛ // هل يتم إطلاق القذائف بشكل عشوائي}}/*قيامة دبابة العدو*/public void fuhuo () {if (tc.tanks.size () <20) بينما (صحيح) {int x = r.nextint (700) ؛ int y = r.nextint (500) ؛ الخزان t = خزان جديد (x ، y ، false ، color.blue ، direction.d ، tc) ؛ /*إذا كان الخزان يتزامن مع الجدار ، فقم بإعادة وضع العشوائي حتى لا يتداخل ، يتم إضافة الخزان الجديد إلى المجموعة*/ if (t.getRect (). || t.getRect (). } آخر {tc.tanks.add (t) ؛ استراحة؛ }}}/*إطلاق رصاصة*/public void fire () {int x = this.x + whith/2 - missile.whith/2 ؛ // التحكم في اتجاه الرصاص إلى منتصف الخزان int y = this.y + higth/2 - missile.higth/2 ؛ tc.missiles.add (صاروخ جديد (ptdir ، color ، x ، y ، good ، tc)) ؛ // إنشاء فئة رصاصة جديدة للانضمام إلى Collection} /*Collision ؛ احصل على نطاق الخزان*/ المستطيل العام getRect () {return new Rectangle (x ، y ، whith ، higth) ؛ } /*موضع الخطوة السابقة للإيصال* / private void stay () {x = oldx ؛ y = oldy ؛ } /*إذا قمت بالضغط على الجدار ، فاستدعاء طريقة الإقامة والعودة إلى موضع الخطوة السابقة* / public boolean hitwall (wall w) {if (this.live && this.getRect (). العودة صحيح. } إرجاع خطأ ؛ } /*حدث تصادم الخزان* / hittanks boolean العامة (قائمة <Cant> الدبابات) {for (int i = 0 ؛ i <tanks.size () ؛ i ++) {tank t = tanks.get (i) ؛ if (this! = t) {// لا يمكنك التصادم مع نفسك/*إذا قمت بالتصادم ، فأعود إلى الموضع السابق*/if (this.live && t.islive () && this.getRect (). T.Stay () ؛ العودة صحيح. }} إرجاع خطأ ؛ } /*وظيفة الانبعاثات مع اتجاه النار* / حريق الصواريخ العامة (Direction Dir) {if (! live) return null ؛ int x = this.x+whith/2-missile.whith/2 ؛ int y = this.y+higth/2-missile.higth/2 ؛ الصاروخ M = صاروخ جديد (dir ، color ، x ، y ، good ، this.tc) ؛ tc.missiles.add (M) ؛ العودة م ؛ } /*superfire missile* / private void superfire () {Direction [] dirs = direction.values () ؛ لـ (int i = 0 ؛ i <8 ؛ i ++) {fire (dirs [i]) ؛ // cycling ثمانية اتجاهات}}/*تمت إضافة فئة جلطة الدم*/private class bloodbar {/*draw Blood Bar*/public void draw (Graphics 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) ؛ }} /*طريقة تناول الدم* / boolean public eatblood (Blood b) {if (this.live && b.islive () && this.isgood () && this.getRect (). B.SetLive (false) ؛ العودة صحيح. } if (this.getRect (). يتقاطع (tc.wb.getRect ()))) this.life = 100 ؛ العودة كاذبة }}الصاروخ
استيراد java.awt.color ؛ import java.awt.graphics ؛ استيراد java.awt.Rectangle ؛ استيراد java.util.list ؛ الصاروخ العام { /*bullet data* / tank.direction dir ؛ // اتجاه اتجاه الرصاص C ؛ // bullet color int x ، y ؛ // probet position public static final int xspeed = 15 ؛ // طول حركة السرعة العامة الثابتة int yspeed = 15 ؛ // طول حركة السرعة العامة الثابتة النهائية int whith = 10 ؛ // عرض الرصاصة العامة الثابتة الثابتة int higth = 10 ؛ // Bullet High Private Boolean Live = True ؛ // الحكم على بقاء الرصاصة المنطقية الخاصة ؛ . this.dir = dir ؛ this.x = x ؛ this.y = y ؛ this.c = c ؛ } الصواريخ العامة (Tank.direction dir ، color C ، int x ، int y ، boolean good ، tankclient tc) {this (dir ، c ، x ، y) ؛ this.good = جيد ؛ this.tc = tc ؛ } /*احصل على بقاء الرصاصة* / boolean public Islive () {return live ؛ } /*اضبط بقاء الرصاصة* / public void setLive (Boolean Live) {this.live = live ؛ } public void draw (Graphics g) { /*إذا ماتت الرصاصة ، فقم بحذف الرصاصة في مجموعة الرصاص* / if (! live) {tc.missiles.remove (this) ؛ // حذف العودة في المجموعة ؛ } /*احفظ لون الفرشاة السابق أولاً ، واستعيد لون الفرشاة بعد رسم* / color d = g.getColor () ؛ // احصل على لون الفرشاة الحالي G.SetColor (C) ؛ // قم بتعيين لون الفرشاة على رصاصة طباعة*/g.filloval (x ، y ، whith ، عالية) ؛ G.SetColor (D) ؛ // استعادة Move Move () ؛ // move} public void move () {/*ugne the movement اتجاه الحركة وموضع الخزان*/switch (dir) {case l: x- = xspeed ؛ استراحة؛ CASE 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 ؛ استراحة؛ CASE LD: X- = XSPEED ؛ y+= yspeed ؛ استراحة؛ توقف القضية: كسر. } /*الحكم على الوضع الصادر للرصاصة ؛ إذا كانت الرصاصة خارجًا ، فسيموت الرصاصة ، حذفها في مجموعة الرصاص*/ if (x <0 || y <0 || x> tankclient.game_width || y> tankclient.game_heigth) live = false ؛ } /*الاصطدام ؛ احصل على نطاق الرصاصة*/ المستطيل العام getRect () {return new Rectangle (x ، y ، whith ، higth) ؛ } /*عملية الاصطدام بين الرصاص والدبابات* /Boolean Hittank (Tank T) { /*إذا كانت الرصاصة والدبابة في نفس النطاق ، فسوف تموت الرصاصة والدبابة في نفس الوقت ؛ ويمكن للرصاصة فقط قتل خزان الخصم*/if (this.live && this.getRect (). يتقاطع (t.getRect ()) T.SetLife (T.GetLife ()-20) ؛ if (t.getLife () <= 0) t.setLive (false) ؛ } else {// bad tank t.setLive (false) ؛ // death} this.live = false ؛ // bullet death tc.explode.add (explode (x ، y ، tc)) ؛ // انفجار جديد أضف مجموعة الإرجاع true ؛ } إرجاع خطأ ؛ } /*مجموعات خزان الانهيار للحكم على تصادم الرصاص* / hittanks المنطقي العام (قائمة <Cank> الدبابات) {for (int i = 0 ؛ i <tanks.size () ؛ i ++) {if (hittank (tanks.get (i))) إرجاع true ؛ } إرجاع خطأ ؛ } /*عملية الاصطدام بين الرصاص والجدار* / Boolean Hitwall (Wall W) { /*إذا كان نطاق الرصاص والجدار يتداخل مع Death Bullet* / if (this.live && this.getRect (). // Death Death Return True ؛ } إرجاع خطأ ؛ }} Wall.java
استيراد java.awt.graphics ؛ استيراد java.awt.Rectangle ؛ جدار الفئة العامة { /*data* / 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 () {return new Rectangle (x ، y ، w ، h) ؛ } /*draw wall* / public void draw (Graphics g) {g.fillRect (x ، y ، w ، h) ؛ }}explode.java
استيراد java.awt.color ؛ استيراد java.awt.graphics ؛ الفئة العامة تنفجر { /*سمة انفجار الخزان* / int x ، y ؛ // الانفجار موقف خاص منطقي Live = true ؛ // هل هناك انفجار int الخطوة = 0 ؛ // الانفجار في وقت التحكم int [] DIAMETER = NEW int [] {4 ، 7 ، 12 ، 18 ، 26 ، 32 ، 49 ، 56 ، 65 ، 77 ، 80 ، 50 ، 40 ، 30 ، 14 ، 6} ؛ // exprosion range private tankclient tc ؛ // أذن الفئة الرئيسية تنفجر عام (int x ، int y ، tankclient tc) {super () ؛ this.x = x ؛ this.y = y ؛ this.tc = tc ؛ } /*ارسم الانفجار* / public void draw (Graphics g) {if (! live) return ؛ // إذا لم تنتهي حالة وفاة الانفجار/*إذا انتهى وقت الانفجار ، فإن الانفجار غير موجود ويحذفه في المجموعة*/if (الخطوة == 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.awt.color ؛ استيراد java.awt.graphics ؛ استيراد java.awt.Rectangle ؛ استيراد java.util.random ؛ الدم العام {/* data clot data*/ int x ، y ، w ، h ؛ // إذن من الفئة الرئيسية ، Live Boolean Live = True ؛ // Skerly Survival Private Static Random R = new Random () ؛ // ، قم بتعيين متغير قيمة عشوائي/* الحصول على حالة بقاء الدم*/ public boolean Islive () {return live ؛ } /* اضبط حالة بقاء جلطة الدم* / public void setLive (boolean live) {this.live = live ؛ } /*القيمة الأولية لموضع جلطة الدم هي بشكل عشوائي قيمة* / الدم العام () {x = r.nextint (600) +100 ؛ y = R.NextInt (400) +100 ؛ W = H = 15 ؛ } /*ارسم جلطة الدم* / public void draw (الرسومات g) {if (! live) return ؛ اللون c = g.getColor () ؛ G.SetColor (color.magenta) ؛ G.FillRect (x ، y ، w ، h) ؛ G.SetColor (C) ؛ } /*refer Blood Clot* / public void fh () {if (! live) {x = r.nextint (600) +100 ؛ y = R.NextInt (400) +100 ؛ لايف = صحيح ؛ }} /*احصل على نطاق جلطة الدم* / المستطيل العام getRect () {return new strenge (x ، y ، w ، h) ؛ }}ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.