تصف هذه المقالة لعبة 2048 التي تنفذها Java. شاركه للرجوع إليه ، على النحو التالي:
دعونا نلقي نظرة على تأثير الجري:
الرمز المحدد كما يلي:
حزمة awtdemo ؛ استيراد javax.swing.*؛ استيراد java.awt.*؛ استيراد java.awt.event.*؛ استيراد java.io UP = 0 ، DOWN = 1 ، LEFT = 2 ، يمين = 3 ؛ خاص ثابت نهائي int wid = 150 ، sp = 10 ؛ suppressWarnings ("غير مستخدم") private int النتائج = 0 ؛ STATIC STATIC JLABEL SCORELABEL ؛ تغيير منطقي خاص ، checkMode = false ، gameoverflag = false ، successflag = false ؛ private int [] label = {2،4،8،16،32،64،128} ؛ اللون الخاص [] CLO = {New Color (200،200،200) ، لون جديد (228،228،160) ، لون جديد (214،163،92) ، لون جديد (234،124،72) ، لون جديد (240،84،77) ، لون جديد (255،68،53) ، لون جديد (200،200،64) suppresswarnings ("rawtypes") خريطة خاصة cmap = new hashmap () ؛ المستقيم الثابت العام [] [] rset = مستقيم جديد [4] [4] ؛ المستقيم العام [] [] قائمة = مستقيمة جديدة [4] [4] ؛ MyPly My2048panel myp ؛ suppressWarnings ("RawTypes") private LinkedList savavelist = new LinkedList () ؛ خاص Jbutton Gobackbutton ؛ keylistener kl = new KeyListener () {public void keypressed (keyevent e) {savethestep () ؛ GoBackButton.setVisible (صحيح) ؛ if (gameOverFlag == true) {return ؛ } if (! adiderable ()) {gameOver () ؛ } int key = e.getKeyCode () ؛ التبديل (مفتاح) {case keyevent.vk_up: تغيير = خطأ ؛ moveup (صحيح) ؛ if (change == true) {getArandomRect () ؛ // savethestep () ؛ } استراحة؛ case keyevent.vk_down: تغيير = خطأ ؛ انتقل (صحيح) ؛ if (change == true) {getArandomRect () ؛ // savethestep () ؛ } استراحة؛ case keyevent.vk_left: تغيير = false ؛ moveleft (صحيح) ؛ if (change == true) {getArandomRect () ؛ // savethestep () ؛ } استراحة؛ case keyevent.vk_right: تغيير = خطأ ؛ المحرك (صحيح) ؛ if (change == true) {getArandomRect () ؛ // savethestep () ؛ } استراحة؛ } // savethestep () ؛ } public void keytytyped (keyevent e) {} public void keyreleSeped (keyevent e) {}} ؛ فئة RectObject {private int value ؛ RectObject () {value = 0 ؛ } المستقيم العام (rectObject obj) {value = obj.value ؛ } منطقية عامة تساوي (كائن inobj) {rectObject obj = (rectObject) inobj ؛ if (obj.value == value) {return true ؛ } إرجاع خطأ ؛ }} نقطة الفئة {int x ؛ int y ؛ النقطة العامة (int i ، int j) {x = i ؛ y = j ؛ }} class my2048panel يمتد jpanel {private int [] xindex = {sp ، 2*sp+wid ، 3*sp+2*wid ، 4*sp+3*wid} ؛ private int [] yindex = {sp ، 2*sp+wid ، 3*sp+2*wid ، 4*sp+3*wid} ؛ suppressWarnings ("deprecation") paintcomponent paintcomponent paintComponent (الرسومات G) {// Background Super.paintComponent (G) ؛ لـ (int i = 0 ؛ i <xindex.length ؛ i ++) {for (int j = 0 ؛ j <yindex.length ؛ j ++) {g.setColor (color.hite) ؛ G.DrawRoundRect (Xindex [i] ، yindex [j] ، wid ، wid ، wid/5 ، wid/5) ؛ G.SetColor (New Color (197،183،129)) ؛ G.FillRoundRect (Xindex [i] ، yindex [j] ، wid ، wid ، wid/5 ، wid/5) ؛ }} // مستطيل الطلاء لـ (int i = 0 ؛ i <4 ؛ i ++) {for (int j = 0 ؛ j <4 ؛ j ++) {if (rset [i] [j]! = null) {g.setColor (color.white) ؛ G.DrawRoundRect (Yindex [J] ، Xindex [i] ، wid ، wid ، wid/5 ، wid/5) ؛ if (rset [i] [j] .value <128) {g.setColor ((color) cmap.get (rset [i] [j] .value)) ؛ } آخر {g.setColor ((color) cmap.get (128)) ؛ } g.fillRoundRect (yindex [j] ، xindex [i] ، wid ، wid ، wid/5 ، wid/5) ؛ G.SetColor (color.black) ؛ font font = new font ("TimesRoman" ، font.bold ، 50) ؛ G.SetFont (الخط) ؛ fontmetrics fm = toolkit.getDefaultToolkit (). getFontMetrics (font) ؛ int len = fm.StringWidth (""+rset [i] [j] .value) ؛ int hg = fm.getheight () ؛ G.DrawString (""+rset [i] [j] .value ، yindex [j]+wid/2-len/2 ، xindex [i]+wid/2+hg/4) ؛ if (rset [i] [j] .value == 2048 && successflag == false) {successflag = true ؛ Gamesuccess () ؛ }}}}}}} class GameOverpone يمتد JPanel {public GameOverPane (int w ، int h) {setSize (w ، h) ؛ // setopaque (false) ؛ } suppressWarnings ("deprecation") pincomponce paintcomponent (الرسومات g) {super.paintcomponent (g) ؛ font font = new font ("TimesRoman" ، font.bold ، 80) ؛ G.SetFont (الخط) ؛ fontmetrics fm = toolkit.getDefaultToolkit (). getFontMetrics (font) ؛ int width = fm.StringWidth ("Game Over") ؛ ارتفاع int = fm.getheight () ؛ G.SetColor (لون جديد (255،0،0)) ؛ G.DrawString ("Game Over!" ، getWidth ()/2-width/2 ، getheight ()/2-eight/2) ؛ }} class successpane يمتد JPanel {public successpane (int w ، int h) {setSize (w ، h) ؛ // setopaque (false) ؛ } paintComponent paintcomponent (الرسومات G) {super.paintcomponent (g) ؛ font font = new font ("TimesRoman" ، font.bold ، 80) ؛ G.SetFont (الخط) ؛ suppressWarnings ("deprecation") fontmetrics fm = toolkit.getDefaultToolkit (). getFontMetrics (font) ؛ int width = fm.StringWidth ("النجاح!") ؛ ارتفاع int = fm.getheight () ؛ G.SetColor (لون جديد (255،0،0)) ؛ G.DrawString ("النجاح!" ، getWidth ()/2-width/2 ، getheight ()/2-eight/2) ؛ }} logo class يمتد jpanel {public logo (int w ، int h) {setSize (w ، h) ؛ } suppresswarnings ("غير مستخدمة") paintcomponent paintcomponent (الرسومات G) {super.paintcomponent (g) ؛ font font = new font ("TimesRoman" ، font.bold ، 60) ؛ G.SetFont (الخط) ؛ suppressWarnings ("deprecation") fontmetrics fm = toolkit.getDefaultToolkit (). getFontMetrics (font) ؛ int width = fm.StringWidth ("2048") ؛ ارتفاع int = fm.getheight () ؛ G.SetColor (لون جديد (255،0،0)) ؛ G.DrawString ("2048" ، 20 ، getheight ()/2+20) ؛ }} الفئة العامة goBackListener تنفذ ActionListener {suppressWarnings ("RawTypes") public void actionperformed (Actionevent e) {if (savavelist.size () == 0) يعود؛ } ArrayList arr = (ArrayList) savavelist.getlast () ؛ Scorelabel.settext (""+arr.get (0)) ؛ لـ (int i = 0 ؛ i <4 ؛ i ++) {for (int j = 0 ؛ j <4 ؛ j ++) {int num = (int) arr.get (4*i+j+1) ؛ if (num! = 0) {rset [i] [j] = new rectobject () ؛ rset [i] [j] .value = num ؛ } آخر {rset [i] [j] = null ؛ }}} savavelist.removelast () ؛ REPAINT () ؛ }} reflisterener الفئة العامة تنفذ ActionListener {public void actionperformed (ActionEvent e) {RefreshBest () ؛ لـ (int i = 0 ؛ i <4 ؛ i ++) {for (int j = 0 ؛ j <4 ؛ j ++) {rset [i] [j] = null ؛ }} scorelabel.settext ("0") ؛ REPAINT () ؛ getArandomRect () ؛ getArandomRect () ؛ }} // applet init public void init () {container cp = getContentPane () ؛ cp.setlayout (null) ؛ cp.setfocusable (صحيح) ؛ cp.addkeylistener (kl) ؛ font font = new font ("TimeSnewman" ، font.bold ، 30) ؛ JLabel SL = New JLabel () ؛ SL.SetLayout (New GridLayout (2،1)) ؛ JLabel SLLB = New JLabel ("الدرجات") ؛ sllb.setfont (الخط) ؛ ScoreLabel = New Jlabel ("0") ؛ Scorelabel.setfont (الخط) ؛ SL.Add (SLLB) ؛ SL.Add (ScoreLabel) ؛ int أفضل = 0 ؛ حاول {file file = ملف جديد ("BestRecord") ؛ if (file.exists ()) {randomaccessfile f = new RandomAccessFile (file ، "rw") ؛ أفضل = f.readint () ؛ f.close () ؛ }} catch (fileNotfoundException e) {best = 0 ؛ E.PrintStackTrace () ؛ } catch (ioException e) {best = 0 ؛ E.PrintStackTrace () ؛ } jlabel bsl = new Jlabel () ؛ BSL.SetLayout (New GridLayout (2،1)) ؛ JLabel JL = New JLabel ("Best") ؛ JL.SetFont (الخط) ؛ JLabel JL1 = New JLabel (""+BEST) ؛ jl1.setfont (الخط) ؛ BSL.Add (JL) ؛ BSL.Add (JL1) ؛ myp = جديد my2048panel () ؛ شعار الشعار = شعار جديد (0،0) ؛ GoBackButton = New JButton ("undo") ؛ GoBackbutton.setfont (الخط) ؛ GoBackButton.AddActionListener (New GoebackListener ()) ؛ GoBackButton.AddKeyListener (KL) ؛ JButton JB = New JButton ("RESET") ؛ JB.SetFont (الخط) ؛ JB.AddActionListener (New ResetListener ()) ؛ jb.addkeylistener (KL) ؛ SL.SetBounds (500،20،200،80) ؛ BSL.SetBounds (300،20،200،80) ؛ Logo.SetBounds (0 ، 0 ، 600 ، 100) ؛ MyP.SetBounds (0،90،700،700) ؛ GoBackButton.SetBounds (700،250،150،60) ؛ JB.SetBounds (700،450،150،60) ؛ cp.add (sl) ؛ CP.Add (BSL) ؛ cp.add (شعار) ؛ cp.add (myp) ؛ CP.Add (GoBackButton) ؛ cp.add (jb) ؛ ملف f = ملف جديد ("lastrecord") ؛ if (f.exists ()) {try {randomaccessfile file = new RandomAccessFile (f ، "rw") ؛ int num = file.readint () ؛ Scorelabel.settext (""+num) ؛ لـ (int i = 0 ؛ i <4 ؛ i ++) {for (int j = 0 ؛ j <4 ؛ j ++) {num = file.readint () ؛ if (num! = 0) {rset [i] [j] = new rectobject () ؛ rset [i] [j] .value = num ؛ }}} file.close () ؛ } catch (fileNotFoundException e) {e.printStackTrace () ؛ } catch (ioException e) {E.PrintStackTrace () ؛ }} آخر {getArandomRect () ؛ getArandomRect () ؛ }} suppressWarnings ("Unchected") Game2048 () {// savethestep () ؛ لـ (int i = 0 ؛ i <7 ؛ i ++) {cmap.put (label [i] ، clo [i]) ؛ }} // moveleft public void moveleft (flag boolean) {clearlist (list) ؛ لـ (int i = 0 ؛ i <4 ؛ i ++) {int k = 0 ؛ لـ (int j = 0 ؛ j <4 ؛ j ++) {if (rset [i] [j]! = null) {list [i] [k ++] = new rectobject (rset [i] [j]) ؛ }}} لـ (int i = 0 ؛ i <4 && flag ؛ i ++) {for (int j = 0 ؛ j <3 ؛ j ++) {if (list [i] [j]! = null && list [i] [j+1]! = null && list [i]. if (checkMode == false) {int sum = integer.parseint (scorelabel.getText ()) ؛ sum+= list [i] [j] .value ؛ scorelabel.settext (""+sum) ؛ } قائمة [i] [j+1] = null ؛ J ++ ؛ }}} if (iSchange ()) {if (checkMode == false) {copySet (rset ، list) ؛ REPAINT () ؛ moveleft (خطأ) ؛ } التغيير = صحيح ؛ } آخر {repaint () ؛ }} // Moveright public void moveright (boolean flag) {clearlist (list) ؛ لـ (int i = 0 ؛ i <4 ؛ i ++) {int k = 3 ؛ لـ (int j = 3 ؛ j> -1 ؛ j-) {if (rset [i] [j]! = null) {list [i] [k-] = new rectobject (rset [i] [j]) ؛ }}} لـ (int i = 0 ؛ i <4 && flag ؛ i ++) {for (int j = 3 ؛ j> 0 ؛ j-) {if (list [i] [j]! = null && rip if (checkMode == false) {int sum = integer.parseint (scorelabel.getText ()) ؛ sum+= list [i] [j] .value ؛ scorelabel.settext (""+sum) ؛ } قائمة [i] [j-1] = null ؛ ي-؛ }}} if (iSchange ()) {if (checkMode == false) {copySet (rset ، list) ؛ REPAINT () ؛ المحرك (خطأ) ؛ } التغيير = صحيح ؛ } آخر {repaint () ؛ }} // moveup public void moving (follan flag) {clearlist (list) ؛ لـ (int j = 0 ؛ j <4 ؛ j ++) {int k = 0 ؛ لـ (int i = 0 ؛ i <4 ؛ i ++) {if (rset [i] [j]! = null) {list [k ++] [j] = new rectobject (rset [i] [j]) ؛ }}} لـ (int j = 0 ؛ j <4 && flag ؛ j ++) {for (int i = 0 ؛ i <3 ؛ i ++) {if (list [i] [j]! = null && list [i+1] [j]! = null && list [i]. if (checkMode == false) {int sum = integer.parseint (scorelabel.getText ()) ؛ sum+= list [i] [j] .value ؛ scorelabel.settext (""+sum) ؛ } قائمة [i+1] [j] = null ؛ i ++ ؛ }}} if (iSchange ()) {if (checkMode == false) {copySet (rset ، list) ؛ REPAINT () ؛ moveup (خطأ) ؛ } التغيير = صحيح ؛ } آخر {repaint () ؛ }} // addeddown public void quadown (boolean flag) {clearlist (list) ؛ لـ (int j = 0 ؛ j <4 ؛ j ++) {int k = 3 ؛ لـ (int i = 3 ؛ i> -1 ؛ i-) {if (rset [i] [j]! = null) {list [k-] [j] = new rectobject (rset [i] [j]) ؛ }}} لـ (int j = 0 ؛ j <4 && flag ؛ j ++) {for (int i = 3 ؛ i> 0 ؛ i-) {if (list [i] [j]! = null && rip if (checkMode == false) {int sum = integer.parseint (scorelabel.getText ()) ؛ sum+= list [i] [j] .value ؛ scorelabel.settext (""+sum) ؛ } قائمة [i-1] [j] = null ؛ أنا--؛ }}} if (iSchange ()) {if (checkMode == false) {copySet (rset ، list) ؛ REPAINT () ؛ انتقل (خطأ) ؛ } التغيير = صحيح ؛ } آخر {repaint () ؛ }} // وظائف أخرى copyset private void (rectObject [] [] dst ، rectObject [] [] src) {for (int i = 0 ؛ i <4 ؛ i ++) {for (int j = 0 ؛ j <4 ؛ j ++) {dst [i] [j] = src [i] [j] ؛ }}} // اكتشف ما إذا كان RSET مختلفًا عن القائمة أو عدم وجود منطقي خاص () {for (int i = 0 ؛ i <4 ؛ i ++) {for (int j = 0 ؛ j <4 ؛ j ++) {if (rse [i]! حقيقي؛ } if (rset [i] [j]! = null && list [i] [j] == null) {return true ؛ } if (rset [i] [j] == null && list [i] [j]! = null) {return true ؛ }} إرجاع خطأ ؛ } private void clearlist (rectObject [] [] s) {for (int i = 0 ؛ i <s.length ؛ i ++) {for (int j = 0 ؛ j <s [i] .length ؛ j ++) {s [i] [j] = null ؛ }}} // احصل على مستطيل عشوائي suppressWarnings ({"unchecked" ، "RawTypes"}) public void getarandomRect () {ArrayList list = new ArrayList () ؛ لـ (int i = 0 ؛ i <4 ؛ i ++) {for (int j = 0 ؛ j <4 ؛ j ++) {if (rset [i] [j] == null) {list.add (نقطة جديدة (i ، j)) ؛ }}}} if (list.size () == 0 &&! adiderable ()) {gameOver () ؛ يعود؛ } Random Rand = new Random () ؛ int index = rand.nextint (list.size ()) ؛ point loc = (point) list.get (index) ؛ الفهرس = rand.nextint (2) ؛ rset [loc.x] [loc.y] = new rectobject () ؛ if (index == 1) {rset [loc.x] [loc.y] .value = 4 ؛ } آخر {rset [loc.x] [loc.y] .value = 2 ؛ }} // اكتشف ما إذا كانت هناك خطوات أخرى أم لا adidable () {checkMode = true ؛ تغيير = خطأ ؛ moveleft (صحيح) ؛ المحرك (صحيح) ؛ انتقل (صحيح) ؛ moveup (صحيح) ؛ checkMode = false ؛ إذا (تغيير == صحيح) {return true ؛ } آخر {return false ؛ }} public void gameover () {gameOverFlag = true ؛ jpanel jl = new GameOverPane (myp.getWidth () ، myp.getheight ()) ؛ JL.SetBounds (0 ، 0 ، 700 ، 700) ؛ JButton JB1 = New JButton ("مرة أخرى") ؛ font font = new font ("TimesRoman" ، font.bold ، 30) ؛ jb1.setopaque (false) ؛ jb1.setfont (الخط) ؛ JButton JB2 = New JButton ("Close") ؛ jb2.SetSize (jb1.getSize ()) ؛ jb2.setopaque (false) ؛ jb2.setfont (الخط) ؛ jb1.addActeListener (new ActionListener () {public void actionperformed (actionevent e) {scorelabel.settext ("0") ؛ myp.remove (jl) ؛ clearlist (rset) ؛ myp.validate () ؛ getArandomRect () ؛ getArandomRect () ؛ jb2.AdDActionListener (new ActionListener () {public void actionPerformed (ActionEvent e) {RefreshBest () ؛ file f = new file ("lastrecord") ؛ if (f.exists ()) {f.delete () ؛} system.exit (0) ؛}}) ؛ JL.Add (JB1) ؛ JL.Add (JB2) ؛ myp.add (jl) ؛ JL.Validate () ؛ } public void gamesuccess () {jpanel jl = new successpane (myp.getWidth () ، myp.getheight ()) ؛ jl.setopaque (false) ؛ JL.SetBounds (0 ، 0 ، 700 ، 700) ؛ JButton JB1 = New JButton ("متابعة") ؛ font font = new font ("TimesRoman" ، font.bold ، 30) ؛ jb1.setopaque (false) ؛ jb1.setfont (الخط) ؛ JButton JB2 = New JButton ("Close") ؛ jb2.SetSize (jb1.getSize ()) ؛ jb2.setopaque (false) ؛ jb2.setfont (الخط) ؛ jb1.addActionListener (new ActionListener () {public void actionperformed (actionevent e) {myp.remove (jl) ؛ myp.validate () ؛ repaint () ؛}}) ؛ jb2.AdDActionListener (new ActionListener () {public void actionperformed (ActionEvent e) {RefreshBest () ؛ system.exit (0) ؛}}) ؛ JL.Add (JB1) ؛ JL.Add (JB2) ؛ myp.add (jl) ؛ JL.Validate () ؛ } suppressWarnings ("Unchecked") public void savethestep () {if (savavelist.size () <20) {suppressWarnings ("rawtypes") arraylist arr = new ArrayList () ؛ int score = integer.parseint (scorelabel.getText ()) ؛ arr.add (النتيجة) ؛ لـ (int i = 0 ؛ i <4 ؛ i ++) {for (int j = 0 ؛ j <4 ؛ j ++) {if (rset [i] [j]! = null) {arr.add (rset [i] [j] .value) ؛ } آخر {arr.add (0) ؛ }} savavelist.addlast (arr) ؛ } آخر {savavelist.RemoveFirst () ؛ savethestep () ؛ }} عنوان السلسلة الثابتة العامة (الكائن O) {String t = o.getClass (). toString () ؛ if (t.indexof ("class")! =-1) {t = t.substring (6) ؛ } إرجاع t ؛ } public static void refreshbest () {try {int best = 0 ؛ ملف f = ملف جديد ("BestRecord") ؛ ملف RandomAccessFile ؛ if (f.exists ()) {file = new RandomAccessFile (f ، "rw") ؛ Best = file.readint () ؛ file.seek (0) ؛ } آخر {file = new RandomAccessFile (f ، "rw") ؛ } //system.out.println (أفضل النتيجة هي "+الأفضل) ؛ int cur = integer.parseint (scorelabel.getText ()) ؛ if (cur> best) {file.writeint (cur) ؛ } file.close () ؛ } catch (fileNotFoundException e1) {e1.printStackTrace () ؛ } catch (ioException e2) {e2.printStackTrace () ؛ }} suppressWarnings ("Resource") public static void saverecord () {try {randomaccessfile file = new randomaccessfile (ملف جديد ("lastrecord") ، "rw") ؛ int score = integer.parseint (scorelabel.getText ()) ؛ file.writeint (SCORE) ؛ لـ (int i = 0 ؛ i <4 ؛ i ++) {for (int j = 0 ؛ j <4 ؛ j ++) {if (rset [i] [j]! = null) {file.writeint (rset [i] [j] .value) ؛ } آخر {file.writeint (0) ؛ }}}}} catch (fileNotFoundException e) {e.printstacktrace () ؛ } catch (ioException e) {E.PrintStackTrace () ؛ }} تشغيل الفراغ الثابت العام (applet applet ، عرض int ، ارتفاع int) {jframe frame = new JFrame (title (applet)) ؛ frame.addwindowlistener (new windowadapter () {public void windowsclosing (windowevent e) {RefreshBest () ؛ saverecord () ؛ //system.out.println(" درجة "+scorelabel.gettext ()) ؛}}) ؛ frame.setDefaultCloseOperation (jframe.exit_on_close) ؛ frame.getContentPane (). add (applet) ؛ Frame.SetSize (العرض ، الارتفاع) ؛ applet.init () ؛ applet.start () ؛ frame.setVisible (صحيح) ؛ } public static void main (string [] args) {run (new Game2048 () ، 900 ، 800) ؛ }}ملاحظة: هنا نوصي بلعبة 2048 أخرى للرجوع إليها (تنفيذ JS)
ألعاب 2048 على الانترنت:
http://tools.vevb.com/games/game2048
Online 2048 Mini Game Digital الإصدار:
http://tools.vevb.com/games/game2048num
لمزيد من المعلومات حول خوارزميات Java ، يمكن للقراء المهتمين بهذا الموقع عرض الموضوعات: "بنية بيانات Java وبرنامج تعليمي الخوارزمية" ، "ملخص" Tips Java ".
آمل أن يكون هذا المقال مفيدًا لبرمجة Java للجميع.