Ini adalah desain kursus terakhir untuk kursus Java. Karena Java adalah seorang pemula, saya telah merujuk ke beberapa blog ahli teknis saat melakukannya. Saya ingin mengucapkan terima kasih di sini.
Posting di sini untuk berkomunikasi dan belajar.
Jika Anda memerlukan file proyek lengkap, dokumentasi, dan file jar yang dapat dijalankan, unduh alamat: Klik untuk membuka tautan
Rusiablocksgame.java
paket rusiablocksgame; impor java.awt.*; impor java.awt.event.*; impor javax.swing.border.border; impor javax.swing.border.etchedborder; /*** Kelas game utama, diwarisi dari kelas JFRAME, bertanggung jawab atas kontrol global game. Termasuk: 1. Objek instance dari kelas Canvas Gamecanvas, * 2. Objek yang memegang instance blok aktif saat ini (RusiaBlock); 3. Objek yang memegang instance panel kontrol saat ini (ControlPanel); */ kelas publik rusiablocksgame memperluas jframe {private static final long serialversionuid = -7332245439279674749l; / *** Berapa banyak poin yang dihitung untuk setiap baris yang diisi*/ public static int int_line_score = 100; / *** Berapa banyak poin yang dapat ditingkatkan setelah akumulasi*/ public statis int static per_level_score = per_line_score* 20; / *** Seri maksimum adalah level 10*/ public static int int max_level = 10; / ** * Seri default adalah 2 */ public final static int default_level = 2; kanvas gamecanvas pribadi; blok ersblock pribadi; Playing boolean pribadi = false; ctrlpanel kontrol pribadi; // inisialisasi menu bar pribadi jmenubar bar = jmenubar baru (); Private JMenu mgame = JMenu baru ("Game"), mcontrol = JMenu baru ("kontrol"), minfo = jmenu baru ("bantuan"); Private JMenuitem Minewgame = JMenuitem baru ("Game Baru"), MisetBlockColor = JMenuitem baru ("Set Block Color ..."), MisetbackColor = JMenuitem baru ("set latar belakang ..."), miturnharder = jMenuitem baru ("Tingginya kesulitan permainan"), miturnharder = jMenuitem baru ("Tingginya kesulitan permainan"), miturnharder = jMenuitem baru ("Tingginya Game TRODY"), miturnharder = jMenuitem baru ("Tingginya Game TRODY"), miturnharder = JMenuitem baru ("Tingginya Game TRODY"), MITURNY MITurnharder = JMENUITEM ("Tinggir Game TRODY"), Miturnharder = JMENUITEM BARU ("Tinggikan Game TRODY"), MITURAT new JMenuItem("Exit"), miPlay = new JMenuItem("Start"), miPause = new JMenuItem("Pause"), miResume = new JMenuItem("Resume"), miStop = new JMenuItem("Terminate the game"), miRule = new JMenuItem("Game Rules"), miAuthor = new JMenuItem("About this game"); / *** Buat dan atur menu jendela*/ private void createMenu () {bar.add (mgame); Bar.Add (Mcontrol); bar.add (minfo); mgame.add (minewgame); mgame.addseparator (); // tambahkan garis split horizontal mgame.add (misetblockcolor); mgame.add (misetblockcolor); mgame.addseparator (); // tambahkan garis split horizontal mgame.add (miturnharder); mgame.add (miturneasier); mgame.addseparator (); // tambahkan garis split horizontal mgame.add (miexit); mcontrol.add (miplay); miplay.setenabled (true); mcontrol.add (miPause); mipause.setenabled (false); mcontrol.add (miresume); miresume.setenabled (false); mcontrol.add (mistop); mistop.setenabled (false); minfo.add (Mirule); Minfo.Add (Miauthor); setjmenubar (bar); minewgame.addactionListener (actionListener baru () {@Override public void actionPerformed (actionEvent e) {stopgame (); reset (); setlevel (default_level);}}); // Atur blok warna misetblockcolor.addactionListener (actionListener baru () {@Override public void actionPerformed (actionEvent e) {color newfrontcolor = jcolorchooser.showdialog (rusiablocksgame.this, "atur block color", cannbas. {canvas.setBlockColor (newfrontColor);}}}); // Tetapkan warna latar belakang misetbackcolor.addactionListener (actionListener baru () {@Override public void actionPerformed (actionEvent e) {color newbackcolor = jcolorchooser.showdialog (rusiablroundcrground (ini, "setelpoulor (canullround) {newback -newback (ini," ini, canvas. canvas.setBackgroundColor (newBackColor);}}); // Tentukan fungsi bilah menu "tentang" dan kotak konfirmasi muncul. Miauthor.addactionListener (ActionListener baru () {@Override public void actionPerformed (ActionEvent e) {jOptionpane.showmessagedialog (null, "rekayasa perangkat lunak (4) Kelas/N3115005372/Nyang yujie/n © Hak untuk menafsirkan adalah dimiliki oleh yuJie/n © Hak untuk menginterpretasikan adalah hak untuk menginterpretasikannya adalah Hak untuk menginterpretasikannya adalah Hak untuk menginterpretasikannya untuk menafsirkannya untuk menginterpretasikannya untuk menafsirkannya untuk menafsirkan untuk menafsirkan untuk menafsirkan, }}); // aturan permainan deskripsi mirule.addactionListener (actionListener () {@override public void actionPerformed (actionEvent e) {jOptionPane.showmessagedialog (null, "piring -piring yang berbeda dari posisi yang terdiri dari piring -piring ke atas. Layar. // Tingkatkan Kesulitan Miturnharder.AddactionListener (ActionListener baru () {@Override public void actionPerformed (actionEvent e) {int curlevel = getLevel (); if (! Playing && curlevel <max_level) {setlevel (curlevel + 1);}}}); // Kurangi kesulitan Miturneasier.AddactionListener (ActionListener baru () {@Override public void actionPerformed (actionEvent e) {int curlevel = getLevel (); if (! Playing && curlevel> 1) {setlevel (CurLevel - 1);}}}); // Keluar Tombol Tindakan Respons Miexit.AddactionListener (ActionListener baru () {@Override public void actionPerformed (actionEvent e) {system.exit (0);}}); } / *** Metode konstruktor dari kelas game utama** @param judul string, judul jendela* / public russiblocksgame (judul string) {super (judul); // atur setsize judul (500, 600); // atur ukuran jendela setlocationRelativeto (null); // atur window center createMenu (); Wadah kontainer = getContentPane (); // Buat wadah bar menu.setLayout (BorderLayout baru (6, 0)); // Atur manajer tata letak dari jendela kanvas = Gamecanvas baru (20, 15); // Buat game baru Canvas Ctrlpanel = ControlPanel baru (ini); // Buat wadah panel kontrol baru. // tambahkan canvas container.add (ctrlpanel, borderlayout.east); // Tambahkan Panel Kontrol di Kanan // Daftarkan Acara Jendela. Saat tombol tutup diklik, permainan berakhir dan sistem keluar. addWindowlistener (windowAdapter baru () {@Override public void windowclosing (windowevent we) {stopgame (); System.exit (0);}}); // Secara otomatis menyesuaikan ukuran kuadrat sesuai dengan ukuran jendela AddComponentListener (componentAdapter baru () {@Override public void componentResized (ComponentEvent CE) {canvas.adjust ();}}); setVisible (true); canvas.adjust (); } /*** Setel ulang game* /public void reset () {// Setel ulang kanvas, dan atur ulang panel kontrol ctrlpanel.setplayButtonEnable (true); ctrlpanel.setPauseButtonEnable (false); ctrlpanel.setPauseButtonLabel (true); ctrlpanel.setStopButtonEnenable (false); ctrlpanel.seturnleveldowndownbuttonenable (true); ctrlpanel.seturnlevelupbuttonenable (true); miplay.setenabled (true); mipause.setenabled (false); miresume.setenabled (false); mistop.setenabled (false); ctrlpanel.reset (); canvas.reset (); } / *** Tentukan apakah permainan masih dalam proses** @return boolean, true - masih berjalan, false -has berhenti* / public boolean isplaying () {return playing; } / *** Dapatkan blok aktif saat ini** @return ersblock, referensi ke blok aktif* / public ersblock getCurblock () {return block; } / *** Dapatkan kanvas saat ini** @return gamecanvas, referensi ke kanvas saat ini* / gamecanvas publik getCanvas () {return canvas; } / *** Mulai game* / public void playgame () {play (); ctrlpanel.setplayButtoneNable (false); ctrlpanel.setPauseButtonEnable (true); ctrlpanel.setPauseButtonLabel (true); ctrlpanel.setStopButtonEnable (true); ctrlpanel.seturnleveldowndownbuttonenable (false); ctrlpanel.seturnlevelupbuttonenable (false); mistop.setenabled (true); miturnharder.setenabled (false); miturneasier.setenabled (false); ctrlpanel.requestfocus (); // Tetapkan fokus pada panel kontrol}/*** jeda game*/jeda public void () {if (block! = Null) {block.pausemove (); } ctrlpanel.setplayButtonEnable (false); ctrlpanel.setPauseButtonLabel (false); ctrlpanel.setStopButtonEnable (true); miplay.setenabled (false); mipause.setenabled (false); miresume.setenabled (true); mistop.setenabled (true); } / *** Biarkan game yang dijeda lanjutkan* / public void resumeGame () {if (block! = Null) {block.resumeMeVove (); } ctrlpanel.setplayButtonEnable (false); ctrlpanel.setPauseButtonEnable (true); ctrlpanel.setPauseButtonLabel (true); mipause.setenabled (true); miresume.setenabled (false); ctrlpanel.requestfocus (); } / *** Pengguna menghentikan permainan* / stopgame public void () {playing = false; if (block! = null) {block.stopmove (); } ctrlpanel.setplayButtonEnable (true); ctrlpanel.setPauseButtonEnable (false); ctrlpanel.setPauseButtonLabel (true); ctrlpanel.setStopButtonEnenable (false); ctrlpanel.seturnleveldowndownbuttonenable (true); ctrlpanel.seturnlevelupbuttonenable (true); miplay.setenabled (true); mipause.setenabled (false); miresume.setenabled (false); mistop.setenabled (false); miturnharder.setenabled (true); miturneasier.setenabled (true); reset (); // atur ulang kanvas dan panel kontrol}/** * Dapatkan kesulitan yang ditetapkan oleh pemain * * @return int, kesulitan game 1-max_level */public int getLevel () {return ctrlpanel.getlevel (); } / ** * Pengguna mengatur kesulitan game * * @param level int, kesulitan game 1-max_level * / public void setlevel (level int) {if (level <11 && level> 0) {ctrlpanel.setlevel (level); }} / *** Dapatkan poin game** @return int, poin* / public int getScore () {if (canvas! = Null) {return canvas.getScore (); } return 0; } /*** Dapatkan poin game sejak upgrade terakhir. Setelah upgrade, poin ini akan dihapus** @return int, ints*/ public int getScoreForLevelupDate () {if (canvas! = Null) {return canvas.getScorEforLevelupDate (); } return 0; } / ** * Ketika integral terakumulasi ke nilai tertentu, upgrade sekali * * @return boolean, true-update successe, false-update fail * / public boolean levelUpdate () {int curlevel = getLevel (); if (curlevel <max_level) {setlevel (curlevel + 1); canvas.resetscoreforlevelupdate (); Kembali Benar; } return false; } / *** game start* / private void play () {reset (); bermain = true; Thread thread = utas baru (game baru ()); // Mulai thread game thread.start (); } / *** Laporkan game sudah lebih dari* / private void ReportGameOver () {new GameOverDialog (ini, "Tetris", "permainan berakhir, skor Anda adalah" + canvas.getScore ()); } /*** Satu putaran proses permainan, menerapkan antarmuka yang dapat dilalui. Putaran permainan adalah lingkaran besar. Dalam loop ini, setiap 100 milidetik, periksa apakah blok saat ini dalam permainan telah mencapai akhir. Jika tidak, * akan terus menunggu. Jika sampai pada akhir, itu tergantung pada apakah ada garis yang terisi penuh. Jika ada, hapus dan tambahkan poin ke pemain, dan secara acak menghasilkan blok saat ini baru dan biarkan jatuh secara otomatis. * Ketika blok baru dihasilkan, pertama -tama periksa apakah garis di bagian atas kanvas telah ditempati. Jika demikian, Anda dapat menilai permainan. */ private class Game implements Runnable { @Override public void run() { int col = (int) (Math.random() * (canvas.getCols() - 3));// Randomly generates the position of the block int style = ErsBlock.STYLES[ (int) (Math.random() * 7)][(int) (Math.random() * 4)];// Randomly generates a square dari bentuk sementara (bermain) {if (block! = null) {// blok kosong if (block.isalive ()) {coba {thread.currentThread (); Thread.sleep (500); } catch (InterruptedException IE) {IE.PrintStackTrace (); } melanjutkan; }} checfullin (); // Periksa apakah ada garis yang diisi sepenuhnya jika (isGameOver ()) {ReportGameOver (); miplay.setenabled (true); mipause.setenabled (false); miresume.setenabled (false); mistop.setenabled (false); ctrlpanel.setplayButtoneNable (true); ctrlpanel.setPauseButtonLabel (false); ctrlpanel.setStopButtonEnenable (false); kembali; } block = ersblock new (style, -1, col, getLevel (), canvas); block.start (); col = (int) (math.random () * (canvas.getCols () - 3)); style = ersblock.styles [(int) (math.random () * 7)] [(int) (math.random () * 4)]; ctrlpanel.settipstyle (gaya); }} // Periksa apakah ada garis yang diisi sepenuhnya di kanvas. Jika ada satu, hapus public void checkfulline () {for (int i = 0; i <canvas.getRows (); i ++) {int row = -1; boolean fulllinecolorbox = true; untuk (int j = 0; j <canvas.getCols (); j ++) {if (! canvas.getbox (i, j) .iscolOrbox ()) {fulllinecolorbox = false; merusak; }} if (fulllinecolorbox) {row = i--; canvas.removeline (baris); }}} // menilai apakah game telah berakhir berdasarkan apakah baris atas ditempati //@return boolean, true-the game sudah berakhir, false-gim tidak berlebihan boolean isgameover () {for (int i = 0; i <canvas.getCols (); i ++) {ersbox box = canvas.getbox (0, 0, 0, 0, 0, 0,, 0,, 0, 0, get (0, 0, get (0, 0, get (0, 0, get (0, 0, get (0, 0, get (0, 0, get (0, 0, get (0, 0, get (0, 0, get (0, 0, canvas. if (box.iscolorbox ()) {return true; }} return false; }} /*** Tentukan kotak dialog Gameover. */ @Suppresswarnings ("Serial") Private Class GameOverDialog memperluas jDialog mengimplementasikan ActionListener {private JBUTTON LAGIBUTTON, EXITBUTTON; Perbatasan Perbatasan Pribadi = Etchedborder Baru (Etchedborder.Raised, Color.White, Warna Baru (148, 145, 140)); Public GameOverDialog (JFRame Parent, String Title, String Message) {Super (Parent, Title, True); if (Parent! = null) {setSize (240, 120); this.setLocationRelativeto (Parent); Jpanel messagePanel = jpanel baru (); MessagePanel.Add (New Jlabel (pesan)); MessagePanel.SetBorder (perbatasan); Wadah wadah = this.getContentPane (); container.setLayout (GridLayout baru (2, 0, 0, 10)); container.add (MessagePanel); Jpanel choosepanel = jpanel baru (); choosepanel.setlayout (GridLayout baru (0, 2, 4, 0)); container.add (choosepanel); LagiButton = JButton baru ("Mainkan Game Lain"); EXITBUTTON = JBUTTON BARU ("Game Keluar"); choosepanel.add (jpanel baru (). add (lagibutton)); choosepanel.add (jpanel baru (). add (exitbutton)); choosepanel.setborder (perbatasan); } lagibutton.addactionListener (ini); exitbutton.addactionlistener (ini); this.setVisible (true); } @Override public void actionPerformed (ActionEvent e) {if (e.getSource () == LagiButton) {this.setVisible (false); mengatur ulang(); } lain jika (e.getSource () == EXITBUTTON) {stopgame (); System.exit (0); }}}}Gamecanvas.java
paket rusiablocksgame; impor java.awt.color; impor java.awt.graphics; impor javax.swing.jpanel; impor javax.swing.border.etchedborder; /*** kelas kanvas, dengan <jumlah baris>* <jumlah kolom> instance kelas persegi. Diwarisi dari kelas JPanel. Kelas utas ERSBLOCK secara dinamis mengubah warna grid kelas kanvas. Kelas Canvas menggunakan * untuk memeriksa warna grid untuk mencerminkan pergerakan blok ersblock. */ kelas publik GameCanvas memperluas jpanel {private static final long serialversionuid = 6732901391026089276l; Private Color Backcolor = Color.DarkGray, FrontColor = Color.White; Private Int ROWS, COLS, SCORE = 0, SCOREFORLEVELUPDATE = 0; kotak private ersbox [] []; private int boxwidth, boxheight; / *** Konstruktor kelas kanvas** @param baris int, jumlah baris kanvas* @param cols int, jumlah kolom dan kolom kanvas menentukan jumlah kotak kanvas memiliki*/ gamecanva publik (baris int, int cols) {this.rows = baris; this.cols = cols; kotak = ersbox baru [baris] [cols]; untuk (int i = 0; i <boxes.length; i ++) {for (int j = 0; j <boxes [i] .length; j ++) {boxes [i] [j] = ersbox baru (false); }} Setborder (Etchedborder baru (etchedborder.raised, color.white, new color (148, 145, 140));} / ** * Konstruktor kelas kanvas * * @param baris * @param cols * @param backcolor * @param frontcolor * / gamecanvas publik (publicoLors (@param Backcolor * @param frontcolor * / gamecanvas publik (public gamecanvas (publiccolors, gamecanvas public (publiccolor {@param gamecanvas (public colors * @param gamecanvas * ini (baris, cols); getBackgroundColor () {return backcolor;} /*** Atur warna blok game** @param warna frontcolor, warna blok* /public void setBlockColor (color frontcolor) {this.frontcolor = blokir (} {{retront color ({{retront {{retront {{retront {{{retront {{retront { * Dapatkan jumlah baris kuadrat di kanvas** @return*/ public int getRows () {Return ROWS;}/ *** Dapatkan jumlah kolom kuadrat di Canvas** @return int, jumlah public* public* Publica, public, @public, } / *** Dapatkan poin sejak upgrade terakhir** @return int, poin setelah upgrade terakhir* / int int getScoreForLevelupDate () {return scoreForlevelupDate; Rusiablocksgame.per_level_score;} / *** Dapatkan referensi kuadrat dari baris dan kolom tertentu** @return row int, baris di mana kuadrat akan direferensikan* @param col int, baris di mana kotak gets. Kotak Col <0 || G.SetColor (FrontColor); Boxwidth, Boxheight, True); oleh kelas ersboxesgame */public disinkronkan void removeline (int row) {for (int i = row; i> 0; i--) {for (int j = 0; j <cols; j ++) {box [i] [j] = (ersbox) Kotak [i-1] [j] .clone (i]; SQUARES} SCORE = RUSIBLOCKSGAME.per_LEVEL_SCORE; i ++) {for (int j = 0; j <boxes [i] .length; j ++) {boxes [i] [j] .setColor (false);Controlpanel.java
paket rusiablocksgame; impor java.awt.borderlayout; impor java.awt.color; impor java.awt.graphics; impor java.awt.gridlayout; impor java.awt.event.actionevent; impor java.awt.event.actionlistener; impor java.awt.event.componentAdapter; impor java.awt.event.componentevent; impor java.awt.event.keyadapter; impor java.awt.event.keyevent; impor java.text.dateFormat; impor java.text.simpledateFormat; impor java.util.date; impor javax.swing.jbutton; impor javax.swing.jlabel; impor javax.swing.jpanel; impor javax.swing.jtextfield; impor javax.swing.timer; impor javax.swing.border.border; impor javax.swing.border.etchedborder; /*** Kelas Panel Kontrol, diwarisi dari JPanel. Jendela pratinjau, level, skor, dan tombol kontrol ditempatkan di atasnya. */ class controlpanel memperluas jpanel {private static final long serialversionuid = 3900659640646175724l; private jTextField tflevel = new jTextField ("" + rusiablocksgame.default_level), tfscore = jTextField baru ("0"), tftime = jTextfield baru (""); private JButton btPlay = new JButton(" Start"), btPause = new JButton(" pause"), btStop = new JButton("End the game"), btTurnLevelUp = new JButton("Increase the difficulty"), btTurnLevelDown = new JButton("Reduce the difficulty"); private jpanel pltip = jpanel baru (borderlayout baru ()); private tippanel pltipblock = tippanel baru (); private jpanel plinfo = jpanel baru (gridlayout baru (4, 1)); private jpanel plbutton = jpanel baru (gridlayout baru (6, 1)); pengatur waktu privat; Perbatasan Perbatasan Pribadi = Etchedborder Baru (Etchedborder.Raised, Color.White, Warna Baru (148, 145, 140)); /*** Konstruktor kelas panel kontrol** @param game ersblocksgame, referensi instance dari kelas ersblocksgame lebih nyaman untuk secara langsung mengendalikan perilaku kelas ersblocksgame. */ Public ControlPanel (Game Final RusiaBlockSgame) {setLayout (GridLayout baru (3, 1, 0, 2)); pltip.add (jlabel baru ("persegi berikutnya"), borderlayout.north); // tambahkan komponen pltip.add (pltipblock); pltip.setborder (perbatasan); Plinfo.Add (Jlabel baru ("Koefisien Kesulitan")); plinfo.add (tflevel); plinfo.add (Jlabel baru ("skor")); plinfo.add (tfscore); plinfo.setborder (perbatasan); plbutton.add (btplay); btplay.setenabled (true); plbutton.add (btpause); btpause.setenabled (false); plbutton.add (btstop); btstop.setenabled (false); plbutton.add (btturnlevelup); plbutton.add (btturnleveldown); plbutton.add (tftime); plbutton.setborder (perbatasan); tflevel.seteditable (false); tfscore.seteditable (false); tftime.seteditable (false); tambahkan (pltip); tambahkan (plinfo); tambahkan (plbutton); addKeyListener (keyAdapter baru () {@Override public void keypressed (keyevent ke) {if (! game.isplaying ()) {return;} ersblock block = game.getCurblock (); switch (ke.getKeyCode ()) {case keyevent.vk_down: block.movedown (); block.moveleft (); btplay.addactionListener (ActionListener baru () {// Mulai game @Override public void actionPerformed (ActionEvent AE) {Game.playGame ();}}); btpause.addactionListener (ActionListener baru () {// Jeda game @Override public void actionPerformed (actionEvent ae) {if (btpause.getText (). Equals ("Pause")) {Game.paSeGame ();} else {Game.resumeMeMeMeMeMeGame ()) {Game.Pause}; btstop.addactionListener (ActionListener baru () {// Hentikan game @Override public void actionPerformed (actionEvent ae) {game.stopgame ();}}); btturnlevelup.addactionListener (actionListener () {// meningkatkan kesulitan @override public void actionPerformed (actionEvent ae) {coba {int level = integer.parseint (tflevel.getText ()); if (level <russiblocksgame.max_level) {) {leveles (level <russiblocksgame.max_level) {leveles (leveles (russiblocksgame.max_level) {level (russiblocksgame.max) {level) {level) {level (russiblocksgame) (NumberFormateSception e) {} requestFocus (); btturnleveldown.addactionListener (actionListener () {// mengurangi kesulitan permainan @override public void actionPerformed (actionEvent ae) {try {int level = integer.parseint (tflevel.getText ()); if (level> 1) {Tflevel.settext ("" " + ()); if (level> 1) {Tflevel.settext (" "" + ()); if (level> 1) {Tflevel.settext ("" +) (level) (level) (level) (level) (level) (level) {level) (level) {level {level) (level) (level) (level) {level {level) {level) {level {level) {level {level, } requestFocus (); addComponentListener (componentAdapter baru () {@Override public void componentResized (ComponentEvent CE) {pltipblock.adjust ();}}); timer = timer baru (1000, actionListener () {@Override public void actionPerformed (actionEvent ae) {dateFormat format = new SimpleDateFormat ("waktu: hh: mm: ss"); // sistem memperoleh tanggal waktu = tanggal baru (); tftime.settext (format.FORMAT.FORMAT.FORMAS Game.getScore ()); timer.start (); } / *** Atur gaya jendela pra-display** @param style int, sesuai dengan 28 nilai dalam gaya kelas ersblock* / public void settipstyle (int style) {pltipblock.setstyle (style); } /*** Dapatkan level game yang ditetapkan oleh pengguna. * * @return int, tingkat kesulitan, 1-esblocksgame.max_level */ public int getLevel () {int level = 0; coba {level = integer.parseint (tflevel.getText ()); } catch (NumberFormateException e) {} level pengembalian; } /*** Biarkan pengguna memodifikasi level kesulitan game. * * @param level yang dimodifikasi level kesulitan game */ public void setlevel (level int) {if (level> 0 && level <11) {tflevel.setText ("" + level); }} /*** Atur status tombol "Mulai". */ public void setplayButtonEnenable (boolean enable) {btplay.setEnabled (enable); } public void setPauseButtonEnenable (boolean enable) {btpause.setEnabled (enable); } public void setPauseButtonLabel (boolean jeda) {btpause.setText (jeda? "jeda": "lanjutkan"); } public void setStopButtonEnable (boolean enable) {btstop.setEnabled (enable); } public void seturnlevelupButtonEnable (boolean enable) {btturnlevelup.setEnabled (enable); } public void seturnlevelDownButtonEnable (boolean enable) {btturnleveldown.setEnabled (enable); } / *** Reset panel kontrol* / public void reset () {tfscore.setText ("0"); pltipblock.setstyle (0); } / *** Hitung ulang ukuran kotak kecil dalam kotak [] [] di Tippanel* / public void menyesuaikan () {pltipblock.adjust (); } /*** Rincian Implementasi Kelas Kelas dari Jendela Pra-Display* /Kelas Publik Tippanel Memperluas JPanel {// Tippanel digunakan untuk menampilkan bentuk blok berikutnya untuk tampil SerialVersionUID final statis pribadi = 5160553671436997616L; Private Color Backcolor = Color.DarkGray, FrontColor = Color.White; private ersbox [] [] boxes = new ersbox [esblock.boxes_rows] [esblock.boxes_cols]; Gaya int private int, boxwidth, boxheight; Private Boolean iStiled = false; / *** Konstruktor kelas jendela pra-display*/ tippanel publik () {for (int i = 0; i <boxes.length; i ++) {for (int j = 0; j <boxes [i] .length; j ++) {boxes [i] [j] = new ersbox (false); }}} / *** Atur gaya blok jendela pra-display** @param style int, sesuai dengan 28 nilai dalam gaya kelas ersblock* / public void setstyle (int style) {this.style = style; ulang (); } /*** Timpa fungsi kelas jComponent dan menggambar komponen. * * @param G Lingkungan perangkat grafis */ @Override public void catcomponent (grafik g) {super.paintComponent (g); if (! iStiled) {adjust (); } int key = 0x8000; untuk (int i = 0; i <boxes.length; i ++) {for (int j = 0; j <boxes [i] .length; j ++) {warna warna = ((kunci & gaya)! = 0? frontcolor: backcolor); g.setColor (warna); g.fill3drect (j * boxwidth, i * boxheight, boxwidth, boxheight, true); kunci >> = 1; }}} / *** G secara otomatis menyesuaikan ukuran kuadrat sesuai dengan ukuran jendela* / public void adjust () {boxwidth = getSize (). width / ersblock.boxes_cols; boxheight = getSize (). height / ersblock.boxes_rows; tertiped = true; }}}Ersbox.java
paket rusiablocksgame; impor java.awt.dimension; / *** Kelas persegi adalah elemen dasar yang membentuk blok, dan menggunakan warnanya sendiri untuk mewakili penampilan blok*/ kelas publik ErsBox mengimplementasikan {private boolean iscolor; ukuran dimensi pribadi = dimensi baru (); / ** * Konstruktor kelas persegi, * * @param iScolor apakah warna latar depan digunakan untuk mewarnai warna latar depan persegi ini, salah menggunakan warna latar belakang */ public ersbox (boolean iscolor) {this.iscolor = isColor; } / *** Apakah kuadrat ini diekspresikan dalam warna latar depan** @return boolean, benar yang diekspresikan dalam warna latar depan, palsu yang diekspresikan dalam warna latar belakang* / boolean publik iscolorbox () {return isColor; } / ** * Atur warna kuadrat, * * @param iscolor boolean, benar diekspresikan dalam warna latar depan, palsu yang diekspresikan dalam warna latar belakang * / public void setColor (boolean iscolor) {this.iscolor = isColor; } / *** Dapatkan ukuran persegi ini** @return dimensi, ukuran kuadrat* / dimensi publik getSize () {ukuran pengembalian; } / ** * Atur ukuran kuadrat, * * @param ukuran dimensi, ukuran kuadrat * / public void setsize (ukuran dimensi) {this.size = size; } / *** Timpa Clone objek objek (), mengimplementasikan clone** @return objek, hasil klon* / @Override objek publik clone () {objek clone = null; coba {clone = super.clone (); } catch (exception ex) {ex.printstacktrace (); } return clone; }}Ersblock.java
paket rusiablocksgame; / *** Kelas blok, diwarisi dari kelas utas (utas) terdiri dari 4 × 4 blok (ERSBOX), mengendalikan gerakan, jatuh, deformasi blok, dll.*/ Class Ersblock memperluas utas {/ *** Jumlah baris yang ditempati oleh blok adalah 4 baris*/ public final static boxes_rows = 4; / *** Jumlah kolom yang ditempati oleh blok adalah 4 kolom*/ public static int boxes_cols = 4; / *** Faktor yang menghaluskan perubahan upgrade untuk menghindari hampir dua kali lipat perbedaan kecepatan antara tahap terakhir*/ public static int level_flatness_gene = 3; / ** * Apa perbedaan antara dua level yang sama dari blok untuk setiap baris (milidetik) */ int statis final publik antara_levels_degress_time = 50; / ** * Jumlah gaya blok adalah 7 */ public static int block_kind_number = 7; / ** * Jenis status inversi dari blok masing -masing gaya adalah 4 */ public static int block_status_number = 4; /** * 28 states corresponding to 7 models respectively*/ public final static int[][] STYLES = { //Total 28 states {0x0f00, 0x4444, 0x0f00, 0x4444}, //Four states of long stripes {0x04e0, 0x0464, 0x00e4, 0x04c4}, //Four states of T type {0x4620, 0x6c00, 0x4620, 0x6c00}, // Empat status reverse z tipe {0x2640, 0xc600, 0x2640, 0xc600}, // Empat negara tipe {0x6220, 0x1700, 0x230, 0x0740 {0x6220, /0x1700, 0x230, 0x0740 {0x6220, /0x1700, 0x230, 0x0740 {0x6220, /0x1700, 0x230, 0x0740 {0x6220, /0x1700, 0x230, 0x0740 {0x6220, /0x1700, 0x230 {0x6220 {0x621 0x44c0, 0x8e00}, // Empat negara bagian terbalik 7 type {0x0660, 0x0660, 0x0660, 0x0660}, // Empat negara blok}; kanvas gamecanvas pribadi; private ersbox [] [] boxes = ersbox baru [boxes_rows] [boxes_cols]; gaya int private, y, x, level; private boolean jeda = false, moving = true; / *** Konstruktor, menghasilkan blok spesifik** @param gaya gaya blok, sesuai dengan salah satu dari 28 nilai gaya* @param y posisi mulai, koordinat garis di sudut kiri atas di kanvas* @param x posisi awal, koordinasikan kolom di sudut kiri atas di level level publal* @param, mengendalikan kecepatan jatuh* @param @param. level, gamecanvas canvas) {this.style = style; this.y = y; this.x = x; this.level = level; this.canvas = kanvas; int kunci = 0x8000; untuk (int i = 0; i <boxes.length; i ++) {for (int j = 0; j <boxes [i] .length; j ++) {boolean iscolor = ((style & key)! = 0); kotak [i] [j] = New Ersbox (isColor); kunci >> = 1; } } menampilkan(); } / *** Fungsi run () dari kelas utas mencakup dan menjatuhkan blok sampai blok tidak dapat jatuh lagi* / @Override public void run () {while (moving) {coba {sleep (wareat_levels_degress_time* (rusiablocksgame.max_level - level + level_flatness_gene); } catch (InterruptedException IE) {IE.PrintStackTrace (); } // Moving berikutnya berarti bahwa bergerak belum diubah selama 100 milidetik menunggu jika (! Berhenti) {moving = (moveto (y + 1, x) && moving); }}}} / ** * Blok memindahkan satu kisi ke kiri * / public void moveleft () {moveto (y, x - 1); } / ** * Blok menggerakkan satu kisi ke kanan * / public void moveright () {moveto (y, x + 1); } / ** * Blok menggerakkan satu kisi ke kanan * / public void moving () {moveto (y + 1, x); } /** * Block variant*/ public void turnNext() { for (int i = 0; i < BLOCK_KIND_NUMBER; i++) { for (int j = 0; j < BLOCK_STATUS_NUMBER; j++) { if (STYLES[i][j] == style) { int newStyle = STYLES[i][(j + 1) % BLOCK_STATUS_NUMBER]; Turnto (Newstyle); kembali; }}}} public void startMove () {PAUSING = false; bergerak = true; } /** * 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; } } } } menampilkan(); 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; menampilkan(); 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; menghapus(); 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; } } menampilkan(); 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; menampilkan(); canvas.repaint(); return true; } }Main.java
package RussiaBlocksGame; /** * 程序入口函数* * @param args String[],附带的命令行参数*/ public class Main { public static void main(String[] args) { new RussiaBlocksGame("俄罗斯方块:杨宇杰"); } } Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.