บทความนี้อธิบายถึงเกมกวาดทุ่นระเบิดและเวอร์ชันที่ปรับปรุงแล้วโดย Java Swing แบ่งปันสำหรับการอ้างอิงของคุณดังนี้:
เวอร์ชัน 1:
แพ็คเกจ awtdemo; นำเข้า java.awt.event.actionevent; นำเข้า java.awt.event.actionListener; นำเข้า java.awt.event.mousevent; นำเข้า java.awt.event.mouselistener; นำเข้า Javax.swing.jbutton; ตัวอย่างการกวาดทุ่นระเบิดอย่างง่ายเขียนโดยการแกว่งเหมาะสำหรับผู้เริ่มต้นในการฝึกฝน* โปรแกรมนี้ใช้ setbounds (x, y, w, h) เพื่อจัดวางวิธีการควบคุม* หมายถึงวิธีการกวาดทุ่นระเบิดที่สร้างขึ้นใน Win XP แน่นอนว่าฟังก์ชั่นการเขียนยังไม่ได้เกิดขึ้น * ฟังก์ชั่นบางอย่างที่มีข้อบกพร่อง * * @author ping_qc */การทดสอบระดับสาธารณะขยาย JFrame ดำเนินการ actionListener, runnable, mouselistener {ส่วนตัวคงที่ INT สุดท้ายส่วนตัวว่างเปล่า = 0; INT INT สุดท้ายส่วนตัว = 1; ตรวจสอบ int สุดท้ายส่วนตัว = 2; INT สุดท้ายส่วนตัว INT MINE_COUNT = 10; // จำนวน Thunder Private Final int button_border = 50; // ขนาดของแต่ละจุดส่วนตัวสุดท้าย int mine_size = 10; // ข้อมูลจำเพาะอินเทอร์เฟซ, 20x20 ส่วนตัวสุดท้าย int เริ่มต้น start_x = 20; // เริ่มตำแหน่ง x private final int start_y = 50; // เริ่มตำแหน่ง y ธงบูลีนส่วนตัว; JButton ส่วนตัว [] [] JB; JLABEL JLABEL ส่วนตัว; Private Jlabel Showtime; private int [] [] แผนที่; /*** ตรวจพบว่ามีสายฟ้าอยู่รอบ ๆ จุดหนึ่งหรือไม่ พิกัดของจุดโดยรอบสามารถคำนวณได้จากอาร์เรย์นี้*/ int ส่วนตัว [] [] mv = {{-1, 0}, {-1, 1}, {0, 1}, {1, 1}, {1, 0}, {1, -1}, {-1, -1, -1 / *** แบบสุ่มสร้างจำนวนชุดฟ้าร้อง*/ โมฆะสาธารณะ makemine () {int i = 0, tx, ty; สำหรับ (; i <mine_count;) {tx = (int) (math.random () * mine_size); ty = (int) (math.random () * mine_size); ถ้า (แผนที่ [tx] [ty] == ว่าง) {แผนที่ [tx] [ty] = ของฉัน; i ++; // อย่าจำสายฟ้าซ้ำ ๆ }}}}/ *** ใส่อาร์เรย์ปุ่มบนเฟรมและสอดคล้องกับแผนที่ [] [] อาร์เรย์*/ โมฆะสาธารณะ makebutton () {สำหรับ (int i = 0; i <mine_size; i ++) {สำหรับ (int j = 0; j <mine_size; // ถ้า (แผนที่ [i] [j] == ของฉัน) // jb [i] [j] .settext (i+","+j); // ผู้ฟังเพิ่ม jb [i] [j] .addactionListener (นี้); jb [i] [j] .addmouselistener (นี่); jb [i] [j] .setName (i + "_" + j); // การคลิกที่สะดวกคือการพิจารณาว่าปุ่มใดถูกคลิก // Font Font = Font ใหม่ (Font.Serif, Font.Bold, 10); // jb [i] [j] .setfont (แบบอักษร); // jb [i] [j] .settext (i+","+j); jb [i] [j] .setbounds (j * button_border + start_x, i * button_border + start_y, button_border, button_border); this.add (jb [i] [j]); }}} public void init () {flag = false; jl.settext ("ยินดีต้อนรับสู่การทดสอบมีทั้งหมด" + mine_count + "Thunder"); jl.setVisible (จริง); Jl.SetBounds (20, 20, 500, 30); this.add (JL); showtime.settext ("ผ่าน: 0 วินาที"); Showtime.setBounds (400, 20, 100, 30); this.add (Showtime); makemine (); MakeButton (); this.setsize (550, 600); this.setLocation (700, 100); this.setResizable (เท็จ); this.setDefaultCloseOperation (exit_on_close); this.setVisible (จริง); } การทดสอบสาธารณะ (ชื่อสตริง) {super (ชื่อเรื่อง); this.setLayout (NULL); // ไม่ได้ใช้ตัวจัดการเค้าโครงตั้งตำแหน่งของการควบคุมแต่ละตัวด้วย setbounds jb = new JButton [mine_size] [mine_size]; jl = new jlabel (); Showtime = new Jlabel (); MAP = ใหม่ int [mine_size] [mine_size]; // แมปปุ่มลงในอาร์เรย์} โมฆะคงที่สาธารณะหลัก (สตริง [] args) {ทดสอบทดสอบ = การทดสอบใหม่ ("wulin.com-mine การทดสอบเกมกวาด 1"); test.init (); test.run (); } @Override โมฆะสาธารณะ ActionPerformed (ActionEvent E) {Object OBJ = E.getSource (); int x, y; if ((OBJ instanceof jbutton) == false) {showMessage ("ข้อผิดพลาด", "ข้อผิดพลาดภายใน"); กลับ; } string [] tmp_str = ((jbutton) obj) .getName (). แยก ("_"); x = integer.parseint (tmp_str [0]); y = integer.parseint (tmp_str [1]); ถ้า (แผนที่ [x] [y] == ของฉัน) {showmessage ("ความตาย", "คุณก้าวไปบนเหมือง ~~~"); ธง = จริง; showmine (); กลับ; } dfs (x, y, 0); checksuccess (); } / ** * หลังจากการคลิกแต่ละครั้งให้ตรวจสอบว่าพบว่าไฟทั้งหมดถูกค้นพบโดยการคำนวณจำนวนปุ่มที่มีสถานะเปิดใช้งาน * / โมฆะส่วนตัวตรวจสอบ () {int cnt = 0; สำหรับ (int i = 0; i <mine_size; i ++) {สำหรับ (int j = 0; j <mine_size; j ++) {ถ้า (jb [i] [j]. isenabled ()) {cnt ++; }}} if (cnt == mine_count) {string tmp_str = showtime.getText (); tmp_str = tmp_str.replaceall ("[^0-9]", ""); ShowMessage ("ชัยชนะ", "เมื่อการสำรวจเหมืองนี้ถูกแชร์:" + tmp_str + "วินาที"); ธง = จริง; showmine (); }} int ส่วนตัว dfs (int x, int y, int d) {map [x] [y] = ตรวจสอบ; int i, tx, ty, cnt = 0; สำหรับ (i = 0; i <8; i ++) {tx = x+mv [i] [0]; ty = y + mv [i] [1]; if (tx> = 0 && tx <mine_size && ty> = 0 && ty <mine_size) {ถ้า (แผนที่ [tx] [ty] == ของฉัน) {cnt ++; // สถิติของหมายเลขฟ้าร้องใกล้จุดนี้ } อื่นถ้า (แผนที่ [tx] [ty] == ตรวจสอบ) {; }}} ถ้า (cnt == 0) {สำหรับ (i = 0; i <8; i ++) {tx = x+mv [i] [0]; ty = y + mv [i] [1]; if (tx> = 0 && tx <mine_size && ty> = 0 && ty <mine_size && แผนที่ [tx] [ty]! = ตรวจสอบ) {dfs (tx, ty, d + 1); }}} else {jb [x] [y] .settext (cnt + ""); } jb [x] [y] .setenabled (เท็จ); คืน CNT; } / ** * แสดงข้อมูลบางอย่างเกี่ยวกับแท็ก jl * * @param title * @param info * / private void showmessage (ชื่อสตริง, ข้อมูลสตริง) {jl.settext (ข้อมูล); System.out.println ("ใน functino showmessage ():" + ข้อมูล); } โมฆะสาธารณะเรียกใช้ () {int t = 0; ในขณะที่ (จริง) {ถ้า (ธง) {break; } ลอง {thread.sleep (1,000); } catch (interruptedException e) {e.printStackTrace (); } t ++; showtime.settext ("ผ่าน:" + t + "วินาที"); } // showmine (); } โมฆะส่วนตัว showmine () {// ไอคอนไอคอน = imageicon ใหม่ ("e: /mine.jpg"); สำหรับ (int i = 0; i <mine_size; i ++) {สำหรับ (int j = 0; j <mine_size; j ++) {ถ้า (แผนที่ [i] [j] == ของฉัน) {jb [i] [j] .settext ("#"); // jb [i] [j]. }}}} @Override โมฆะสาธารณะ mouseclicked (MouseEvent E) {ถ้า (e.getButton () == 3) {Object obj = E.getSource (); if ((OBJ instanceof jbutton) == false) {showMessage ("ข้อผิดพลาด", "ข้อผิดพลาดภายใน"); กลับ; } string [] tmp_str = ((jbutton) obj) .getName (). แยก ("_"); int x = integer.parseint (tmp_str [0]); int y = integer.parseint (tmp_str [1]); if ("{1}". เท่ากับ (jb [x] [y] .getText ()))) {jb [x] [y] .settext (""); } else {jb [x] [y] .settext ("{1}"); } /* ถ้า (jb [x] [y] .geticon () == null) {jb [x] [y] .seticon (imageicon ใหม่ ("e: /flag.jpg")); } else {jb [x] [y] .seticon (null); }*/}} @Override โมฆะสาธารณะ mousepressed (MouseEvent E) {// วิธีการที่สร้างขึ้นอัตโนมัติ stub} @Override โมฆะสาธารณะ mouserlease (MouseEvent E) {// toDo วิธีการที่กำหนดอัตโนมัติ เป็นโมฆะ mouseexited (MouseEvent E) {// todo วิธีการที่สร้างอัตโนมัติ stub}}}เอฟเฟกต์การทำงาน:
เวอร์ชัน 2 เป็นการปรับปรุงโปรแกรมเวอร์ชัน 1 ด้านบนและฟังก์ชั่นการทำเครื่องหมายคลิกขวาและฟังก์ชั่นความยากในการเลือกอิสระจะถูกเพิ่มขึ้นบนพื้นฐานของพื้นฐานที่ไม่เปลี่ยนแปลง
แพ็คเกจ awtdemo; นำเข้า java.awt.event.actionevent; นำเข้า java.awt.event.actionlistener; นำเข้า java.awt.event.mousevent; นำเข้า java.awt.event.mouselistener; นำเข้า Javax.swing.jbutton; javax.swing.jlabel; @suppresswarnings ("อนุกรม") คลาสสาธารณะ Saolei ขยาย jframe ใช้ actionListener, runnable, mouselistener {ส่วนตัวสุดท้าย int loempty = 0; LOMINE สุดท้ายส่วนตัว = 1; LOCHECKED INT สุดท้ายส่วนตัว = 2; INT สุดท้ายส่วนตัว LOMINE_COUNT = 10; INT สุดท้ายส่วนตัว lobutton_border = 50; INT สุดท้ายส่วนตัว LOMINE_SIZE = 10; INT สุดท้ายส่วนตัว LOSTART_X = 20; INT สุดท้ายส่วนตัว LOSTART_Y = 50; ธงบูลีนส่วนตัว JButton ส่วนตัว [] [] JB; JLABEL JLABEL ส่วนตัว; Private Jlabel Showtime; private int [] [] แผนที่; ส่วนตัว int [] [] mv = {{-1, 0}, {-1, 1}, {0, 1}, {1, 1}, {1, 0}, {1, -1}, {0, -1}, {-1, -1}}; โมฆะสาธารณะ makelomine () {int i = 0, tx, ty; สำหรับ (; i <lomine_count;) {tx = (int) (math.random () * lomine_size); ty = (int) (math.random () * lomine_size); if (แผนที่ [tx] [ty] == loempty) {แผนที่ [tx] [ty] = lomine; i ++; }}} โมฆะสาธารณะ makeButton () {สำหรับ (int i = 0; i <lomine_size; i ++) {สำหรับ (int j = 0; j <lomine_size; j ++) {jb [i] [j] = new Jbutton (); jb [i] [j] .addactionListener (นี่); jb [i] [j] .addmouselistener (นี่); jb [i] [j] .setName (i + "_" + j); jb [i] [j] .setBounds (j * lobutton_border + lostart_x, i * lobutton_border + lostart_y, lobutton_border, lobutton_border); this.add (jb [i] [j]); }}} public void init () {flag = false; jl.settext ("ยินดีต้อนรับการทดสอบมีทั้งหมด" + lomine_count + "Thunder"); jl.setVisible (จริง); Jl.SetBounds (20, 20, 500, 30); this.add (JL); showtime.settext ("ผ่าน: 0 วินาที"); Showtime.setBounds (400, 20, 100, 30); this.add (Showtime); makelomine (); MakeButton (); this.setsize (550, 600); this.setLocation (700, 100); this.setResizable (เท็จ); this.setDefaultCloseOperation (exit_on_close); this.setVisible (จริง); } สาธารณะ saolei (ชื่อสตริง) {super (ชื่อ); this.setLayout (NULL); // ไม่มีการใช้ตัวจัดการเค้าโครง setBounds สำหรับตำแหน่งควบคุมแต่ละตำแหน่ง JB = ใหม่ JButton [LOMINE_SIZE] [LOMINE_SIZE]; jl = new jlabel (); Showtime = new Jlabel (); MAP = New Int [LOMINE_SIZE] [LOMINE_SIZE]; // แมปปุ่มลงในอาร์เรย์} โมฆะคงที่สาธารณะหลัก (สตริง [] args) {saolei test = new Saolei ("wulin.com-mine การทดสอบเกมกวาด 2"); test.init (); test.run (); } @Override โมฆะสาธารณะ ActionPerformed (ActionEvent E) {Object OBJ = E.getSource (); int x, y; if ((OBJ instanceof jbutton) == false) {showMessage ("ข้อผิดพลาด", "ข้อผิดพลาดภายใน"); กลับ; } string [] tmp_str = ((jbutton) obj) .getName (). แยก ("_"); x = integer.parseint (tmp_str [0]); y = integer.parseint (tmp_str [1]); ถ้า (แผนที่ [x] [y] == lomine) {showmessage ("ความตาย", "คุณก้าวไปบนเหมือง ~~~"); ธง = จริง; showlomine (); กลับ; } dfs (x, y, 0); checksuccess (); } โมฆะส่วนตัว checksuccess () {int cnt = 0; สำหรับ (int i = 0; i <lomine_size; i ++) {สำหรับ (int j = 0; j <lomine_size; j ++) {ถ้า (jb [i] [j]. isenabled ()) {cnt ++; }}} if (cnt == lomine_count) {string tmp_str = showtime.getText (); tmp_str = tmp_str.replaceall ("[^0-9]", ""); ShowMessage ("ชัยชนะ", "เมื่อการสำรวจเหมืองนี้ถูกแชร์:" + tmp_str + "วินาที"); ธง = จริง; showlomine (); }} int ส่วนตัว dfs (int x, int y, int d) {map [x] [y] = lochecked; int i, tx, ty, cnt = 0; สำหรับ (i = 0; i <8; i ++) {tx = x+mv [i] [0]; ty = y + mv [i] [1]; if (tx> = 0 && tx <lomine_size && ty> = 0 && ty <lomine_size) {ถ้า (แผนที่ [tx] [ty] == lomine) {cnt ++; } อื่นถ้า (แผนที่ [tx] [ty] == loempty) {; } อื่นถ้า (แผนที่ [tx] [ty] == lochecked) {; }}} ถ้า (cnt == 0) {สำหรับ (i = 0; i <8; i ++) {tx = x+mv [i] [0]; ty = y + mv [i] [1]; if (tx> = 0 && tx <lomine_size && ty> = 0 && ty <lomine_size && แผนที่ [tx] [ty]! = lochecked) {dfs (tx, ty, d + 1); }}} else {jb [x] [y] .settext (cnt + ""); } jb [x] [y] .setenabled (เท็จ); คืน CNT; } โมฆะส่วนตัว showMessage (ชื่อสตริง, ข้อมูลสตริง) {jl.settext (ข้อมูล); System.out.println ("ใน functino showmessage ():" + ข้อมูล); } โมฆะสาธารณะเรียกใช้ () {int t = 0; ในขณะที่ (จริง) {ถ้า (ธง) {break; } ลอง {thread.sleep (1,000); } catch (interruptedException e) {e.printStackTrace (); } t ++; showtime.settext ("เวลาที่ผ่านไป:" + t + "วินาที"); }} โมฆะส่วนตัว showlomine () {สำหรับ (int i = 0; i <lomine_size; i ++) {สำหรับ (int j = 0; j <lomine_size; j ++) {ถ้า (map [i] [j] == lomine) {jb [i] [j] }}}} โมฆะสาธารณะ mouseclicked (MouseEvent E) {ถ้า (e.getButton () == 3) {Object obj = E.getSource (); if ((OBJ instanceof jbutton) == false) {showMessage ("ข้อผิดพลาด", "ข้อผิดพลาดภายใน"); กลับ; } string [] tmp_str = ((jbutton) obj) .getName (). แยก ("_"); int x = integer.parseint (tmp_str [0]); int y = integer.parseint (tmp_str [1]); if ("{1} quot" .equals (jb [x] [y] .getText ())) {jb [x] [y] .settext (""); } else {jb [x] [y] .settext ("{1} quot"); }}} โมฆะสาธารณะ mousepressed (MouseEvent E) {} @Override โมฆะสาธารณะ mouserleased (MouseEvent E) {} โมฆะสาธารณะ Mouseentered (MouseEvent E) {} @Override โมฆะสาธารณะเอฟเฟกต์การทำงาน:
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับอัลกอริทึม Java ผู้อ่านที่มีความสนใจในเว็บไซต์นี้สามารถดูหัวข้อ: "โครงสร้างข้อมูล Java และการสอนอัลกอริทึม", "บทสรุปของเคล็ดลับการดำเนินงาน Java Dom", "บทสรุปของไฟล์ Java และเคล็ดลับการดำเนินการไดเรกทอรี" และ "สรุป
ฉันหวังว่าบทความนี้จะเป็นประโยชน์กับการเขียนโปรแกรม Java ของทุกคน