นี่คือการออกแบบหลักสูตรสุดท้ายสำหรับหลักสูตร Java เนื่องจาก Java เป็นผู้เริ่มต้นฉันได้อ้างถึงบล็อกของผู้เชี่ยวชาญด้านเทคนิคเมื่อทำ ฉันอยากจะแสดงความขอบคุณที่นี่
โพสต์ที่นี่เพื่อสื่อสารและเรียนรู้
หากคุณต้องการไฟล์โครงการเอกสารและไฟล์ jar ที่เรียกใช้งานได้ให้ดาวน์โหลดที่อยู่: คลิกเพื่อเปิดลิงค์
Russianblocksgame.java
แพ็คเกจ Russiablocksgame; นำเข้า Java.awt.*; นำเข้า java.awt.event.*; นำเข้า javax.swing.border.border; นำเข้า Javax.swing.border.etchedBorder; /*** คลาสเกมหลักที่สืบทอดมาจากคลาส JFrame รับผิดชอบการควบคุมเกมทั่วโลก รวมถึง: 1. วัตถุอินสแตนซ์ของคลาส Canvas Gamecanvas, * 2. วัตถุที่เก็บอินสแตนซ์บล็อกที่ใช้งานอยู่ (Russiablock) ปัจจุบัน; 3. วัตถุที่เก็บอินสแตนซ์ของแผงควบคุมปัจจุบัน (ControlPanel); */ ชั้นเรียนสาธารณะ Russiablocksgame ขยาย JFrame {ส่วนตัวคงที่สุดท้าย Long SerialVersionUid = -7332245439279674749L; / *** จำนวนคะแนนที่นับสำหรับแต่ละแถวที่เต็มไปด้วย*/ สาธารณะสุดท้ายคงที่ int per_line_score = 100; / *** สามารถอัพเกรดคะแนนได้กี่คะแนนหลังจากการสะสม*/ สาธารณะสุดท้ายคงที่ int per_level_score = per_line_score* 20; / *** ซีรี่ส์สูงสุดคือระดับ 10*/ สาธารณะสุดท้ายคงที่ int max_level = 10; / ** * ซีรี่ส์เริ่มต้นคือ 2 */ สาธารณะสุดท้ายคงที่ int default_level = 2; Gamecanvas Private Canvas; บล็อก ersblock ส่วนตัว; การเล่นบูลีนส่วนตัว = FALSE; Private Controlpanel Ctrlpanel; // เริ่มต้นเมนูแถบส่วนตัว JMENUBAR BAR = ใหม่ JMENUBAR (); ส่วนตัว jmenu mgame = new jmenu ("game"), mcontrol = new jmenu ("ควบคุม"), minfo = new jmenu ("help"); ส่วนตัว jmenuitem minewgame = ใหม่ jmenuitem ("เกมใหม่"), misetblockcolor = new jmenuitem ("ตั้งค่าสีบล็อก ... "), misetbackcolor = new jmenuitem ("สีพื้นหลัง ... "), miturnharder = new Jmenuitem ( JMENUITEM ใหม่ ("ออก"), miplay = ใหม่ jMenuitem ("เริ่มต้น"), mipause = new jmenuitem ("หยุดชั่วคราว"), miresume = new JMenuitem ("Resume"), mistop = new JMenuitem ("Game Game" / *** สร้างและตั้งค่าเมนูหน้าต่าง*/ โมฆะส่วนตัว creatmenu () {bar.add (mgame); bar.add (McOntrol); bar.add (minfo); mgame.add (minewgame); mgame.addsparator (); // เพิ่มบรรทัดแยกแนวนอน mgame.add (misetblockcolor); mgame.add (misetblockcolor); mgame.addsparator (); // เพิ่มเส้นแบ่งแนวนอน mgame.add (miturnharder); mgame.add (miturneasier); mgame.addsparator (); // เพิ่มเส้นแบ่งแนวนอน mgame.add (miexit); McOntrol.add (Miplay); miplay.setenabled (จริง); mcontrol.add (mipause); mipause.setenabled (เท็จ); mcontrol.add (miresume); miresume.setenabled (เท็จ); McOntrol.add (Mistop); mistop.setenabled (เท็จ); minfo.add (mirule); minfo.add (miauthor); setjmenubar (บาร์); minewgame.addactionListener (ใหม่ actionListener () {@Override โมฆะสาธารณะ ActionPerformed (ActionEvent E) {StopGame (); RESET (); setLevel (default_level);}}); // ตั้งค่าสีบล็อก misetblockcolor.addactionListener (ใหม่ actionListener () {@Override โมฆะสาธารณะ ActionPerformed (ActionEvent E) {color newfrontColor = jColorChooser.ShowDialog (russiablocksgame.this null) {canvas.setblockcolor (newfrontcolor);}}}); // ตั้งค่าสีพื้นหลัง misetbackcolor.addactionListener (ใหม่ actionListener () {@Override โมฆะสาธารณะ ActionPerformed (ActionEvent E) {Color NewbackColor = JColorChooser.ShowDialog (Russiablocksgame.this Canvas.setBackgroundColor (NewbackColor);}}}); // กำหนดฟังก์ชั่นของแถบเมนู "เกี่ยวกับ" และกล่องยืนยันปรากฏขึ้น miauthor.addactionListener (ใหม่ actionListener () {@Override โมฆะสาธารณะ ActionPerformed (ActionEvent E) {Joptionpane.ShowMessagedialog (NULL, "Software Engineering (4) Class/N3115005372/Nyang Yujie/n - // กฎของเกมคำอธิบาย mirule.addactionListener (ใหม่ actionListener () {@Override โมฆะสาธารณะ ActionPerformed (ActionEvent E) {Joptionpane.ShowMessagedialog (NULL "แผ่นที่แตกต่างกันไปตามแนวสี่เหลี่ยมจัตุรัสเล็ก ๆ หน้าจอ // เพิ่มความยากลำบาก miturnharder.addactionListener (ใหม่ actionListener () {@Override โมฆะสาธารณะ ActionPerformed (ActionEvent E) {int curlevel = getLevel (); ถ้า (! การเล่น && curlevel <max_level) {setlevel (curlevel + 1); // ลดความยากลำบาก miturneAsier.addActionListener (ใหม่ actionListener () {@Override โมฆะสาธารณะ ActionPerformed (ActionEvent E) {int curlevel = getLevel (); ถ้า (! การเล่น && curlevel> 1) {setlevel (curlevel - 1);}}}); // ออกจากปุ่มออกการตอบสนอง miexit.addactionListener (ใหม่ actionListener () {@Override โมฆะสาธารณะ ActionPerformed (ActionEvent E) {System.Exit (0);}}); } / *** วิธีการสร้างของคลาสเกมหลัก** @param ชื่อสตริงชื่อหน้าต่างชื่อ* / สาธารณะ Russiablocksgame (ชื่อสตริง) {super (ชื่อ); // ตั้งค่าชื่อเรื่อง (500, 600); // ตั้งค่าขนาดหน้าต่าง setLocationRelativeto (null); // ตั้งค่าศูนย์กลางหน้าต่าง createMenu (); คอนเทนเนอร์คอนเทนเนอร์ = getContentPane (); // สร้างเมนูบาร์คอนเทนเนอร์ SetLayout (New BorderLayout (6, 0)); // ตั้งค่าตัวจัดการเค้าโครงของหน้าต่าง Canvas = ใหม่ gamecanvas (20, 15); // สร้างเกมใหม่ CANVAS CTRLPANEL = New ControlPanel (นี่); // สร้างแผงควบคุมใหม่คอนเทนเนอร์ ADD (Canvas, BorderLayout.Center); // เพิ่ม canvas container.add (ctrlpanel, borderlayout.east); // เพิ่มแผงควบคุมทางขวา // ลงทะเบียนเหตุการณ์หน้าต่าง เมื่อคลิกปุ่มปิดเกมจะสิ้นสุดลงและระบบจะออก AddWindowListener (WindowAdapter ใหม่ () {@Override โมฆะสาธารณะ Windowclosing (WindowEvent We) {StopGame (); System.Exit (0);}}); // ปรับขนาดของสแควร์โดยอัตโนมัติตามขนาดหน้าต่าง AddComponentListener (ComponentAdapter ใหม่ () {@Override public void componentResized (ComponentEvent CE) {Canvas.Adjust ();}}); setVisible (จริง); Canvas.Adjust (); } /*** รีเซ็ตเกม* /โมฆะสาธารณะรีเซ็ต () {// รีเซ็ตผืนผ้าใบและรีเซ็ตแผงควบคุม ctrlPanel.SetPlayButtonEnable (จริง); ctrlpanel.setPauseButtonEnable (เท็จ); ctrlpanel.setpausebuttonlabel (จริง); ctrlpanel.setStopButtonEnable (เท็จ); ctrlpanel.setturnleveldownbuttonenable (จริง); ctrlpanel.setturnlevelupbuttonenable (จริง); miplay.setenabled (จริง); mipause.setenabled (เท็จ); miresume.setenabled (เท็จ); mistop.setenabled (เท็จ); ctrlpanel.reset (); canvas.reset (); } / *** พิจารณาว่าเกมยังอยู่ในระหว่างดำเนินการ** @return Boolean, True - ยังคงทำงานอยู่หรือไม่หยุดหยุด* / Public Boolean Isplaying () {การเล่นกลับ; } / *** รับบล็อกที่ใช้งานอยู่ในปัจจุบัน** @return ersblock, การอ้างอิงของบล็อกที่ใช้งานอยู่ในปัจจุบัน* / สาธารณะ ersblock getCurblock () {return block; } / *** รับผืนผ้าใบปัจจุบัน** @return gamecanvas, การอ้างอิงของผืนผ้าใบปัจจุบัน* / gamecanvas สาธารณะ getCanvas () {return canvas; } / *** เริ่มเกม* / Public Void Playgame () {play (); ctrlpanel.setplaybuttonenable (เท็จ); ctrlpanel.setpausebuttonenable (จริง); ctrlpanel.setpausebuttonlabel (จริง); ctrlpanel.setStopButtonEnable (จริง); ctrlpanel.setturnleveldownbuttonenable (เท็จ); ctrlpanel.setturnlevelupbuttonenable (เท็จ); mistop.setenabled (จริง); Miturnharder.setEnabled (เท็จ); miturneasier.setenabled (เท็จ); ctrlpanel.requestfocus (); // ตั้งค่าโฟกัสบนแผงควบคุม}/*** เกมหยุดชั่วคราว*/โมฆะสาธารณะหยุดชั่วคราว () {ถ้า (บล็อก! = null) {block.pausemove (); } ctrlPanel.SetPlayButtonEnable (เท็จ); ctrlpanel.setpausebuttonlabel (เท็จ); ctrlpanel.setStopButtonEnable (จริง); miplay.setenabled (เท็จ); mipause.setenabled (เท็จ); miresume.setenabled (จริง); mistop.setenabled (จริง); } / *** ปล่อยให้เกมหยุดทำงานต่อไป* / โมฆะสาธารณะ resumegame () {ถ้า (บล็อก! = null) {block.resumemove (); } ctrlPanel.SetPlayButtonEnable (เท็จ); ctrlpanel.setpausebuttonenable (จริง); ctrlpanel.setpausebuttonlabel (จริง); mipause.setenabled (จริง); miresume.setenabled (เท็จ); ctrlpanel.requestfocus (); } / *** ผู้ใช้หยุดเกม* / public void stopgame () {playing = false; if (block! = null) {block.stopmove (); } ctrlPanel.SetPlayButtonEnable (จริง); ctrlpanel.setPauseButtonEnable (เท็จ); ctrlpanel.setpausebuttonlabel (จริง); ctrlpanel.setStopButtonEnable (เท็จ); ctrlpanel.setturnleveldownbuttonenable (จริง); ctrlpanel.setturnlevelupbuttonenable (จริง); miplay.setenabled (จริง); mipause.setenabled (เท็จ); miresume.setenabled (เท็จ); mistop.setenabled (เท็จ); miturnharder.setenabled (จริง); miturneasier.setenabled (จริง); รีเซ็ต (); // รีเซ็ตผืนผ้าใบและแผงควบคุม}/** * รับความยากลำบากที่กำหนดโดยผู้เล่น * * @return int, เกมปัญหา 1-max_level */public int getlevel () {return ctrlpanel.getLevel (); } / ** * ผู้ใช้ตั้งค่าความยากของเกม * * @param ระดับ int, เกมปัญหา 1-max_level * / โมฆะสาธารณะ setlevel (ระดับ int) {ถ้า (ระดับ <11 && ระดับ> 0) {ctrlpanel.setlevel (ระดับ); }} / *** รับคะแนนเกม** @return int, คะแนน* / public int getScore () {ถ้า (Canvas! = null) {return canvas.getScore (); } return 0; } /*** รับคะแนนเกมตั้งแต่การอัพเกรดครั้งสุดท้าย หลังจากการอัพเกรดจุดนี้จะถูกล้าง** @return int, ints*/ public int getscoreforlevelupdate () {ถ้า (canvas! = null) {return canvas.getscoreforlevelupdate (); } return 0; } / ** * เมื่ออินทิกรัลสะสมเป็นค่าที่แน่นอนอัพเกรดหนึ่งครั้ง * * @return boolean, ความสำเร็จในการอัปเดตจริง, การอัปเดตเท็จล้มเหลว * / บูลีนสาธารณะ levelupdate () {int curlevel = getLevel (); if (curlevel <max_level) {setlevel (curlevel + 1); canvas.resetscoreforlevelupdate (); กลับมาจริง; } return false; } / *** เกมเริ่ม* / private void play () {reset (); เล่น = จริง; เธรดเธรด = เธรดใหม่ (เกมใหม่ ()); // เริ่มต้นเกมเธรดเกม start (); } / *** รายงานเกมจบลง* / Private Void ReportGameOver () {ใหม่ GameOverDialog (นี่ "tetris", "เกมจบลงคะแนนของคุณคือ" + canvas.getScore ()); } /*** หนึ่งรอบของกระบวนการเกมโดยใช้อินเตอร์เฟสที่เรียกใช้ รอบของเกมเป็นวงใหญ่ ในวงนี้ทุก ๆ 100 มิลลิวินาทีตรวจสอบว่าบล็อกปัจจุบันในเกมถึงจุดสิ้นสุดหรือไม่ ถ้าไม่ * จะรอต่อไป ถ้ามันมาถึงจุดสิ้นสุดมันก็ขึ้นอยู่กับว่ามีเส้นที่เต็มไปอย่างเต็มที่หรือไม่ หากมีให้ลบและเพิ่มคะแนนไปยังผู้เล่นและสร้างบล็อกปัจจุบันใหม่แบบสุ่มและปล่อยให้มันตกโดยอัตโนมัติ * เมื่อมีการสร้างบล็อกใหม่ก่อนอื่นให้ตรวจสอบว่าบรรทัดที่ด้านบนของผืนผ้าใบถูกครอบครองหรือไม่ ถ้าเป็นเช่นนั้นคุณสามารถตัดสินเกมได้ */ เกมคลาสส่วนตัวใช้งาน Runnable {@Override โมฆะสาธารณะเรียกใช้ () {int col = (int) (math.random () * (canvas.gatcols () - 3)); // สุ่มสร้างตำแหน่งของบล็อก int = ersblock.styles [int) (math.random () ของรูปร่างในขณะที่ (เล่น) {ถ้า (บล็อก! = null) {// บล็อกว่างเปล่าถ้า (block.isalive ()) {ลอง {thread.currentthread (); Thread.sleep (500); } catch (interruptedException ie) {ie.printStackTrace (); } ดำเนินการต่อ; }} checkfullline (); // ตรวจสอบว่ามีบรรทัดที่เต็มไปอย่างเต็มที่หรือไม่ถ้า (isgameover ()) {reportgameover (); miplay.setenabled (จริง); mipause.setenabled (เท็จ); miresume.setenabled (เท็จ); mistop.setenabled (เท็จ); ctrlpanel.setplaybuttonenable (จริง); ctrlpanel.setpausebuttonlabel (เท็จ); ctrlpanel.setStopButtonEnable (เท็จ); กลับ; } block = ใหม่ ersblock (สไตล์, -1, col, getLevel (), ผ้าใบ); block.start (); col = (int) (math.random () * (canvas.getCols () - 3)); style = ersblock.styles [(int) (math.random () * 7)] [(int) (math.random () * 4)]; ctrlpanel.settipstyle (สไตล์); }} // ตรวจสอบว่ามีเส้นเต็มในผืนผ้าใบหรือไม่ หากมีหนึ่งให้ลบเป็นโมฆะสาธารณะ checkfullline () {สำหรับ (int i = 0; i <canvas.getrows (); i ++) {int row = -1; บูลีน fulllinecolorbox = true; สำหรับ (int j = 0; j <canvas.getCols (); j ++) {ถ้า (! canvas.getbox (i, j) .iscolorbox ()) {fulllinecolorbox = false; หยุดพัก; }} if (fulllinecolorBox) {row = i--; Canvas.removeline (แถว); }}} // ตัดสินว่าเกมสิ้นสุดลงตามแถวบนสุดหรือไม่ //@return boolean, true-the game จบลงเกมเท็จ-เกมไม่เกินบูลีนส่วนตัว isgameover () {สำหรับ (int i = 0; i <canvas.getCols (); i ++) if (box.iscolorbox ()) {return true; }} return false; }} /*** กำหนดกล่องโต้ตอบ GameOver */ @suppresswarnings ("serial") คลาสส่วนตัว GameOverdialog ขยาย JDialog ใช้ ActionListener {ส่วนตัว JButton อีกครั้ง Button, ExitButton; พรมแดนส่วนตัว = ใหม่ EtchedBorder (EtchedBorder.Raised, Color.white, สีใหม่ (148, 145, 140)); Public GameOverDialog (JFrame Parent, String Title, String Message) {super (parent, title, true); if (parent! = null) {setSize (240, 120); this.setLocationRelativeto (ผู้ปกครอง); JPanel MessagePanel = new JPanel (); messagepanel.add (ใหม่ jlabel (ข้อความ)); MessagePanel.SetBorder (ชายแดน); container container = this.getContentPane (); container.setLayout (ใหม่ gridlayout (2, 0, 0, 10)); container.add (messagepanel); JPanel choosePanel = new JPanel (); ChoosePanel.SetLayout (ใหม่ gridlayout (0, 2, 4, 0)); container.add (choosepanel); อีกครั้ง = ใหม่ JButton ("เล่นเกมอื่น"); ExitButton = new JButton ("Exit Game"); choosepanel.add (ใหม่ jpanel (). เพิ่ม (อีกครั้ง button)); choosepanel.add (ใหม่ jpanel (). เพิ่ม (exitbutton)); ChoosePanel.SetBorder (ชายแดน); } อีกครั้ง button.addactionListener (นี่); ExitButton.AddactionListener (นี่); this.setVisible (จริง); } @Override โมฆะสาธารณะ ActionPerformed (ActionEvent E) {ถ้า (e.getSource () == อีกครั้ง BUTTON) {this.setVisible (เท็จ); รีเซ็ต (); } อื่นถ้า (e.getSource () == exitButton) {stopGame (); System.Exit (0); -gamecanvas.java
แพ็คเกจ Russiablocksgame; นำเข้า Java.awt.Color; นำเข้า java.awt.graphics; นำเข้า Javax.swing.jpanel; นำเข้า Javax.swing.border.etchedBorder; /*** คลาส Canvas ที่มี <จำนวนแถว>* <จำนวนคอลัมน์> อินสแตนซ์คลาสสแควร์ สืบทอดมาจากคลาส JPanel คลาสเธรด ersblock จะเปลี่ยนสีกริดของคลาส Canvas แบบไดนามิกแบบไดนามิก คลาส Canvas ใช้ * เพื่อตรวจสอบสีกริดเพื่อสะท้อนการเคลื่อนไหวของบล็อก ersblock */ คลาสสาธารณะ GameCanvas ขยาย JPanel {ส่วนตัวคงที่สุดท้าย Long SerialVersionUID = 6732901391026089276L; สีส่วนตัวสี backcolor = color.darkgray, frontcolor = color.white; แถว int ส่วนตัว, cols, คะแนน = 0, scoreforlevelupdate = 0; ersbox ส่วนตัว [] [] กล่อง; boxwidth int ส่วนตัว, BoxHeight; / *** ตัวสร้างของคลาส Canvas** @param rows int จำนวนแถวของผ้าใบ* @param cols int จำนวนคอลัมน์และคอลัมน์ของผืนผ้าใบกำหนดจำนวนสี่เหลี่ยมที่ผืนผ้าใบมี*/ gamecanvas สาธารณะ this.cols = cols; กล่อง = ersbox ใหม่ [แถว] [cols]; สำหรับ (int i = 0; i <boxes.length; i ++) {สำหรับ (int j = 0; j <boxes [i] .length; j ++) {boxes [i] [j] = ersbox ใหม่ (เท็จ); }} setBorder (etchedBorder ใหม่ (etchedBorder.raised, color.white, สีใหม่ (148, 145, 140));} / ** * ตัวสร้างของคลาสผืนผ้าใบ * * @param rows * @param cols * @param backcolor * @param frontcolor นี่คือ cols); backcolor = backcolor; getBackgroundColor () {กลับมาเป็นสีสัน; / *** รับจำนวนแถวของสแควร์ในผืนผ้าใบ** @return* / public int getrows () {แถวกลับ; getScore () {คะแนนคืน;} / *** รับคะแนนตั้งแต่การอัพเกรดครั้งสุดท้าย** @return int คะแนนหลังจากการอัพเกรดครั้งสุดท้าย* / int สาธารณะ getscoreforlevelupdate () {return scoreforlevelupdate; Russiablocksgame.per_level_score;} / *** รับการอ้างอิงสี่เหลี่ยมของแถวและคอลัมน์หนึ่ง** @return แถว int แถวที่จะอ้างอิงสี่เหลี่ยมจัตุรัส* @param col int, แถวที่สี่เหลี่ยมจัตุรัส* @@Return ersbox, การอ้างอิงของสแควร์ - 1 | | col <0 || col> boxes [0]. length - 1) {return null; G.SetColor (frontcolor); BoxWidth, BoxHeight, TRUE); โดย ersboxesgame คลาส */public synchronized removeline (แถว int) {สำหรับ (int i = row; i> 0; i--) {สำหรับ (int j = 0; j <cols; j ++) {กล่อง [i] [j] = (ersbox) Squares} score += russiablemsgame.per_level_score; {สำหรับ (int j = 0; j <boxes [i] .length; j ++) {boxes [i] [j] .setcolor (เท็จ);Controlpanel.java
แพ็คเกจ Russiablocksgame; นำเข้า Java.awt.BorderLayout; นำเข้า Java.awt.Color; นำเข้า java.awt.graphics; นำเข้า Java.awt.Gridlayout; นำเข้า java.awt.event.actionEvent; นำเข้า java.awt.event.actionListener; นำเข้า java.awt.event.ComponentAdapter; นำเข้า java.awt.event.ComponentEvent; นำเข้า java.awt.event.keyadapter; นำเข้า java.awt.event.KeyEvent; นำเข้า java.text.dateFormat; นำเข้า java.text.simpledateFormat; นำเข้า java.util.date; นำเข้า Javax.swing.jbutton; นำเข้า Javax.swing.jlabel; นำเข้า Javax.swing.jpanel; นำเข้า Javax.swing.jtextfield; นำเข้า Javax.swing.timer; นำเข้า javax.swing.border.border; นำเข้า Javax.swing.border.etchedBorder; /*** คลาสแผงควบคุมที่สืบทอดมาจาก JPanel หน้าต่างตัวอย่างระดับคะแนนและปุ่มควบคุมจะถูกวางไว้ */ คลาส ControlPanel ขยาย JPanel {ส่วนตัวคงที่สุดท้าย Long SerialVersionUID = 3900659640646175724L; ส่วนตัว jtextfield tflevel = new jtextfield ("" + russiablocksgame.default_level), tfscore = new jtextfield ("0"), tftime = new jtextfield (""); ส่วนตัว jbutton btplay = new jbutton ("เริ่ม"), btpause = new Jbutton ("หยุดชั่วคราว"), btstop = new Jbutton ("จบเกม"), btturnlevelup = new Jbutton ("เพิ่มความยากลำบาก"), btturnleveldown = New Jbutton ( Private JPanel PLTIP = JPANEL ใหม่ (New BorderLayout ()); Private Tippanel pltipblock = New Tippanel (); ส่วนตัว JPanel plinfo = new JPanel (ใหม่ gridlayout (4, 1)); Private JPanel Plbutton = new JPanel (ใหม่ gridlayout (6, 1)); ตัวจับเวลาส่วนตัว พรมแดนส่วนตัว = ใหม่ EtchedBorder (EtchedBorder.Raised, Color.white, สีใหม่ (148, 145, 140)); /*** ตัวสร้างของคลาสแผงควบคุม** @param game ersblocksgame การอ้างอิงอินสแตนซ์ของคลาส ersblocksgame นั้นสะดวกสำหรับการควบคุมพฤติกรรมของคลาส ersblocksgame โดยตรง */ Public Controlpanel (เกมสุดท้ายของ Russiablocksgame) {setlayout (ใหม่ gridlayout (3, 1, 0, 2)); pltip.add (New Jlabel ("Next Square"), BorderLayout.north); // เพิ่มส่วนประกอบ pltip.add (pltipblock); pltip.setBorder (ชายแดน); plinfo.add (ใหม่ Jlabel ("ค่าสัมประสิทธิ์ความยาก")); plinfo.add (tflevel); plinfo.add (New Jlabel ("คะแนน")); plinfo.add (tfscore); plinfo.setBorder (ชายแดน); plbutton.add (btplay); btplay.setenabled (จริง); plbutton.add (btpause); btpause.setenabled (เท็จ); plbutton.add (btstop); btstop.setenabled (เท็จ); plbutton.add (btturnlevelup); plbutton.add (btturnleveldown); plbutton.add (tftime); plbutton.setBorder (ชายแดน); tfevel.seteditable (เท็จ); tfscore.seteditable (เท็จ); tftime.seteditable (เท็จ); เพิ่ม (pltip); เพิ่ม (plinfo); เพิ่ม (plbutton); AddkeyListener (keyadapter ใหม่ () {@Override โมฆะสาธารณะ keypressed (keyEvent ke) {ถ้า (! game.isplaying ()) {return;} ersblock block = game.getCurblock () switch (ke.getKeyCode () block.moveleft (); btplay.addactionListener (ใหม่ actionListener () {// เริ่มเกม @Override โมฆะสาธารณะ ActionPerformed (ActionEvent AE) {game.playgame ();}}); btpause.addactionListener (ใหม่ actionListener () {// หยุดชั่วคราวเกม @Override โมฆะสาธารณะ actionperformed (ActionEvent AE) {ถ้า (btpause.getText (). เท่ากับ ("หยุด") {game.pausegame (); btstop.addactionListener (ใหม่ actionListener () {// หยุดเกม @Override โมฆะสาธารณะ ActionPerformed (ActionEvent AE) {game.stopGame ();}}); btturnlevelup.addactionListener (ใหม่ actionListener () {// เพิ่มความยากลำบาก @Override โมฆะสาธารณะ ActionPerformed (ActionEvent AE) {ลอง {int level = integer.parseint (tfevel.getText ()); ถ้า (ระดับ <russiablocksgame (numberFormatexception e) {} requestfocus ();}}); btturnleveldown.addactionListener (ใหม่ actionListener () {// ลดความยากของเกม @Override โมฆะสาธารณะ ActionPerformed (ActionEvent AE) {ลอง {int level = integer.parseint (tflevel.getText ()); ถ้า (ระดับ> 1) } requestfocus ();}}); addComponentListener (ComponentAdapter ใหม่ () {@Override โมฆะสาธารณะส่วนประกอบ (ComponentEvent Ce) {pltipblock.adjust ();}}); จับเวลา = ตัวจับเวลาใหม่ (1,000, ActionListener ใหม่ () {@Override โมฆะสาธารณะ ActionPerformed (ActionEvent AE) {รูปแบบวันที่ = ใหม่ SimpledateFormat ("เวลา: HH: MM: SS"); Game.getScore ()); timer.start (); } / *** ตั้งค่าสไตล์ของหน้าต่างพรีเพลย์** @param สไตล์ int ซึ่งสอดคล้องกับค่า 28 ค่าในรูปแบบของคลาส ersblock* / โมฆะสาธารณะ settipstyle (สไตล์ int) {pltipblock.setstyle (สไตล์); } /*** รับระดับเกมที่กำหนดโดยผู้ใช้ * * @return int, ระดับความยาก, 1-esblocksgame.max_level */ public int getLevel () {ระดับ int = 0; ลอง {level = integer.parseint (tfevel.getText ()); } catch (numberFormatexception e) {} ระดับการส่งคืน; } /*** ให้ผู้ใช้แก้ไขระดับความยากของเกม * * @param ระดับเกมแก้ไขระดับความยาก */ โมฆะสาธารณะ setlevel (ระดับ int) {ถ้า (ระดับ> 0 && ระดับ <11) {tflevel.settext ("" + ระดับ); }} /*** ตั้งค่าสถานะของปุ่ม "เริ่ม" */ โมฆะสาธารณะ setPlayButtonEnable (เปิดใช้งานบูลีน) {btplay.setEnabled (เปิดใช้งาน); } โมฆะสาธารณะ setPauseButtonEnable (เปิดใช้งานบูลีน) {btpause.setEnabled (เปิดใช้งาน); } โมฆะสาธารณะ setPauseButtonLabel (การหยุดบูลีน) {btpause.settext (หยุดชั่วคราว? "หยุดชั่วคราว": "ดำเนินการต่อ"); } โมฆะสาธารณะ setStopButtonEnable (เปิดใช้งานบูลีน) {btstop.setEnabled (เปิดใช้งาน); } โมฆะสาธารณะ setTurnlevelupbuttonenable (เปิดใช้งานบูลีน) {btturnlevelup.setenabled (เปิดใช้งาน); } โมฆะสาธารณะ setTurnleveldownbuttonenable (เปิดใช้งานบูลีน) {btturnleveldown.setenabled (เปิดใช้งาน); } / *** รีเซ็ตแผงควบคุม* / โมฆะสาธารณะรีเซ็ต () {tfscore.settext ("0"); pltipblock.setstyle (0); } / *** คำนวณขนาดของกล่องเล็ก ๆ ในกล่อง [] [] ใน Tippanel* / โมฆะสาธารณะปรับ () {pltipblock.adjust (); } /*** รายละเอียดการใช้งานคลาสของหน้าต่างพรีเพลย์* /คลาสสาธารณะ Tippanel ขยาย JPanel {// Tippanel ใช้เพื่อแสดงรูปร่างของบล็อกถัดไปเพื่อปรากฏตัวต่อเนื่องแบบคงที่ สีส่วนตัวสี backcolor = color.darkgray, frontcolor = color.white; private ersbox [] [] boxes = new ersbox [esblock.boxes_rows] [esblock.boxes_cols]; สไตล์ int ส่วนตัว, boxwidth, boxheight; บูลีนส่วนตัว istiled = false; / *** constructor คลาสหน้าต่างที่แสดงก่อนหน้านี้*/ Public Tippanel () {สำหรับ (int i = 0; i <boxes.length; i ++) {สำหรับ (int j = 0; j <boxes [i] .length; j ++) {boxes [i] [j] = ersbox ใหม่ (เท็จ); }}} / *** ตั้งค่าสไตล์บล็อกของหน้าต่างก่อนการแสดง** @param สไตล์ int ซึ่งสอดคล้องกับ 28 ค่าในรูปแบบของคลาส ersblock* / โมฆะสาธารณะ setstyle (สไตล์ int) {this.style = style; ทาสีใหม่ (); } /*** เขียนทับฟังก์ชั่นของคลาส JComponent และวาดส่วนประกอบ * * @param g อุปกรณ์กราฟิกอุปกรณ์ */ @Override โมฆะสาธารณะ PaintComponent (กราฟิก g) {super.paintComponent (G); if (! istiled) {adjust (); } int key = 0x8000; สำหรับ (int i = 0; i <boxes.length; i ++) {สำหรับ (int j = 0; j <boxes [i] .length; j ++) {color color = ((key & style)! = 0? frontcolor: backcolor); G.SetColor (สี); G.Fill3Drect (J * BoxWidth, i * BoxHeight, BoxWidth, BoxHeight, True); คีย์ >> = 1; }}} / *** g ปรับขนาดของสี่เหลี่ยมโดยอัตโนมัติตามขนาดของหน้าต่าง* / โมฆะสาธารณะปรับ () {boxWidth = getSize (). ความกว้าง / ersblock.boxes_cols; BoxHeight = getSize (). ความสูง / ersblock.boxes_rows; istiled = true; -ersbox.java
แพ็คเกจ Russiablocksgame; นำเข้า Java.awt.Dimension; / *** คลาสสแควร์เป็นองค์ประกอบพื้นฐานที่ประกอบขึ้นเป็นบล็อกและใช้สีของตัวเองเพื่อแสดงถึงลักษณะของบล็อก*/ คลาสสาธารณะ ersbox ใช้ cloneable {บูลีนส่วนตัว iscolor; ขนาดมิติส่วนตัว = มิติใหม่ (); / ** * ตัวสร้างของคลาสสแควร์, * * @param iscolor ใช้สีพื้นหน้าเพื่อใช้สีพื้นหน้าจริงสี่เหลี่ยมจัตุรัสนี้, สีพื้นหลังการใช้เท็จ */ ersbox สาธารณะ (บูลีน iscolor) {this.iscolor = iscolor; } / *** เป็นสี่เหลี่ยมจัตุรัสที่แสดงในสีเบื้องหน้า** @return บูลีนจริงที่แสดงในสีเบื้องหน้าเท็จแสดงในสีพื้นหลัง* / บูลีนสาธารณะ iscolorbox () {return iscolor; } / ** * ตั้งค่าสีของสแควร์, * * @param iscolor boolean, จริงที่แสดงในสีเบื้องหน้า, เท็จแสดงในสีพื้นหลัง * / โมฆะสาธารณะ setcolor (บูลีน iscolor) {this.iscolor = iscolor; } / *** รับขนาดของสี่เหลี่ยมจัตุรัสนี้** @@return ขนาดขนาดของสี่เหลี่ยม* / มิติสาธารณะได้รับ () {ขนาดคืน; } / ** * ตั้งขนาดของสี่เหลี่ยมจัตุรัส * * @param ขนาดขนาดของสแควร์ * / โมฆะสาธารณะ setsize (ขนาดมิติ) {this.size = size; } / *** เขียนทับวัตถุของวัตถุ (), ใช้โคลน** @return Object, ผลลัพธ์การโคลน* / @Override Object Object Clone () {Object Clone = NULL; ลอง {clone = super.clone (); } catch (exception ex) {ex.printstacktrace (); } กลับโคลน; -ersblock.java
แพ็คเกจ Russiablocksgame; / *** คลาสบล็อกที่สืบทอดมาจากคลาสเธรด (เธรด) ประกอบด้วย 4 × 4 บล็อก (ersbox), การควบคุมการเคลื่อนไหว, การตก, การเสียรูปของบล็อก, ฯลฯ*/ คลาส ersblock ขยายเธรด {/ *** จำนวนแถวที่ถูกบล็อกเป็น 4 แถว*/ สาธารณะสุดท้าย / *** จำนวนคอลัมน์ที่ถูกครอบครองโดยบล็อกคือ 4 คอลัมน์*/ สาธารณะสุดท้าย int int คงสุดท้ายของสาธารณะ = 4; / *** ปัจจัยที่ทำให้การอัพเกรดมีการเปลี่ยนแปลงอย่างราบรื่นเพื่อหลีกเลี่ยงความแตกต่างของความเร็วเกือบสองเท่าระหว่างขั้นตอนสุดท้าย*/ สาธารณะระดับสุดท้ายคงที่ระดับคงที่ระดับคงที่ _flatness_gene = 3; / ** * อะไรคือความแตกต่างระหว่างสองระดับที่คล้ายกันของบล็อกสำหรับแต่ละแถว (มิลลิวินาที) */ int คงสุดท้ายสุดท้ายของสาธารณะระหว่าง _levels_degress_time = 50; / ** * จำนวนสไตล์ของบล็อกคือ 7 */ สาธารณะสุดท้ายคงที่ int block_kind_number = 7; / ** * ประเภทสถานะการผกผันของบล็อกของแต่ละสไตล์คือ 4 */ สาธารณะสุดท้ายคงที่ int block_status_number = 4; /*** 28 สถานะที่สอดคล้องกับ 7 รุ่นตามลำดับ*/สาธารณะสุดท้ายคงที่ int [] [] styles = {// ทั้งหมด 28 สถานะ {0x0f00, 0x4444, 0x0f00, 0x4444}, // สี่สถานะของแถบยาว {0x04e0, 0x0464, 0x0464, 0x0464, 0x0464 0x6c00, 0x4620, 0x6c00}, // สี่สถานะของ reverse z type {0x2640, 0xc600, 0x2640, 0xc600}, // สี่สถานะของ Z {0x6220, 0x1700, 0x2220, 0x0740} 0x44c0, 0x8e00}, // สี่สถานะของผกผัน 7 ประเภท {0x0660, 0x0660, 0x0660, 0x0660}, // สี่สถานะของบล็อก}; Gamecanvas Private Canvas; private ersbox [] [] boxes = new ersbox [boxes_rows] [boxes_cols]; สไตล์ int ส่วนตัว, y, x, ระดับ; บูลีนส่วนตัวหยุด = เท็จย้าย = true; / *** constructor สร้างบล็อกเฉพาะ** @param สไตล์สไตล์ของบล็อกซึ่งสอดคล้องกับหนึ่งใน 28 ค่าของสไตล์* @param y จุดเริ่มต้นตำแหน่งพิกัดเส้นในมุมซ้ายบนในผืนผ้าใบ* @param x ตำแหน่งเริ่มต้นที่มุมบนของการแข่งขัน ระดับ, gamecanvas canvas) {this.style = style; this.y = y; this.x = x; this.level = ระดับ; this.canvas = canvas; int key = 0x8000; สำหรับ (int i = 0; i <boxes.length; i ++) {สำหรับ (int j = 0; j <boxes [i] .length; j ++) {boolean iscolor = (สไตล์ & คีย์)! = 0); กล่อง [i] [j] = ersbox ใหม่ (iscolor); คีย์ >> = 1; } } แสดง(); } / *** ฟังก์ชั่นการเรียกใช้ () ของคลาสเธรดครอบคลุมและวางบล็อกจนบล็อกไม่สามารถล้มลงอีกครั้ง* / @Override โมฆะสาธารณะ Run () {ในขณะที่ (เคลื่อนไหว) {ลอง {sleep (ระหว่าง _levels_degress_time* (Russiablocksgame.max_level } catch (interruptedException ie) {ie.printStackTrace (); } // การเคลื่อนไหวที่ตามมาหมายความว่าการเคลื่อนไหวไม่ได้เปลี่ยนไปในช่วง 100 มิลลิวินาทีของการรอถ้า (หยุดชั่วคราว) {moving = (moveto (y + 1, x) && การเคลื่อนไหว); }}}} / ** * บล็อกย้ายหนึ่งกริดไปทางซ้าย * / โมฆะสาธารณะ moveleft () {moveto (y, x - 1); } / ** * บล็อกย้ายหนึ่งกริดไปทางขวา * / โมฆะสาธารณะ moveright () {moveto (y, x + 1); } / ** * บล็อกเคลื่อนย้ายหนึ่งกริดไปทางขวา * / โมฆะสาธารณะย้าย () {moveto (y + 1, x); } / *** ตัวแปรบล็อก* / โมฆะสาธารณะ turnnext () {สำหรับ (int i = 0; i <block_kind_number; i ++) {สำหรับ (int j = 0; j <block_status_number; j ++) {if (styles [i] [j] == สไตล์) Turnto (Newstyle); กลับ; }}}} โมฆะสาธารณะ startMove () {pausing = false; ย้าย = จริง; } /** * Pause the whereabouts of the block, corresponding to the game pause*/ public void pauseMove() { pausing = true; // moving = false; } /** * Continue the whereabouts of the block, corresponding to the game continue*/ public void resumeMove() { pausing = false; moving = true; } /** * Stop the whereabouts of the block, corresponding to the game pause*/ public void stopMove() { pausing = false; moving = false; } /** * Remove the current block from the corresponding position of the canvas and will not be reflected until the next time you repaint the canvas*/ private void erase() { for (int i = 0; i < boxes.length; i++) { for (int j = 0; j < boxes[i].length; j++) { if (boxes[i][j].isColorBox()) { ErsBox box = canvas.getBox(i + y, j + x); if (box == null) { continue; } box.setColor(false); } } } } } /** * Let the current block be placed in the corresponding position of the canvas, and you have to wait until the next time you repaint the canvas*/ private void display() { for (int i = 0; i < boxes.length; i++) { for (int j = 0; j < boxes[i].length; j++) { if (boxes[i][j].isColorBox()) { ErsBox box = canvas.getBox(i + y, j + x); if (box == null) { continue; } box.setColor(true); } } } } } /** * Can the current block be moved to the location specified by newRow/newCol* * @param newRow int, the destination line* @param newCol int, destination column * @return boolean, true-can move, false-cannot move*/ public boolean isMoveAble(int newRow, int newCol) { erase(); for (int i = 0; i < boxes.length; i++) { for (int j = 0; j < boxes[i].length; j++) { if (boxes[i][j].isColorBox()) { ErsBox box = canvas.getBox(i + newRow, j + newCol); if (box == null || (box.isColorBox())) { display(); return false; } } } } แสดง(); return true; } /** * Move the current block to the location specified by newRow/newCol* * @param newRow int, destination row* @param newCol int, destination column* @return boolean, true-move successfully, false-move failed*/ private synchronized boolean moveTo(int newRow, int newCol) { if (!isMoveAble(newRow, newCol) || !moving) { return false; } erase(); y = newRow; x = newCol; แสดง(); canvas.repaint(); return true; } /** * Can the current block become the block style specified by newStyle, mainly considering the boundary and being blocked by other blocks and cannot be moved* * @param newSytle int, the block style you want to change corresponds to one of the 28 values of STYLES* @return boolean, true-can change, false-cannot change*/ private boolean isTurnAble(int newStyle) { int key = 0x8000; erase(); for (int i = 0; i < boxes.length; i++) { for (int j = 0; j < boxes[i].length; j++) { if ((newStyle & key) != 0) { ErsBox box = canvas.getBox(i + y, j + x); if (box == null || (box.isColorBox())) { display(); return false; } } key >>= 1; } } แสดง(); return true; } /** * Turn the current block into the block style specified by newStyle* * @param newStyle int, the block style you want to change, corresponding to one of the 28 values of STYLES* @return true-change succeeds, false-change fails*/ private boolean turnTo(int newStyle) { if (!isTurnAble(newStyle) || !moving) { return false; } erase(); int key = 0x8000; for (int i = 0; i < boxes.length; i++) { for (int j = 0; j < boxes[i].length; j++) { boolean isColor = ((newStyle & key) != 0); boxes[i][j].setColor(isColor); key >>= 1; } } style = newStyle; แสดง(); canvas.repaint(); return true; -Main.java
package RussiaBlocksGame; /** * Program entry function* * @param args String[], accompanied by command line parameters*/ public class Main { public static void main(String[] args) { new RussiaBlocksGame("Tetris: Yang Yujie"); - ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น