บทความนี้อธิบายถึงเกม 2048 ที่ใช้โดย Java แบ่งปันสำหรับการอ้างอิงของคุณดังนี้:
มาดูเอฟเฟกต์การวิ่ง:
รหัสเฉพาะมีดังนี้:
แพ็คเกจ awtdemo; นำเข้า javax.swing.*; นำเข้า java.awt.*; นำเข้า java.awt.event.*; นำเข้า java.io.*; นำเข้า Java.util.*; @suppresswarnings up = 0, ลง = 1, ซ้าย = 2, ขวา = 3; int คงสุดท้ายคงที่ int wid = 150, sp = 10; @suppresswarnings ("ไม่ได้ใช้") คะแนน int ส่วนตัว = 0; Jlabel Scorelabel ส่วนตัวคงที่; การเปลี่ยนแปลงบูลีนส่วนตัว CheckMode = FALSE, GameOverFlag = FALSE, SuccessFlag = FALSE; Private Int [] label = {2,4,8,16,32,64,128}; สีส่วนตัว [] clo = {สีใหม่ (200,200,200), สีใหม่ (228,228,160), สีใหม่ (214,163,92), สีใหม่ (234,124,72), สีใหม่ (240,84,77), สีใหม่ (255,68,53) สีใหม่ @suppresswarnings ("rawtypes") แผนที่ส่วนตัว cmap = new hashmap (); public Static rectobject [] [] rset = rectobject ใหม่ [4] [4]; public rectobject [] [] list = rectobject ใหม่ [4] [4]; ส่วนตัว my2048panel myp; @suppresswarnings ("Rawtypes") Savelist LinkedList ส่วนตัว = new LinkedList (); ส่วนตัว JButton GoBackButton; keyListener kl = new keyListener () {โมฆะสาธารณะคีย์กด (KeyEvent E) {savethestep (); GoBackButton.setVisible (จริง); if (gameOverflag == true) {return; } if (! adiRable ()) {gameover (); } int key = e.getKeyCode (); สวิตช์ (คีย์) {case keyeVent.vk_up: เปลี่ยน = false; MoveUp (จริง); ถ้า (เปลี่ยน == จริง) {getArandomRect (); // savethestep (); } หยุดพัก; Case KeyEvent.vk_down: Change = False; ย้าย (จริง); ถ้า (เปลี่ยน == จริง) {getArandomRect (); // savethestep (); } หยุดพัก; Case KeyEvent.vk_left: เปลี่ยน = false; Moveleft (จริง); ถ้า (เปลี่ยน == จริง) {getArandomRect (); // savethestep (); } หยุดพัก; Case KeyEvent.vk_right: เปลี่ยน = false; Moveright (จริง); ถ้า (เปลี่ยน == จริง) {getArandomRect (); // savethestep (); } หยุดพัก; } // savethestep (); } โมฆะสาธารณะ KeyTyped (KeyEvent E) {} โมฆะสาธารณะ Keyleleased (KeyEvent E) {}}; คลาส rectobject {ค่า int ส่วนตัว; public rectobject () {value = 0; } rectObject สาธารณะ (rectobject obj) {value = obj.value; } บูลีนสาธารณะเท่ากับ (วัตถุ inobj) {rectobject obj = (rectobject) inobj; if (obj.value == ค่า) {return true; } return false; }} จุดคลาส {int x; int y; จุดสาธารณะ (int i, int j) {x = i; y = j; }} คลาส my2048panel ขยาย jpanel {private int [] xindex = {sp, 2*sp+wid, 3*sp+2*wid, 4*sp+3*wid}; ส่วนตัว int [] yindex = {sp, 2*sp+wid, 3*sp+2*wid, 4*sp+3*wid}; @suppresswarnings ("การเสื่อมราคา") โมฆะสาธารณะ PaintComponent (กราฟิก g) {// พื้นหลัง super.paintComponent (G); สำหรับ (int i = 0; i <xindex.length; i ++) {สำหรับ (int j = 0; j <yindex.length; j ++) {g.setcolor (color.white); G.DrawRoundRect (XINDEX [I], Yindex [J], wid, wid, wid/5, wid/5); G.SetColor (สีใหม่ (197,183,129)); G.FillRoundRect (XINDEX [I], Yindex [J], wid, wid, wid/5, wid/5); }} // สีสี่เหลี่ยมสำหรับ (int i = 0; i <4; i ++) {สำหรับ (int j = 0; j <4; j ++) {ถ้า (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 ((สี) cmap.get (rset [i] [j] .value)); } else {g.setColor ((สี) cmap.get (128)); } G.FillRoundRect (Yindex [J], XINDEX [i], wid, wid, wid/5, wid/5); G.SetColor (color.black); FONT FONT = FONT ใหม่ ("Timesroman", Font.Bold, 50); G.SetFont (แบบอักษร); FontMetrics FM = Toolkit.getDefaultToolkit (). getFontMetrics (ตัวอักษร); 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 (); }}}}}}} คลาส gameoverpone ขยาย jPanel {public gameoverpane (int w, int h) {setsize (w, h); // setopaque (เท็จ); } @suppresswarnings ("การเสื่อมสภาพ") โมฆะสาธารณะ PaintComponent (กราฟิก g) {super.paintComponent (G); FONT FONT = FONT ใหม่ ("Timesroman", Font.Bold, 80); G.SetFont (แบบอักษร); FontMetrics FM = Toolkit.getDefaultToolkit (). getFontMetrics (ตัวอักษร); int width = fm.stringwidth ("game over"); ความสูง int = fm.getheight (); G.SetColor (สีใหม่ (255,0,0)); G.DrawString ("Game Over!", GetWidth ()/2-Width/2, Getheight ()/2-Height/2); }} คลาส SuccessPane ขยาย JPanel {Public SuccessPane (int w, int h) {setSize (w, h); // setopaque (เท็จ); } โมฆะสาธารณะ PaintComponent (กราฟิก g) {super.paintComponent (G); FONT FONT = FONT ใหม่ ("Timesroman", Font.Bold, 80); G.SetFont (แบบอักษร); @suppresswarnings ("การเสื่อมราคา") FontMetrics FM = Toolkit.getDefaultToolkit (). getFontMetrics (แบบอักษร); int width = fm.stringwidth ("ความสำเร็จ!"); ความสูง int = fm.getheight (); G.SetColor (สีใหม่ (255,0,0)); G.DrawString ("Success!", GetWidth ()/2-Width/2, Getheight ()/2-Height/2); }} โลโก้คลาสขยาย JPanel {โลโก้สาธารณะ (int w, int h) {setSize (w, h); } @suppresswarnings ("ไม่ได้ใช้") โมฆะสาธารณะ PaintComponent (กราฟิก g) {super.paintComponent (G); FONT FONT = FONT ใหม่ ("Timesroman", Font.Bold, 60); G.SetFont (แบบอักษร); @suppresswarnings ("การเสื่อมราคา") FontMetrics FM = Toolkit.getDefaultToolkit (). getFontMetrics (แบบอักษร); ความกว้าง int = fm.stringwidth ("2048"); ความสูง int = fm.getheight (); G.SetColor (สีใหม่ (255,0,0)); G.DrawString ("2048", 20, Getheight ()/2+20); }} คลาสสาธารณะ GoBackListener ใช้ ActionListener {@suppresswarnings ("Rawtypes") โมฆะสาธารณะ ActionPerformed (ActionEvent E) {ถ้า (savelist.size () == 0) {GoBackButton.setVisible (เท็จ); กลับ; } arrayList arr = (arraylist) savelist.getLast (); scorelabel.settext (""+arr.get (0)); สำหรับ (int i = 0; i <4; i ++) {สำหรับ (int j = 0; j <4; j ++) {int num = (int) arr.get (4*i+j+1); if (num! = 0) {rset [i] [j] = rectobject ใหม่ (); rset [i] [j] .value = num; } else {rset [i] [j] = null; }}} savelist.removelast (); ทาสีใหม่ (); }} คลาสสาธารณะ ResetListener ใช้ ActionListener {โมฆะสาธารณะ ActionPerformed (ActionEvent E) {RefreshBest (); สำหรับ (int i = 0; i <4; i ++) {สำหรับ (int j = 0; j <4; j ++) {rset [i] [j] = null; }} scorelabel.settext ("0"); ทาสีใหม่ (); getarandomrect (); getarandomrect (); }} // Applet Init Public Public Init () {container cp = getContentPane (); cp.setLayout (null); cp.setFocusable (จริง); cp.addkeyListener (KL); FONT FONT = FONT ใหม่ ("TimesNewman", Font.Bold, 30); Jlabel SL = new Jlabel (); SL.SetLayout (ใหม่ gridlayout (2,1)); JLabel SLLB = new JLabel ("คะแนน"); sllb.setfont (แบบอักษร); scorelabel = new Jlabel ("0"); Scorelabel.setFont (แบบอักษร); Sl.add (SLLB); Sl.add (Scorelabel); int best = 0; ลอง {file file = ไฟล์ใหม่ ("bestRecord"); if (file.exists ()) {randomaccessfile f = new randomaccessFile (ไฟล์, "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 (ใหม่ gridlayout (2,1)); Jlabel JL = new Jlabel ("ดีที่สุด"); Jl.SetFont (แบบอักษร); Jlabel Jl1 = new Jlabel (""+ดีที่สุด); JL1.SetFont (แบบอักษร); bsl.add (JL); bsl.add (JL1); myp = ใหม่ my2048panel (); โลโก้โลโก้ = โลโก้ใหม่ (0,0); GoBackButton = new JButton ("undo"); GoBackButton.SetFont (แบบอักษร); GoBackButton.AddactionListener (New GoBackListener ()); GoBackButton.addkeyListener (KL); JButton JB = New JButton ("RESET"); JB.SetFont (แบบอักษร); jb.addactionListener (ใหม่ ResetListener ()); JB.AddkeyListener (KL); SL.SetBounds (500,20,200,80); BSL.SetBounds (300,20,200,80); โลโก้ 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 ()) {ลอง {file randomAccessFile = new RandomActCessFile (f, "rw"); int num = file.readint (); scorelabel.settext (""+num); สำหรับ (int i = 0; i <4; i ++) {สำหรับ (int j = 0; j <4; j ++) {num = file.readint (); if (num! = 0) {rset [i] [j] = rectobject ใหม่ (); rset [i] [j] .value = num; }}} file.close (); } catch (filenotfoundException e) {e.printStackTrace (); } catch (ioexception e) {e.printstacktrace (); }} else {getArandomRect (); getarandomrect (); }} @suppresswarnings ("ไม่ได้ตรวจสอบ") เกมสาธารณะ 2048 () {// savethestep (); สำหรับ (int i = 0; i <7; i ++) {cmap.put (label [i], clo [i]); }} // MOVELEFT โมฆะสาธารณะ MOVELEFT (ธงบูลีน) {ClearList (รายการ); สำหรับ (int i = 0; i <4; i ++) {int k = 0; สำหรับ (int j = 0; j <4; j ++) {ถ้า (rset [i] [j]! = null) {list [i] [k ++] = rectobject ใหม่ (rset [i] [j]); }}} สำหรับ (int i = 0; i <4 && flag; i ++) {สำหรับ (int j = 0; j <3; j ++) {ถ้า (รายการ [i] [j]! = null && list [i] [j+1]! if (checkMode == false) {int sum = integer.parseInt (scorelabel.getText ()); sum+= list [i] [j] .Value; scorelabel.settext (""+ผลรวม); } รายการ [i] [j+1] = null; J ++; }}} if (ischange ()) {if (checkMode == false) {copyset (rset, list); ทาสีใหม่ (); Moveleft (เท็จ); } เปลี่ยน = true; } else {repaint (); }} // โมฆะสาธารณะโมฆะโมฆะ (ธงบูลีน) {clearlist (รายการ); สำหรับ (int i = 0; i <4; i ++) {int k = 3; สำหรับ (int j = 3; j> -1; j-) {ถ้า (rset [i] [j]! = null) {list [i] [k-] = rectobject ใหม่ (rset [i] [j]); }}} สำหรับ (int i = 0; i <4 && flag; i ++) {สำหรับ (int j = 3; j> 0; j-) {ถ้า (รายการ [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 (""+ผลรวม); } รายการ [i] [j-1] = null; J--; }}} if (ischange ()) {if (checkMode == false) {copyset (rset, list); ทาสีใหม่ (); Moveright (เท็จ); } เปลี่ยน = true; } else {repaint (); }} // การย้ายโมฆะสาธารณะ moveup (ธงบูลีน) {clearlist (รายการ); สำหรับ (int j = 0; j <4; j ++) {int k = 0; สำหรับ (int i = 0; i <4; i ++) {ถ้า (rset [i] [j]! = null) {รายการ [k ++] [j] = rectobject ใหม่ (rset [i] [j]); }}} สำหรับ (int j = 0; j <4 && ธง; j ++) {สำหรับ (int i = 0; i <3; i ++) {ถ้า (รายการ [i] [j]! = null && list [i+1] [j]! = null && list [i] [j] if (checkMode == false) {int sum = integer.parseInt (scorelabel.getText ()); sum+= list [i] [j] .Value; scorelabel.settext (""+ผลรวม); } รายการ [i+1] [j] = null; i ++; }}} if (ischange ()) {if (checkMode == false) {copyset (rset, list); ทาสีใหม่ (); MoveUp (เท็จ); } เปลี่ยน = true; } else {repaint (); }} // Movingdown Public Void Movedown (ธงบูลีน) {Clearlist (รายการ); สำหรับ (int j = 0; j <4; j ++) {int k = 3; สำหรับ (int i = 3; i> -1; i-) {ถ้า (rset [i] [j]! = null) {list [k-] [j] = rectobject ใหม่ (rset [i] [j]); }}} สำหรับ (int j = 0; j <4 && ธง; j ++) {สำหรับ (int i = 3; i> 0; i-) {ถ้า (รายการ [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 (""+ผลรวม); } รายการ [I-1] [j] = null; ฉัน--; }}} if (ischange ()) {if (checkMode == false) {copyset (rset, list); ทาสีใหม่ (); ย้าย (เท็จ); } เปลี่ยน = true; } else {repaint (); }} // ฟังก์ชั่นอื่น ๆ โมฆะส่วนตัว copyset (rectobject [] [] dst, rectobject [] [] src) {สำหรับ (int i = 0; i <4; i ++) {สำหรับ (int j = 0; j <4; j ++) }}} // ตรวจพบว่า rset แตกต่างจากรายการหรือไม่ใช่บูลีนส่วนตัว ischange () {สำหรับ (int i = 0; i <4; i ++) {สำหรับ (int j = 0; j <4; j ++) {ถ้า (rset [i] [j]! จริง; } if (rset [i] [j]! = null && list [i] [j] == null) {return true; } if (rset [i] [j] == null && list [i] [j]! = null) {return true; }} return false; } โมฆะส่วนตัว ClearList (rectobject [] [] s) {สำหรับ (int i = 0; i <s.length; i ++) {สำหรับ (int j = 0; j <s [i]. length; j ++) {s [i] [j] = null; }}} // รับสี่เหลี่ยมผืนผ้าแบบสุ่ม @suppresswarnings ({"ไม่ได้ตรวจสอบ", "rawtypes"}) โมฆะสาธารณะ getarandomrect () {arraylist list = new ArrayList (); สำหรับ (int i = 0; i <4; i ++) {สำหรับ (int j = 0; j <4; j ++) {ถ้า (rset [i] [j] == null) {list.add (จุดใหม่ (i, j)); }}}} if (list.size () == 0 &&! adiRable ()) {gameover (); กลับ; } สุ่ม rand = new random (); int index = rand.nextint (list.size ()); จุด loc = (จุด) list.get (ดัชนี); index = rand.nextint (2); rset [loc.x] [loc.y] = rectobject ใหม่ (); if (index == 1) {rset [loc.x] [loc.y] .Value = 4; } else {rset [loc.x] [loc.y] .Value = 2; }} // ตรวจพบว่ามีขั้นตอนอื่นหรือไม่บูลีนสาธารณะ adiRable () {checkMode = true; เปลี่ยน = เท็จ; Moveleft (จริง); Moveright (จริง); ย้าย (จริง); MoveUp (จริง); CheckMode = FALSE; if (เปลี่ยน == true) {return true; } else {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 = FONT ใหม่ ("Timesroman", Font.Bold, 30); JB1.SetOpaque (เท็จ); JB1.SetFont (แบบอักษร); JButton JB2 = New JButton ("Close"); jb2.setsize (jb1.getSize ()); JB2.SetOpaque (เท็จ); JB2.SetFont (แบบอักษร); jb1.addactionListener (ใหม่ actionListener () {โมฆะสาธารณะ actionperformed (actionEvent e) {scorelabel.settext ("0"); myp.remove (jl); clearlist (rset); myp.validate (); - jb2.addactionListener (ใหม่ actionListener () {โมฆะสาธารณะ actionperformed (actionEvent e) {refreshbest (); ไฟล์ f = ไฟล์ใหม่ ("lastrecord"); ถ้า (f.exists ()) {f.delete ();} system.exit (0); JL.Add (JB1); JL.Add (JB2); myp.add (JL); jl.validate (); } โมฆะสาธารณะ Gamesuccess () {JPanel Jl = New SuccessPane (myp.getWidth (), myp.getheight ()); Jl.SetOpaque (เท็จ); Jl.SetBounds (0, 0, 700, 700); JButton JB1 = new JButton ("ดำเนินการต่อ"); FONT FONT = FONT ใหม่ ("Timesroman", Font.Bold, 30); JB1.SetOpaque (เท็จ); JB1.SetFont (แบบอักษร); JButton JB2 = New JButton ("Close"); jb2.setsize (jb1.getSize ()); JB2.SetOpaque (เท็จ); JB2.SetFont (แบบอักษร); jb1.addactionListener (ใหม่ actionListener () {โมฆะสาธารณะ actionperformed (actionEvent e) {myp.remove (jl); myp.validate (); repaint ();}}); jb2.addactionListener (ใหม่ actionListener () {โมฆะสาธารณะ ActionPerformed (ActionEvent E) {RefreshBest (); System.Exit (0);}}); JL.Add (JB1); JL.Add (JB2); myp.add (JL); jl.validate (); } @suppresswarnings ("ไม่ได้ตรวจสอบ") โมฆะสาธารณะ savethestep () {ถ้า (savelist.size () <20) {@suppresswarnings ("rawtypes") arraylist arr = new ArrayList (); คะแนน int = integer.parseint (scorelabel.getText ()); arr.add (คะแนน); สำหรับ (int i = 0; i <4; i ++) {สำหรับ (int j = 0; j <4; j ++) {ถ้า (rset [i] [j]! = null) {arr.add (rset [i] [j] .value); } else {arr.add (0); }} savelist.addlast (arr); } else {savelist.removefirst (); Savethestep (); }} ชื่อสตริงคงที่สาธารณะ (Object O) {String t = O.getClass (). ToString (); if (t.indexof ("คลาส")! =-1) {t = t.substring (6); } return t; } โมฆะคงที่สาธารณะ RefreshBest () {ลอง {int best = 0; ไฟล์ f = ไฟล์ใหม่ ("bestRecord"); File RandomaccessFile; if (f.exists ()) {file = new randomaccessFile (f, "rw"); ดีที่สุด = file.readint (); file.seek (0); } else {file = new randomActEncessFile (f, "rw"); } //system.out.println("The คะแนนที่ดีที่สุดคือ "+ดีที่สุด); int cur = integer.parseint (scorelabel.getText ()); if (cur> ดีที่สุด) {file.writeint (cur); } file.close (); } catch (filenotfoundexception e1) {e1.printstacktrace (); } catch (ioexception e2) {e2.printstacktrace (); }} @suppresswarnings ("ทรัพยากร") โมฆะสแตติกสาธารณะ saverecord () {ลอง {file randomaccessFile = new RandomActCessFile (ไฟล์ใหม่ ("lastrecord"), "rw"); คะแนน int = integer.parseint (scorelabel.getText ()); file.writeInt (คะแนน); สำหรับ (int i = 0; i <4; i ++) {สำหรับ (int j = 0; j <4; j ++) {ถ้า (rset [i] [j]! = null) {file.writeint (rset [i] [j] .Value); } else {file.writeInt (0); }}}}} catch (filenotFoundException e) {E.printStackTrace (); } catch (ioexception e) {e.printstacktrace (); }} การเรียกใช้โมฆะคงที่สาธารณะ (Applet Japplet, ความกว้าง int, ความสูง int) {jframe frame = new JFrame (ชื่อ (Applet)); frame.addwindowListener (ใหม่ windowadapter () {โมฆะสาธารณะ windowclosing (windowevent e) {refreshbest (); saverecord (); //system.out.println("The คะแนนคือ "+scorelabel.getText ());}}); frame.setDefaultCloseoperation (jframe.exit_on_close); frame.getContentPane (). เพิ่ม (แอปเพล็ต); frame.setsize (ความกว้าง, ความสูง); Applet.init (); Applet.start (); frame.setVisible (จริง); } โมฆะคงที่สาธารณะหลัก (สตริง [] args) {run (game2048 (), 900, 800); -PS: ที่นี่เราขอแนะนำอีกสองเกม 2048 เกมสำหรับการอ้างอิงของคุณ (การใช้งาน JS)
ออนไลน์ 2048 เกม:
http://tools.vevb.com/games/game2048
ออนไลน์ 2048 Mini Game Digital เวอร์ชัน:
http://tools.vevb.com/games/game2048num
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับอัลกอริทึม Java ผู้อ่านที่มีความสนใจในเว็บไซต์นี้สามารถดูหัวข้อ: "โครงสร้างข้อมูล Java และการสอนอัลกอริทึม", "บทสรุปของเคล็ดลับการดำเนินงาน Java Dom", "บทสรุปของไฟล์ Java และเคล็ดลับการดำเนินการไดเรกทอรี" และ "สรุป
ฉันหวังว่าบทความนี้จะเป็นประโยชน์กับการเขียนโปรแกรม Java ของทุกคน