Artikel ini menjelaskan game 2048 yang diimplementasikan oleh Java. Bagikan untuk referensi Anda, sebagai berikut:
Mari kita lihat efek berjalan:
Kode spesifiknya adalah sebagai berikut:
Paket awtdemo; impor javax.swing.*; impor java.awt.*; impor java.awt.event.*; impor java.io.*; Game Java.util.*; @ @Suppresswarnings ("Serial") Public Game2048 Memperpanjang Japplet {@suppresswarnings ("Serial") Public STECK = {@suppresswarnings ("Serial") SteT = {@suppresswarnings ("Serial") Stexcing = @suppresswarnings ("Serial") private static final int wid = 150, sp = 10; @SuppressWarnings ("tidak digunakan") skor int pribadi = 0; Private Static Jlabel Scorelabel; Perubahan boolean pribadi, checkMode = false, gameoverflag = false, successflag = false; private int [] label = {2,4,8,16,32,64,128}; private Color[] clo={ new Color(200,200,200),new Color(228,228,160),new Color(214,163,92),new Color(234,124,72),new Color(240,84,77),new Color(255,68,53),new Color(200,200,64) }; @Suppresswarnings ("RawTypes") peta pribadi cmap = new HashMap (); public static rectobject [] [] rset = rectobject baru [4] [4]; Public Rectobject [] [] Daftar = RectObject baru [4] [4]; pribadi my2048panel myp; @SuppressWarnings ("RawTypes") Private LinkedList Savelist = new LinkedList (); Private Jbutton GOBackButton; KeyListener kl = KeyListener baru () {public void keypressed (keyevent e) {savethestep (); gobackbutton.setVisible (true); if (GameOverflag == true) {return; } if (! Adirable ()) {GameOver (); } int key = e.getKeyCode (); switch (key) {case keyevent.vk_up: ubah = false; moving (true); if (ubah == true) {getARandomrect (); // savethestep (); } merusak; case keyevent.vk_down: ubah = false; bergerak (benar); if (ubah == true) {getARandomrect (); // savethestep (); } merusak; case keyevent.vk_left: ubah = false; moveleft (true); if (ubah == true) {getARandomrect (); // savethestep (); } merusak; case keyevent.vk_right: ubah = false; Fighight (True); if (ubah == true) {getARandomrect (); // savethestep (); } merusak; } // savethestep (); } public void keyTyped (keyevent e) {} public void keyreleased (keyevent e) {}}; kelas RectObject {private int value; rectobject publik () {value = 0; } public rectobject (rectObject obj) {value = obj.value; } public boolean sama (objek inobj) {rectobject obj = (rectObject) inobj; if (obj.value == value) {return true; } return false; }} titik kelas {int x; int y; poin publik (int i, int j) {x = i; y = j; }} kelas my2048panel memperluas 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") public void PaintComponent (Graphics G) {// latar belakang super.paintComponent (g); untuk (int i = 0; i <xindex.length; i ++) {for (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 (warna baru (197.183.129)); g.fillroundrect (xindex [i], yindex [j], wid, wid, wid/5, wid/5); }} // cat persegi panjang untuk (int i = 0; i <4; i ++) {untuk (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 ((warna) cmap.get (rset [i] [j] .value)); } else {g.setColor ((color) cmap.get (128)); } g.fillroundrect (yindex [j], xindex [i], wid, wid, wid/5, wid/5); G.SetColor (Color.Black); Font font = font baru ("timesroman", font.bold, 50); g.setfont (font); 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 (); }}}}}}} kelas GameOverpone memperluas jpanel {public GameOverpane (int w, int h) {setsize (w, h); // setOpaque (false); } @SuppressWarnings ("Deprecation") public void paintComponent (grafik g) {super.paintComponent (g); Font font = font baru ("timesroman", font.bold, 80); g.setfont (font); FontMetrics fm = toolkit.getDefaultToolKit (). GetFontMetrics (font); Int width = fm.stringwidth ("Game Over"); int tinggi = fm.getHeight (); G.SetColor (warna baru (255,0,0)); G.DrawString ("Game Over!", GetWidth ()/2-Width/2, getHeight ()/2-height/2); }} kelas SuccessPane memperluas jpanel {public SuccessPane (int w, int h) {setSize (w, h); // setOpaque (false); } public void catcomponent (grafik g) {super.paintComponent (g); Font font = font baru ("timesroman", font.bold, 80); g.setfont (font); @SuppressWarnings ("Deprecation") fontMetrics fm = toolkit.getDefaultToolKit (). GetFontMetrics (font); Int width = fm.stringwidth ("Success!"); int tinggi = fm.getHeight (); G.SetColor (warna baru (255,0,0)); G.DrawString ("Sukses!", GetWidth ()/2-lebar/2, getHeight ()/2-height/2); }} Logo kelas memperluas jpanel {logo publik (int w, int h) {setsize (w, h); } @Suppresswarnings ("tidak digunakan") public void paintComponent (grafik g) {super.paintComponent (g); Font font = font baru ("Timesroman", font.Bold, 60); g.setfont (font); @SuppressWarnings ("Deprecation") fontMetrics fm = toolkit.getDefaultToolKit (). GetFontMetrics (font); Int width = fm.stringwidth ("2048"); int tinggi = fm.getHeight (); G.SetColor (warna baru (255,0,0)); G.DrawString ("2048", 20, getHeight ()/2+20); }} kelas publik GOBackListener mengimplementasikan ActionListener {@suppressWarnings ("RawTypes") public void actionPerformed (actionEvent e) {if (savelist.size () == 0) {goBackButton.setVisible (false); kembali; } Arraylist arr = (arraylist) savelist.getLast (); scorelabel.setText (""+arr.get (0)); untuk (int i = 0; i <4; i ++) {untuk (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; } else {rset [i] [j] = null; }}} savelist.removelast (); ulang (); }} kelas publik ResetListener mengimplementasikan ActionListener {public void actionPerformed (actionEvent e) {refreshBest (); untuk (int i = 0; i <4; i ++) {untuk (int j = 0; j <4; j ++) {rset [i] [j] = null; }} scorelabel.setText ("0"); ulang (); getarandomrect (); getarandomrect (); }} // applet init public void init () {container cp = getContentPane (); cp.setLayout (null); cp.setFocusable (true); CP.AddKeyListener (KL); Font font = font baru ("TimesNewman", Font.Bold, 30); Jlabel SL = JLabel baru (); sl.setlayout (GridLayout baru (2,1)); Jlabel sllb = jlabel baru ("skor"); sllb.setfont (font); scorelabel = jlabel baru ("0"); scorelabel.setfont (font); sl.add (sllb); Sl.add (Scorelabel); int terbaik = 0; coba {file file = file baru ("BestRecord"); if (file.exists ()) {randomAccessFile f = baru acakAccessFile (file, "rw"); terbaik = f.readint (); f.close (); }} catch (FileNotFoundException e) {terbaik = 0; e.printstacktrace (); } catch (ioException e) {terbaik = 0; e.printstacktrace (); } Jlabel bsl = jlabel baru (); BSL.SetLayout (GridLayout baru (2,1)); Jlabel JL = Jlabel baru ("terbaik"); jl.setfont (font); Jlabel JL1 = JLabel baru (""+terbaik); jl1.setfont (font); BSL.Add (JL); BSL.Add (JL1); myp = my2048panel () baru; Logo logo = logo baru (0,0); gobackbutton = jbutton baru ("undo"); gobackbutton.setfont (font); gobackbutton.addactionlistener (goBackListener baru ()); gobackbutton.addeylistener (KL); Jbutton jb = jbutton baru ("reset"); jb.setfont (font); jb.addactionListener (resetListener baru ()); 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 (logo); cp.add (myp); CP.Add (GOBackButton); CP.Add (JB); File f = file baru ("lastrecord"); if (f.exists ()) {coba {randomAccessFile file = new randomAccessFile (f, "rw"); int num = file.readInt (); scorelabel.setText (""+num); untuk (int i = 0; i <4; i ++) {untuk (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 (); }} else {getarandomrect (); getarandomrect (); }} @SuppressWarnings ("Uncecked") Public Game2048 () {// savethestep (); untuk (int i = 0; i <7; i ++) {cmap.put (label [i], clo [i]); }} // moveleft public void moveleft (boolean flag) {clearList (list); untuk (int i = 0; i <4; i ++) {int k = 0; untuk (int j = 0; j <4; j ++) {if (rset [i] [j]! = null) {daftar [i] [k ++] = rectObject baru (rset [i] [j]); }}} untuk (int i = 0; i <4 && flag; i ++) {untuk (int j = 0; j <3; j ++) {if (daftar [i] [j]! = null && list [i] [j+1]! = null && list [i] [j] .value = daftar [i] [i] [j+. if (checkMode == false) {int sum = integer.parseint (scoreLabel.getText ()); jumlah+= daftar [i] [j] .value; scorelabel.setText (""+sum); } daftar [i] [j+1] = null; j ++; }}} if (isChange ()) {if (checkMode == false) {copyset (rset, list); ulang (); moveleft (false); } ubah = true; } else {revaint (); }} // Movight public void moving (bendera boolean) {clearlist (daftar); untuk (int i = 0; i <4; i ++) {int k = 3; untuk (int j = 3; j> -1; j-) {if (rset [i] [j]! = null) {daftar [i] [k-] = rectObject baru (rset [i] [j]); }}} untuk (int i = 0; i <4 && flag; i ++) {for (int j = 3; j> 0; j-) {if (list [i] [j]! = null && list [i] [j-1]! = null && list [i] [j] .value = daftar [i] [j-1]. if (checkMode == false) {int sum = integer.parseint (scoreLabel.getText ()); jumlah+= daftar [i] [j] .value; scorelabel.setText (""+sum); } daftar [i] [j-1] = null; J--; }}} if (isChange ()) {if (checkMode == false) {copyset (rset, list); ulang (); FeVeright (false); } ubah = true; } else {revaint (); }} // MOVEUP public void moving (bendera boolean) {clearList (list); untuk (int j = 0; j <4; j ++) {int k = 0; untuk (int i = 0; i <4; i ++) {if (rset [i] [j]! = null) {daftar [k ++] [j] = rectObject baru (rset [i] [j]); }}} untuk (int j = 0; j <4 && flag; j ++) {for (int i = 0; i <3; i ++) {if (daftar [i] [j]! = null && list [i+1] [j] [jule) [j] [i] [j] .value = daftar [i+1] [j] [j] [i] [j]. if (checkMode == false) {int sum = integer.parseint (scoreLabel.getText ()); jumlah+= daftar [i] [j] .value; scorelabel.setText (""+sum); } daftar [i+1] [j] = null; i ++; }}} if (isChange ()) {if (checkMode == false) {copyset (rset, list); ulang (); moving (false); } ubah = true; } else {revaint (); }} // dipindahkan ke public void moving yang dipindahkan (bendera boolean) {clearlist (daftar); untuk (int j = 0; j <4; j ++) {int k = 3; untuk (int i = 3; i> -1; i-) {if (rset [i] [j]! = null) {daftar [k-] [j] = rectObject baru (rset [i] [j]); }}} untuk (int j = 0; j <4 && flag; j ++) {for (int i = 3; i> 0; i-) {if (list [i] [j]! = null && list [i-1] [j]! = null && [i] [j] .value = daftar [i-1] [j]. if (checkMode == false) {int sum = integer.parseint (scoreLabel.getText ()); jumlah+= daftar [i] [j] .value; scorelabel.setText (""+sum); } Daftar [i-1] [j] = null; Saya--; }}} if (isChange ()) {if (checkMode == false) {copyset (rset, list); ulang (); bergerak (salah); } ubah = true; } else {revaint (); }} // Fungsi Lainnya Private Void Copyset (RectObject [] [] dst, rectObject [] [] src) {for (int i = 0; i <4; i ++) {for (int j = 0; j <4; j ++) {dst [i] [j] = src [i] [j]; }}} // Deteksi apakah RSET berbeda dari daftar atau tidak boolean private ischange () {for (int i = 0; i <4; i ++) {for (int j = 0; j <4; j ++) {if (i] [j] [j] [null && list [i] [j] [j]! BENAR; } if (rset [i] [j]! = null && list [i] [j] == null) {return true; } if (rset [i] [j] == null && list [i] [j]! = null) {return true; }} return false; } 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; }}} // Dapatkan persegi panjang acak @suppresswarnings ({"Uncecked", "RawTypes"}) public void getARandomRect () {ArrayList List = new ArrayList (); untuk (int i = 0; i <4; i ++) {for (int j = 0; j <4; j ++) {if (rset [i] [j] == null) {list.add (titik baru (i, j)); }}}} if (list.size () == 0 &&! Adirable ()) {GameOver (); kembali; } Acak rand = random baru (); int index = rand.nextInt (list.size ()); Titik loc = (point) list.get (index); index = rand.nextint (2); rset [loc.x] [loc.y] = rectobject baru (); if (index == 1) {rset [loc.x] [loc.y] .value = 4; } else {rset [loc.x] [loc.y] .value = 2; }} // Mendeteksi apakah ada langkah lain atau tidak boolean publik adirable () {checkMode = true; Ubah = false; moveleft (true); Fighight (True); bergerak (benar); moving (true); CheckMode = false; if (ubah == true) {return true; } else {return false; }} public void GameOver () {GameOverflag = true; Jpanel jl = GameOverpane baru (myp.getWidth (), myp.getHeight ()); jl.setbounds (0, 0, 700, 700); Jbutton jb1 = jbutton baru ("lagi"); Font font = font baru ("timesroman", font.bold, 30); jb1.setopaque (false); jb1.setfont (font); Jbutton jb2 = jbutton baru ("tutup"); jb2.setsize (jb1.getsize ()); jb2.setopaque (false); jb2.setfont (font); jb1.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ scoreLabel.setText("0"); myp.remove(jl); clearList(rset); myp.validate(); getARandomRect(); getARandomRect(); repaint(); gameOverFlag=false; refreshBest(); } }); jb2.addactionListener (actionListener () {public void actionPerformed (actionEvent e) {refreshBest (); file f = file baru ("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 = jbutton baru ("lanjutkan"); Font font = font baru ("timesroman", font.bold, 30); jb1.setopaque (false); jb1.setfont (font); Jbutton jb2 = jbutton baru ("tutup"); jb2.setsize (jb1.getsize ()); jb2.setopaque (false); jb2.setfont (font); jb1.addactionListener (ActionListener baru () {public void actionPerformed (actionEvent e) {myp.remove (jl); myp.validate (); ulangin ();}}); jb2.addactionListener (actionListener () {public void actionPerformed (actionEvent e) {refreshBest (); System.exit (0);}}); jl.add (jb1); jl.add (jb2); myp.add (jl); jl.validate (); } @SuppressWarnings ("Uncecked") public void savethestep () {if (savelist.size () <20) {@suppressWarnings ("rawTypes") arraylist arr = new arraylist (); int skor = integer.parseint (scorelabel.getText ()); arr.add (skor); untuk (int i = 0; i <4; i ++) {untuk (int j = 0; j <4; j ++) {if (rset [i] [j]! = null) {arr.add (rset [i] [j] .value); } else {arr.add (0); }} savelist.addLast (arr); } else {savelist.removefirst (); savethestep (); }} judul string statis public (objek o) {string t = o.getClass (). ToString (); if (t.indexof ("class")! =-1) {t = t.substring (6); } return t; } public static void refreshBest () {coba {int terbaik = 0; File f = file baru ("BestRecord"); File acakAccessFile; if (f.exists ()) {file = new randomAccessFile (f, "rw"); terbaik = file.readInt (); file.seek (0); } else {file = randomAccessFile baru (f, "rw"); } //System.out.println(" skor terbaik adalah "+terbaik); int cur = integer.parseint (scorelabel.getText ()); if (cur> terbaik) {file.writeint (cur); } file.close (); } catch (FileNotFoundException E1) {e1.printstacktrace (); } catch (ioException e2) {e2.printstacktrace (); }} @SuppressWarnings ("Resource") public static void saverecord () {coba {acakeCacSFile file = new randomAccessFile (file baru ("lastrecord"), "rw"); int skor = integer.parseint (scorelabel.getText ()); file.writeint (skor); untuk (int i = 0; i <4; i ++) {for (int j = 0; j <4; j ++) {if (rset [i] [j]! = null) {file.writeint (rset [i] [j] .value); } else {file.writeint (0); }}}}} catch (FileNotFoundException e) {e.printstacktrace (); } catch (ioException e) {e.printstacktrace (); }} public static void run (applet japplet, lebar int, int tinggi) {jframe frame = jframe baru (judul (applet)); frame.addwindowlistener (windowadapter baru () {public void windowclosing (windowevent e) {refreshbest (); saverecord (); //system.out.println(" skor adalah "+scorelabel.gettext ());}}); frame.setDefaultCloseOperation (jframe.exit_on_close); frame.getContentPane (). Tambah (applet); frame.setsize (lebar, tinggi); applet.init (); applet.start (); frame.setVisible (true); } public static void main (string [] args) {run (new Game2048 (), 900, 800); }}PS: Di sini kami merekomendasikan dua game 2048 lainnya untuk referensi Anda (implementasi JS)
Game 2048 online:
http://tools.vevb.com/games/game2048
Online 2048 Mini Game Digital Versi:
http://tools.vevb.com/games/game2048num
Untuk informasi lebih lanjut tentang algoritma java, pembaca yang tertarik dengan situs ini dapat melihat topik: "struktur data java dan tutorial algoritma", "ringkasan tips node dom java", "ringkasan file operasi java dan direktori" dan "ringkasan tip operasi java cache" tips java "tips java" Tips "Java Cache Tips"
Saya harap artikel ini akan membantu pemrograman Java semua orang.