هذا هو آخر تصميم للدورة لدورات Java. نظرًا لأن Java مبتدئ ، فقد أشرت إلى بعض مدونات الخبراء الفنيين عند القيام بذلك. أود أن أعرب عن امتناني هنا.
انشر هنا للتواصل والتعلم.
إذا كنت بحاجة إلى ملفات مشاريع كاملة ، وثائق وملفات جرة قابلة للتشغيل ، تنزيل العنوان: انقر لفتح الرابط
Russianblocksgame.java
حزمة RussiAblocksgame ؛ استيراد java.awt.*؛ استيراد java.awt.event.*؛ استيراد javax.swing.border.border ؛ استيراد javax.swing.border.etchedborder ؛ /*** فئة اللعبة الرئيسية ، الموروثة من فئة JFrame ، هي المسؤولة عن السيطرة العالمية للعبة. يشمل: 1. كائن مثيل لفئة Gamecanvas Canvas ، * 2. كائن يحمل مثيل الكتلة النشطة الحالية (RussiAblock) ؛ 3. كائن يحمل مثيل لوحة التحكم الحالية (ControlPanel) ؛ */ الطبقة العامة Russiablocksgame يمتد Jframe {Private Static Final Long SerialVersionuid = -7332245439279674749L ؛ / *** كم عدد النقاط التي يتم احتسابها لكل صف ممتلئ*/ ثابت عام ثابت int per_line_score = 100 ؛ / *** كم عدد النقاط التي يمكن ترقيتها بعد التراكم*/ int static public int per_level_score = per_line_score* 20 ؛ / *** سلسلة القصوى هي المستوى 10*/ العام الثابت int max_level = 10 ؛ / ** * السلسلة الافتراضية هي 2 */ Public Final Static int default_level = 2 ؛ قماشية Gamecanvas الخاصة ؛ كتلة ersblock الخاصة ؛ اللعب المنطقي الخاص = خطأ ؛ Private ControlPanel Ctrlpanel ؛ // تهيئة شريط القائمة الخاص Jmenubar Bar = New Jmenubar () ؛ Private Jmenu Mgame = New Jmenu ("Game") ، McOntrol = New JMenu ("Control") ، minfo = new Jmenu ("Help") ؛ private jmenuitem minewgame = new jmenuitem ("new game") ، misetBlockColor = new jmenuitem ("set block color ...") ، misetbackcolor = new jmenuitem ("set background color ...") New Jmenuitem ("Exit") ، miplay = new jmenuitem ("start") ، mipause = new jmenuitem ("Pause") ، miresume = new jmenuitem ("resume") ، distop = new jmenuitem ("تنتهي اللعبة") ، mirule = new jmenuitem ( / *** إنشاء وتعيين قائمة النوافذ*/ private void reatmenu () {bar.add (mgame) ؛ Bar.Add (Mcontrol) ؛ Bar.Add (minfo) ؛ mgame.add (minewgame) ؛ mgame.addseparator () ؛ // إضافة خط الانقسام الأفقي mgame.add (misetBlockColor) ؛ mgame.add (MisetBlockColor) ؛ mgame.addseparator () ؛ // إضافة خط الانقسام الأفقي mgame.add (miturnharder) ؛ mgame.add (miturneasier) ؛ mgame.addseparator () ؛ // إضافة خط الانقسام الأفقي 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 (بار) ؛ MINEWGAME.AddActeListener (New ActionListener () {Override public void actionPerformed (ActionEvent e) {stopGame () ؛ reset () ؛ setLevel (default_level) ؛}}) ؛ . canvas.setBlockColor (NewFrontColor) ؛ // قم بتعيين لون الخلفية misetbackcolor.addActionListener (new ActionListener () {Override public void actionperformed (actionevent e) {color NewBackColor = jColorChooser.ShowDialog (newblocksgame.This ، "قم بتعيين خلفية" ، canvas.getbackrogrown Canvas.SetBackgroundColor (NewBackColor) ؛ // تحديد وظيفة شريط القائمة "حول" وصندوق التأكيد يبرز. miauthor.addActionListener (new ActionListener () {Override public void actionperformed (actionevent e) {joptionpane.showmessagedialog (null ، "برمجيات هندسة (4) فئة/n3115005372/nyang yujie/n © لكل الحق في التفسير. }) ؛ // قواعد اللعبة الوصف mirule.addActionListener (new ActionListener () {Override public void actionperformed (actionevent e) {joptionpane.showmessagedialog (NULL ، "لوحات من الأشكال المختلفة تتألف من المربعات الصغيرة في الجزء العلوي من الشاشة. ستختفي القضبان الأفقية على الفور ، حيث تتم تكديس اللاعب في نفس الوقت. // زيادة الصعوبة miturnharder.addActionListener (new ActionListener () {Override public void actionperformed (actionevent e) {int curlevel = getlevel () ؛ if (! play && curlevel <max_level) {setlevel (curlevel + 1) ؛}}}}}}}) ؛ // قلل من الصعوبة miturneasier.addActionListener (new ActionListener () {Override public void actionperformed (actionevent e) {int curlevel = getlevel () ؛ if (! play && curlevel> 1) {setlevel (curlevel - 1) ؛}}}) ؛ // exit Button Action Response miexit.addActionListener (new ActionListener () {Override public void actionperformed (actionevent e) {system.exit (0) ؛}}) ؛ } / *** طريقة مُنشأة لفئة اللعبة الرئيسية** param سلسلة العنوان ، عنوان النافذة* / public RussiablockSgame (عنوان السلسلة) {super (title) ؛ // قم بتعيين SetSize (500 ، 600) ؛ // اضبط حجم النافذة setLocationRelativeto (NULL) ؛ // اضبط Window Center CreateMenu () ؛ حاوية حاوية = getContentPane () ؛ // إنشاء شريط القائمة Container.setLayout (New BorderLayout (6 ، 0)) ؛ // قم بتعيين مدير التخطيط الخاص بـ Window Canvas = New Gamecanvas (20 ، 15) ؛ // إنشاء لعبة جديدة canvas ctrlpanel = new controlpanel (this) ؛ // إنشاء حاوية لوحة تحكم جديدة (canvas ، borderlayout.center) ؛ // إضافة canvas container.add (ctrlpanel ، borderlayout.east) ؛ // إضافة لوحة تحكم على أحداث النوافذ اليمنى //. عند النقر فوق الزر "إغلاق" ، تنتهي اللعبة وتخرج النظام. AddWIndOwListener (new windowAdapter () {Override public void windowsclosing (windowevent we) {stopGame () ؛ system.exit (0) ؛}}) ؛ . setVisible (صحيح) ؛ canvas.adjust () ؛ } /*** إعادة تعيين اللعبة* /public void reset () {// إعادة تعيين القماش ، وإعادة ضبط لوحة التحكم ctrlpanel.setplaybuttonenable (true) ؛ ctrlpanel.setpauseButtonenable (خطأ) ؛ ctrlpanel.setpausebuttonlabel (true) ؛ ctrlpanel.setstopbuttonenable (خطأ) ؛ ctrlpanel.setturnleveldownbuttonenable (صواب) ؛ ctrlpanel.setturnlevelupbuttonenable (صواب) ؛ miplay.setEnabled (true) ؛ mipause.setEnabled (false) ؛ miresume.setEnabled (false) ؛ mistop.setEnabled (false) ؛ ctrlpanel.reset () ؛ canvas.reset () ؛ } / *** تحديد ما إذا كانت اللعبة لا تزال قيد التقدم** REGANTURN BOOLEAN ، TRUE - لا تزال قيد التشغيل ، توقف FALSE -HAS* / public boolean isplaying () {return play ؛ } / *** احصل على الكتلة النشطة حاليًا** @ersblock ، الإشارة إلى الكتلة النشطة حاليًا* / public ersblock getCurblock () {return block ؛ } / *** احصل على القماش الحالي** return gamecanvas ، الإشارة إلى القماش الحالي* / public gamecanvas getCanvas () {return canvas ؛ } / *** ابدأ اللعبة* / public void playgame () {play () ؛ ctrlpanel.setplaybuttonenable (false) ؛ ctrlpanel.setpauseButtonenable (صواب) ؛ ctrlpanel.setpausebuttonlabel (true) ؛ ctrlpanel.setstopbuttonenable (صواب) ؛ ctrlpanel.setturnleveldownbuttonenable (false) ؛ ctrlpanel.setturnlevelupbuttonenable (false) ؛ mistop.setEnabled (true) ؛ miturnharder.setEnabled (false) ؛ miturneasier.setEnabled (false) ؛ ctrlpanel.requestfocus () ؛ // قم بتركيز على لوحة التحكم}/*** إيقاف التشغيل*/public void pausegame () {if (block! = null) {block.pausemove () ؛ } ctrlpanel.setPlayButtonenable (false) ؛ ctrlpanel.setpausebuttonlabel (false) ؛ ctrlpanel.setstopbuttonenable (صواب) ؛ miplay.setEnabled (false) ؛ mipause.setEnabled (false) ؛ miresume.setEnabled (true) ؛ mistop.setEnabled (true) ؛ } / *** دع اللعبة المتأكلة تتابع* / public void resumegame () {if (block! = null) {block.resumeMove () ؛ } ctrlpanel.setPlayButtonenable (false) ؛ ctrlpanel.setpauseButtonenable (صواب) ؛ ctrlpanel.setpausebuttonlabel (true) ؛ mipause.setEnabled (true) ؛ miresume.setEnabled (false) ؛ ctrlpanel.requestfocus () ؛ } / *** يوقف المستخدم اللعبة* / public void stopGame () {play = false ؛ if (block! = null) {block.stopMove () ؛ } ctrlpanel.setPlayButtonEnable (صحيح) ؛ ctrlpanel.setpauseButtonenable (خطأ) ؛ ctrlpanel.setpausebuttonlabel (true) ؛ ctrlpanel.setstopbuttonenable (خطأ) ؛ ctrlpanel.setturnleveldownbuttonenable (صواب) ؛ ctrlpanel.setturnlevelupbuttonenable (صواب) ؛ miplay.setEnabled (true) ؛ mipause.setEnabled (false) ؛ miresume.setEnabled (false) ؛ mistop.setEnabled (false) ؛ miturnharder.setEnabled (true) ؛ miturneasier.setEnabled (true) ؛ RESET () ؛ // RESET CANVAs ولوحة التحكم}/** * احصل على الصعوبة التي يحددها اللاعب * * REGANTER Int ، صعوبة في اللعبة 1-max_level */public int getlevel () {return ctrlpanel.getlevel () ؛ } / ** * يقوم المستخدم بتعيين صعوبة اللعبة * * param المستوى int ، صعوبة اللعبة 1-max_level * / public void setlevel (int level) {if (المستوى <11 && level> 0) {ctrlpanel.setlevel (المستوى) ؛ }} / *** احصل على نقاط اللعبة** @REGANT ، النقاط* / public int getScore () {if (canvas! = null) {return canvas.getScore () ؛ } العودة 0 ؛ } /*** احصل على نقاط اللعبة منذ آخر ترقية. بعد الترقية ، سيتم مسح هذه النقطة** regurn int ، ints*/ public getScoreForLevelupDate () {if (canvas! = null) {return canvas.getScoreForleVelupDate () ؛ } العودة 0 ؛ } / ** * عندما يتراكم التكامل لقيمة معينة ، ترقية مرة واحدة * * @RETURN BOOLEAN ، النجاح الحقيقي المنتظمة ، FALSE-UPDATE FAIL * / Public Boolean LevelupDate () {int curlevel = getLevel () ؛ if (curlevel <max_level) {setLevel (curlevel + 1) ؛ canvas.resetscoreforlevelupdate () ؛ العودة صحيح. } إرجاع خطأ ؛ } / *** game start* / private void play () {reset () ؛ اللعب = صحيح ؛ Thread Thread = New Thread (New Game ()) ؛ // ابدأ سلسلة موضوع اللعبة. start () ؛ } / *** تقرير أن اللعبة قد انتهت* / private void reportgameover () {new GameOverdialog (هذا ، "Tetris" ، "تنتهي اللعبة ، درجاتك هي" + canvas.getScore ()) ؛ } /*** جولة واحدة من عملية اللعبة ، وتنفيذ الواجهة القابلة للتشغيل. جولة من اللعبة هي حلقة كبيرة. في هذه الحلقة ، كل 100 ميلي ثانية ، تحقق مما إذا كانت الكتلة الحالية في اللعبة قد وصلت إلى النهاية. إذا لم يكن الأمر كذلك ، فسيستمر * الانتظار. إذا كان الأمر يتعلق بالنهاية ، فهذا يعتمد على ما إذا كان هناك خط مملوء بالكامل. إذا كان هناك ، قم بحذفه وأضف نقاطًا إلى المشغل ، وقم بإنشاء كتلة حالية جديدة بشكل عشوائي واتركها تسقط تلقائيًا. * عند إنشاء كتلة جديدة ، تحقق أولاً مما إذا كان الخط الموجود في الجزء العلوي من القماش قد تم احتلاله. إذا كان الأمر كذلك ، يمكنك الحكم على اللعبة. */ لعبة الفئة الخاصة تنفذ Runnable {Override public void run () {int col = (int) (math.random () * (canvas.getCols () - 3)) ؛ من شكل بينما (تشغيل) {if (block! = null) {// الكتلة فارغة إذا (block.isalive ()) {try {thread.currentThRead () ؛ thread.sleep (500) ؛ } catch (interruptedException ie) {ie.printStackTrace () ؛ } يكمل؛ }} checkfullline () ؛ // تحقق مما إذا كانت هناك خطوط مملوءة بالكامل إذا (isGameOver ()) {reportGameOver () ؛ miplay.setEnabled (true) ؛ mipause.setEnabled (false) ؛ miresume.setEnabled (false) ؛ mistop.setEnabled (false) ؛ ctrlpanel.setplaybuttonenable (صواب) ؛ ctrlpanel.setpausebuttonlabel (false) ؛ ctrlpanel.setstopbuttonenable (خطأ) ؛ يعود؛ } block = new ersblock (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 (النمط) ؛ }} // تحقق مما إذا كانت هناك خطوط مملوءة بالكامل في القماش. إذا كان هناك واحد ، احذفه public void checkfullline () {for (int i = 0 ؛ i <canvas.getRows () ؛ i ++) {int row = -1 ؛ منطقية fulllinecolorbox = صواب ؛ لـ (int j = 0 ؛ j <canvas.getcols () ؛ j ++) {if (! canvas.getbox (i ، j) .iscolorbox ()) {fulllinecolorbox = false ؛ استراحة؛ }} if (fulllinecolorbox) {row = i-- ؛ canvas.removeline (row) ؛ }}} // judge ما إذا كانت اللعبة قد انتهت بناءً على ما إذا كان الصف العلوي مشغولًا //@return boolean ، لقد انتهت اللعبة ، و false-shall-the game لا تنتهي لعبة boolean isgameover () {for (int i = 0 ؛ i <canvas.getcols () ؛ i ++) {ersbox box = canvas.gebox (0 ، i) ؛ if (box.iscolorbox ()) {return true ؛ }} إرجاع خطأ ؛ }} /*** حدد مربع الحوار GameOver. */ suppressWarnings ("Serial") clameoverdialog الخاصة يمتد JDialog الأدوات actionlistener {private jbutton readibutton ، exitbutton ؛ الحدود الحدودية الخاصة = New EthedBorder (EthedBorder.Raised ، color.hite ، New Color (148 ، 145 ، 140)) ؛ GameOverDialog العامة (Jframe Parent ، عنوان السلسلة ، رسالة السلسلة) {Super (Parent ، title ، true) ؛ if (parent! = null) {setSize (240 ، 120) ؛ this.setLocationRelativeto (الوالد) ؛ jpanel messagePanel = new jpanel () ؛ MessagePanel.add (New Jlabel (Message)) ؛ MessagePanel.setBorder (الحدود) ؛ حاوية الحاوية = this.getContentPane () ؛ Container.setLayout (New GridLayout (2 ، 0 ، 0 ، 10)) ؛ Container.Add (MessagePanel) ؛ jpanel choosepanel = new jpanel () ؛ ChooSepanel.setLayout (GridLayout جديد (0 ، 2 ، 4 ، 0)) ؛ حاوية. مرة أخرى button = new jbutton ("لعب لعبة أخرى") ؛ exitbutton = new jbutton ("لعبة الخروج") ؛ choosepanel.add (new jpanel (). add (مرة أخرى button)) ؛ ChooSepanel.Add (New JPanel (). Add (Exitbutton)) ؛ ChooSepanel.setBorder (الحدود) ؛ } مرة أخرى button.addActionListener (هذا) ؛ exitbutton.addActionListener (هذا) ؛ this.setVisible (صحيح) ؛ } Override public void actionPerformed (ActionEvent e) {if ( إعادة ضبط()؛ } else if ( System.exit (0) ؛ }}}}Gamecanvas.java
حزمة RussiAblocksgame ؛ استيراد java.awt.color ؛ استيراد java.awt.graphics ؛ استيراد javax.swing.jpanel ؛ استيراد javax.swing.border.etchedborder ؛ /*** Canvas Class ، مع <عدد الصفوف>* <عدد مثيلات الفئة المربعة. ورثت من فئة jpanel. يغير فئة مؤشر ترابط ersblock ديناميكيًا لون الشبكة لفئة قماش. تستخدم فئة Canvas * للتحقق من لون الشبكة لتعكس حركة كتلة ersblock. */ Class Gamecanvas العام يمتد JPanel {private Static Final Long SerialVersionuid = 6732901391026089276L ؛ ألوان خاصة بالألوان الخلفية = color.darkgray ، ألوان أمامية = color.hite ؛ صفوف int الخاصة ، cols ، النتيجة = 0 ، ScoreForleVelupDate = 0 ؛ صناديق ersbox الخاصة [] [] ؛ Private Int Boxwidth ، Boxheight ؛ / *** مُنشئ من فئة القماش** param صفوف int ، يحدد عدد صفوف القماش* @param cols int ، وعدد الأعمدة والأعمدة من القماش عدد المربعات التي يحتوي عليها القماش*/ gamecanvas العامة (int int ، int cols) {this.rows = rows ؛ this.cols = cols ؛ صناديق = ersbox جديدة [صفوف] [cols] ؛ لـ (int i = 0 ؛ i <boxes.length ؛ i ++) {for (int j = 0 ؛ j <boxes [i] .length ؛ j ++) {boxes [i] [j] = new ersbox (false) ؛ }} setBorder (new ETCHEDBORDER (ETCHEDBORDER.RAISED ، color.white ، new color (148 ، 145 ، 140) ؛} / ** * constructor of canvas class * * @param @param cols * param backcolor * @param frontcolor * / public gamecanvas (int end ، int ، int ، int ، int ، هذا (الصفوف ، cols) ؛ GetBackgroundColor () {Return BackColor ؛ * احصل على عدد الصفوف في المربع في القماش**/ int getrows () {Return Rows ؛ } / *** احصل على النقاط منذ آخر ترقية** regurn ، النقاط بعد الترقية الأخيرة* / public getScoreforlevelupDate () {return scoreforevelupdate ؛ } / *** احصل على مرجع مربع لصف معين وعمود*** RETURN ROW int ، والصف الذي يتم فيه الرجوع إلى المربع* param col int ، والصف الذي يتم فيه الرجوع إلى المربع* @return ersbox ، مرجع المربع في عمود col row* / public ersbox getbox (int row) {if (row <0 مربعات [0]. <boxes.length ؛ حجم المربع وفقًا لحجم النافذة* / الفراغ العام () {boxwidth = getSize (). (int i = row ؛ i> 0 ؛ i--) {for (int j = 0 ؛ j <cols ؛ j ++) {boxes [i] [j] = (ersbox) [i-1] [j] .clone () += Russiablocksgame.per_level_score ؛ الصناديق [i].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. يتم وضع نافذة المعاينة والمستوى والنتيجة والتحكم عليها. */ Class ControlPanel يمتد JPanel {Private Static Final Long SerialVersionuid = 3900659640646175724L ؛ private jtextfield tflevel = new jtextfield ("" + Russiablocksgame.default_level) ، tfscore = new jtextfield ("0") ، tftime = new jtextfield ("") ؛ private jbutton btplay = new jbutton ("start") ، btpause = new jbutton ("pause") ، btstop = new jbutton ("end the game") ، btturnlevelup = new jbutton ("زيادة الصعوبة") ، btturnleveldown = new jbutton (" private jpanel pltip = new jpanel (new BorderLayout ()) ؛ Tippanel pltipblock = new tippanel () ؛ private jpanel plinfo = new jpanel (GridLayout جديد (4 ، 1)) ؛ private jpanel plbutton = new jpanel (new GridLayout (6 ، 1)) ؛ مؤقت مؤقت ؛ الحدود الحدودية الخاصة = New EthedBorder (EthedBorder.Raised ، color.hite ، New Color (148 ، 145 ، 140)) ؛ /*** مُنشئ لفئة لوحة التحكم** param لعبة ersblocksgame ، مرجع مثيل لفئة ersblocksgame مريحة للسيطرة مباشرة على سلوك فئة ersblocksgame. */ Public ControlPanel (Final RussiablockSgame Game) {setLayout (New GridLayout (3 ، 1 ، 0 ، 2)) ؛ pltip.add (New Jlabel ("Next Square") ، BorderLayout.north) ؛ // إضافة مكون pltip.add (pltipblock) ؛ pltip.setborder (الحدود) ؛ Plinfo.add (New Jlabel ("معامل الصعوبة")) ؛ plinfo.add (tflevel) ؛ Plinfo.add (New Jlabel ("Score")) ؛ plinfo.add (tfscore) ؛ plinfo.setborder (الحدود) ؛ 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 (الحدود) ؛ tflevel.setedable (false) ؛ tfscore.setedable (false) ؛ tftime.setedable (false) ؛ إضافة (pltip) ؛ إضافة (plinfo) ؛ إضافة (plbutton) ؛ addKeyListener (new KeyAdapter () {Override public void keypressed (keyevent ke) {if (! game.isplaying ()) {return ؛} ersblock block = game.getCurblock () ؛ switch (ke.getkeycode ()) {case keyvent.vk_down: block.movedown () ؛ block.moveleft () btplay.addActionListener (new ActionListener () {// ابدأ لعبة Void Public ActionPerformed (ActionEvent AE) {game.playgame () ؛}}) ؛ btpause.addActionListener (new ActionListener () {// إيقاف تشغيل gameoverride public void actionperformed (actionevent ae) {if (btpause.getText (). equals ("aded")) {game.pausegame () ؛ btstop.addActionListener (new ActionListener () {// إيقاف اللعبة public actionperformed (actionevent ae) {game.stopgame () ؛}}) ؛ btturnlevelup.addActionListener (new ActionListener () {// زيادة صعوبة Override public void actionperformed (actionevent ae) {try {int level = integer.parseint (tflevel.gettext () ؛ if (level <SrosiAblocksgame.max_level) {tflevel.sette ( (numberFormatexception e) {} requestFocus () ؛ btturnleveldown.addActionListener (new ActionListener () {// قلل من صعوبة اللعبة public override actionperformed (actionevent ae) {try {int level = integer.parseint (tflevel.gettext () ؛ if (level> 1) {tflevel.settex requestFocus () ؛ addComponentListener (componentAdapter () {Override public void componentResization (componentevent ce) {pltipblock.adjust () ؛}}) ؛ Timer = New Timer (1000 ، New ActionListener () {Override public void actionperformed (ActionEvent ae) {dateformat format = new SimpleDateFormat ("time: hh: mm: ss") ؛ Game.getScore ()) ؛ Timer.Start () ؛ } / *** قم بتعيين نمط نافذة ما قبل display** param style int ، المقابلة للقيم الـ 28 في أنماط فئة ersblock* / public void sountipstyle (int style) {pltipblock.setstyle (style) ؛ } /*** احصل على مستوى اللعبة من قبل المستخدم. * * regurn int ، مستوى الصعوبة ، 1-esblocksgame.max_level */ public int getlevel () {int level = 0 ؛ حاول {level = integer.parseint (tflevel.getText ()) ؛ } catch (numberFormatexception e) {} مستوى الإرجاع ؛ } /*** دع المستخدمين يعدلون مستوى صعوبة اللعبة. * * @Param Level Modified Game Level */ public void setlevel (int level) {if (level> 0 && level <11) {tflevel.settext ("" + level) ؛ }} /*** اضبط حالة زر "ابدأ". */ public void setPlayButtonenable (Enable Boolean) {btplay.setEnabled (Enable) ؛ } public void setPauseButtonenable (Enable Boolean) {btpause.setEnabled (enable) ؛ } public void setPauseButtonLabel (Boolean Pause) {btpause.settext (إيقاف مؤقت ":" متابعة ") ؛ } public void setStopButtonenable (enable boolean) {btstop.setEnabled (enable) ؛ } public void seturnlevelupbuttonenable (enable enable) {btturnlevelup.setEnabled (enable) ؛ } public void seturnleveldownbuttonenable (Boolean Enable) {btturnleveldown.setEnabled (enable) ؛ } / *** إعادة تعيين لوحة التحكم* / public void reset () {tfscore.settext ("0") ؛ pltipblock.setStyle (0) ؛ } / *** إعادة حساب حجم المربع الصغير في الصناديق [] [] في tippanel* / public void add () {pltipblock.adjust () ؛ } /*** تفاصيل التنفيذ فئة من نافذة ما قبل display* /الفئة العامة tippanel تمتد JPanel {// tippanel لعرض شكل الكتلة التالية لتظهر serialversionuid الطويلة الثابتة = 516055361436997616L ؛ ألوان خاصة بالألوان الخلفية = color.darkgray ، ألوان أمامية = color.hite ؛ private ersbox [] [] boxes = new ersbox [esBlock.boxes_rows] [esBlock.boxes_cols] ؛ Private Int Style ، Boxwidth ، Boxheight ؛ منطقية خاصة istiled = false ؛ / *** مُنشئ فئة نافذة ما قبل display*/ public tippanel () {for (int i = 0 ؛ i <boxes.length ؛ i ++) {for (int j = 0 ؛ j <boxes [i] .length ؛ j ++) {boxes [i] = new ersbox (false) ؛ }}} / *** قم بتعيين نمط الكتلة لنافذة ما قبل display** param style int ، المقابلة لـ 28 قيمًا في أنماط فئة ersblock* / public void setStyle (int style) {this.style = style ؛ REPAINT () ؛ } /*** الكتابة فوق وظائف فئة jComponent ورسم مكونات. * * param g بيئة جهاز الرسومات */ Override public void paintcomponent (Graphics g) {super.paintcomponent (g) ؛ if (! istiled) {add () ؛ } int key = 0x8000 ؛ لـ (int i = 0 ؛ i <boxes.length ؛ i ++) {for (int j = 0 ؛ j <boxes [i] .length ؛ j ++) {color color = ((key & style)! = 0؟ G.SetColor (اللون) ؛ g.fill3drect (J * boxwidth ، i * boxheight ، boxwidth ، boxheight ، true) ؛ المفتاح >> = 1 ؛ }}} / *** g ضبط حجم المربع تلقائيًا وفقًا لحجم النافذة* / public void add () {boxwidth = getSize (). width / ersblock.boxes_cols ؛ boxheight = getTize (). الارتفاع / ersblock.boxes_rows ؛ istiled = صحيح ؛ }}}ersbox.java
حزمة RussiAblocksgame ؛ استيراد java.awt.dimension ؛ / *** الفئة المربعة هي العنصر الأساسي الذي يشكل الكتلة ، ويستخدم لونه الخاص لتمثيل ظهور الكتلة*/ الفئة العامة ersbox يطرف استنساخ {private boolean iscolor ؛ حجم البعد الخاص = البعد الجديد () ؛ / ** * يتم استخدام مُنشئ الفئة المربعة ، * * param iscolor للون المقدمة لتلوين هذا اللون المربع المربع ، واللون الخاطئ للخلفية */ public ersbox (iScolor boolean) {this.iscolor = iscolor ؛ } / *** هل هذا المربع معبر عنه باللون المقدمة** return boolean ، تم التعبير عنه صحيحًا في اللون الأمامي ، خطأ معبّر عنه في لون الخلفية* / iScolorbox () {return iscolor ؛ } / ** * اضبط لون المربع ، * * param iscolor boolean ، تم التعبير عنه بشكل صحيح في اللون الأمامي ، خطأ معبر عنه في لون الخلفية * / public void setColor (boolean iscolor) {this.iscolor = iscolor ؛ } / *** احصل على حجم هذا البعد المربع** @RETURN ، حجم المربع* / البعد العام getSize () {size return ؛ } / ** * اضبط حجم المربع ، * * * param بحجم البعد ، وحجم مربع * / public void setSize (حجم البعد) {this.size = size ؛ } / *** الكتابة فوق كائن الكائن clone () ، وتنفيذ كائن clone** return ، نتيجة استنساخ* / Override كائن عام clone () {object clone = null ؛ حاول {clone = super.clone () ؛ } catch (استثناء ex) {ex.printStackTrace () ؛ } عودة استنساخ ؛ }}ersblock.java
حزمة RussiAblocksgame ؛ / *** فئة الكتلة ، الموروثة من فئة مؤشرات الترابط (مؤشر ترابط) تتكون من 4 × 4 كتل (ersbox) ، والتحكم في الحركة ، والسقوط ، وتشوه الكتلة ، إلخ. / *** عدد الأعمدة التي تشغلها كتلة هو 4 أعمدة*/ صناديق int النهائية العامة الثابتة = 4 ؛ / *** العامل الذي يقوم بتنعيم تغييرات الترقية لتجنب ضعف الفرق في السرعة تقريبًا بين المراحل الأخيرة*/ Public Final Static int Level_Flatness_Gene = 3 ؛ / ** * ما هو الفرق بين المستويين المماثلين للكتلة لكل صف (مللي ثانية) */ int static النهائي العام بين _levels_degress_time = 50 ؛ / ** * عدد أنماط الكتل هو 7 */ public Final Static int block_kind_number = 7 ؛ / ** * نوع حالة الانعكاس من كل نمط هو 4 */ public final static int block_status_number = 4 ؛ /*** 28 حالات تتوافق مع 7 نماذج على التوالي*/public نهائي ثابت int [] [] styles = {// total 28 states {0x0f00 ، 0x4444 ، 0x0f00 ، 0x4444} ، // أربع حالات من الخطوط الطويلة {0x04e0 ، 0x0464 ، 0x00e4 0x6c00 ، 0x4620 ، 0x6c00} ، // أربع حالات من النوع z العكسي {0x2640 ، 0xc600 ، 0x2640 ، 0xc600} ، 0x44c0 ، 0x8e00} ، // أربع حالات من النوع العكسي 7 type {0x0660 ، 0x0660 ، 0x0660 ، 0x0660} ، // أربع حالات كتلة} ؛ قماشية Gamecanvas الخاصة ؛ ersbox الخاص [] [] مربعات = ersbox جديدة [boxes_rows] [boxes_cols] ؛ نمط int الخاص ، Y ، X ، المستوى ؛ توقف منطقي خاص = خطأ ، يتحرك = صحيح ؛ / *** مُنشئ ، يقوم بإنشاء كتلة محددة*** param نمط الكتلة ، المقابلة لواحدة من قيم 28 من الأنماط* param y st start ، خط التنسيق في الزاوية اليسرى العلوية في لوحة القماش* param x start الموضع ، تنسيق العمود في الزاوية اليسرى العليا في مستوى القماش* param مستوى. المستوى ، gamecanvas canvas) {this.style = style ؛ this.y = y ؛ this.x = x ؛ this.vel = المستوى ؛ this.canvas = قماش ؛ مفتاح int = 0x8000 ؛ لـ (int i = 0 ؛ i <boxes.length ؛ i ++) {for (int j = 0 ؛ j <boxes [i] .length ؛ j ++) {boolean isColor = ((style & key)! = 0) ؛ الصناديق [i] [j] = new ersbox (iScolor) ؛ المفتاح >> = 1 ؛ } } عرض()؛ } / *** تغطي وظيفة Run () لفئة مؤشرات الترابط وتسقط الكتلة حتى لا يمكن أن تسقط الكتلة مرة أخرى* / Override public void run () {بينما (تتحرك) {try {sleep (inter_levels_degress_time* (RosiBlocksgame.max_level - Level + Level_Flatness_Gene)) ؛ } catch (interruptedException ie) {ie.printStackTrace () ؛ } // يعني الحركة اللاحقة أن التحريك لم يتغير خلال 100 مللي ثانية من الانتظار إذا (! توقف) {moving = (moveto (y + 1 ، x) && moving) ؛ }}}} / ** * تقوم الكتلة بتحريك شبكة واحدة إلى اليسار * / public void moveleft () {moveto (y ، x - 1) ؛ } / ** * تقوم الكتلة بنقل شبكة واحدة إلى اليمين * / public void moveright () {moveto (y ، x + 1) ؛ } / ** * تقوم الكتلة بتحريك شبكة واحدة إلى اليمين * / public void quadown () {moveto (y + 1 ، x) ؛ } / *** block variant* / public void turnnext () {for (int i = 0 ؛ i <block_kind_number ؛ i ++) {for (int j = 0 ؛ j <block_stat_number ؛ j ++) {if (styles [i] === style) {int newStyle = styles [i] Turnto (Newstyle) ؛ يعود؛ }}}} public void startMove () {paying = 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 أكثر.