Эта статья описывает игру 2048 года, реализованную Java. Поделитесь этим для вашей ссылки, следующим образом:
Давайте посмотрим на эффект бега:
Конкретный код заключается в следующем:
пакет awtdemo; import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.io.*; import java.util.*; @suppresswarnings («серийный») Up = 0, вниз = 1, левый = 2, справа = 3; Частный статический окончательный, 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 = {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 (); Public Static Rectobject [] [] rset = new Rectobject [4] [4]; public Rectobject [] [] list = new Rectobject [4] [4]; Частный My2048Panel Myp; @Suppresswarnings ("rawtypes") private linkedlist savelist = new LinkedList (); Частный Jbutton Gobackbutton; KeyListener kl = new KeyListener () {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: изменение = false; MoveUp (True); if (изменение == true) {getarandomRect (); // savetheStep (); } перерыв; case keyevent.vk_down: изменение = false; перемещен (правда); if (изменение == true) {getarandomRect (); // savetheStep (); } перерыв; case keyevent.vk_left: изменение = false; Moveleft (True); if (изменение == true) {getarandomRect (); // savetheStep (); } перерыв; case keyevent.vk_right: изменение = false; Movererate (True); if (изменение == true) {getarandomRect (); // savetheStep (); } перерыв; } // savetheStep (); } public void Keytyped (KeyEvent e) {} public void keyRELEDELED (KeyEvent e) {}}; Class Rectobject {private int value; public rectobject () {value = 0; } public RectObject (RectObject obj) {value = obj.value; } public Boolean Equals (Object inobj) {rectobject obj = (RectObject) inobj; if (obj.value == value) {return true; } вернуть false; }} class point {int x; int y; public point (int i, int j) {x = i; y = j; }} class my2048panel extends 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 («Университет») public void paintcomponent (графика g) {// фоновая супер.paintcomponent (g); for (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 (новый цвет (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)); } 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 = новый шрифт ("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]. if (rset [i] [j] .value == 2048 && successflag == false) {successflag = true; gamesuccess (); }}}}}}} класс GameOverpone Extends jPanel {public GameOverpane (int w, int h) {setSize (w, h); // setoPaque (false); } @Suppresswarnings ("omemercation") public void paintcomponent (Graphics g) {super.paintcomponent (g); Font font = новый шрифт ("Timesroman", font.bold, 80); g.setfont (шрифт); Fontmetrics fm = toolkit.getDefaulttoolkit (). GetFontMetrics (Font); int width = fm.stringwidth ("игра над"); int height = fm.getheight (); G.SetColor (новый цвет (255,0,0)); g.drawstring ("over!", getwidth ()/2-width/2, getheight ()/2-hight/2); }} Class SucceshPane Extends jPanel {public SuccessPane (int w, int h) {setSize (w, h); // setoPaque (false); } public void paintComponent (Graphics G) {super.paintcomponent (g); Font font = новый шрифт ("Timesroman", font.bold, 80); g.setfont (шрифт); @Suppresswarnings («Упаска») fontmetrics fm = toolkit.getDefaulttoolkit (). GetFontMetrics (font); int width = fm.stringwidth ("успех!"); int height = fm.getheight (); G.SetColor (новый цвет (255,0,0)); g.drawstring ("Успех!", GetWidth ()/2-width/2, getheight ()/2-hight/2); }} класс логотип extends jpanel {public logo (int w, int h) {setSize (w, h); } @Suppresswarnings ("unared") public void paintcomponent (Graphics g) {super.paintcomponent (g); Font font = новый шрифт ("Timesroman", font.bold, 60); g.setfont (шрифт); @Suppresswarnings («Упаска») fontmetrics fm = toolkit.getDefaulttoolkit (). GetFontMetrics (font); int width = fm.stringwidth ("2048"); int height = fm.getheight (); G.SetColor (новый цвет (255,0,0)); g.drawstring ("2048", 20, getheight ()/2+20); }} открытый класс GobackListener реализует ActionListener {@SuppressWarnings ("ravtypes") public void actionperformed (actionevent e) {if (savelist.size () == 0) {gobackbutton.setvisible (false); возвращаться; } Arraylist arr = (arraylist) savelist.getlast (); scorelabel.settext (""+arr.get (0)); for (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; } else {rset [i] [j] = null; }}} savelist.removelast (); Repaint (); }} открытый класс ResetListener реализует ActionListener {public void actionPerformed (actionEvent e) {refreshbest (); for (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 () {контейнер cp = getContentPane (); cp.setlayout (null); cp.setfocusable (true); CP.AddkeyListener (KL); Font font = новый шрифт ("Timesnewman", font.bold, 30); Jlabel sl = new jlabel (); sl.setlayout (new Gridlayout (2,1)); Jlabel sllb = new jlabel ("оценки"); sllb.setfont (font); scorelabel = new jlabel ("0"); scorelabel.setfont (font); sl.add (sllb); sl.add (Scorelabel); int best = 0; try {file file = new File ("BestRecord"); if (file.exists ()) {randomaccessfile f = new randomaccessfile (file, "rw"); best = 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 (font); Jlabel jl1 = new jlabel (""+best); jl1.setfont (font); bsl.add (JL); bsl.add (jl1); myp = new My2048Panel (); Логотип Logo = новый логотип (0,0); gobackbutton = new jbutton ("undo"); gobackbutton.setfont (font); Gobackbutton.addactionListener (new GobackListener ()); gobackbutton.addkeylistener (KL); Jbutton jb = new jbutton ("сбросить"); 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 = новый файл ("lastercord"); if (f.exists ()) {try {randomaccessfile file = new randomaccessfile (f, "rw"); int num = file.readint (); scorelabel.settext (""+num); for (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 (); }} else {getArandomRect (); getarandomRect (); }} @Suppresswarnings ("unchecked") public game2048 () {// savetheStep (); for (int i = 0; i <7; i ++) {cmap.put (label [i], clo [i]); }} // Moveleft public void moveleft (логический флаг) {clearList (list); for (int i = 0; i <4; i ++) {int k = 0; for (int j = 0; j <4; j ++) {if (rset [i] [j]! = null) {list [i] [k ++] = new Rectobject (rset [i] [j]); }}} for (int i = 0; i <4 && flag; i ++) {for (int j = 0; j <3; j ++) {if (list [i] [j]! = null && list [i] [j+1]! = null && [i] [j]. Value == [i] [j+1]. if (checkmode == false) {int sum = integer.parseint (scorelabel.getText ()); sum+= list [i] [j] .value; scorelabel.settext (""+sum); } list [i] [j+1] = null; J ++; }}} if (ischange ()) {if (checkMode == false) {copyset (rset, list); Repaint (); Moveleft (false); } изменение = true; } else {Repaint (); }} // Moveright public void moveright (логический флаг) {clearList (list); for (int i = 0; i <4; i ++) {int k = 3; for (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 && list [i] [j-1]! = null && list [i]. if (checkmode == false) {int sum = integer.parseint (scorelabel.getText ()); sum+= list [i] [j] .value; scorelabel.settext (""+sum); } list [i] [j-1] = null; J--; }}} if (ischange ()) {if (checkMode == false) {copyset (rset, list); Repaint (); Movererate (false); } изменение = true; } else {Repaint (); }} // Перенос public void MoveUp (логический флаг) {clearList (list); for (int j = 0; j <4; j ++) {int k = 0; for (int i = 0; i <4; i ++) {if (rset [i] [j]! = null) {list [k ++] [j] = new Rectobject (rset [i] [j]); }}} for (int j = 0; j <4 && flag; j ++) {for (int i = 0; i <3; i ++) {if (list [i] [j]! = null && list [i+1] [j]! = null && [i] [j]. Value == sist [i+1] [J] [J] [J] [i] [i] [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 (false); } изменение = true; } else {Repaint (); }} // перемещение Public void Movelown (Boolean Flag) {clearList (list); for (int j = 0; j <4; j ++) {int k = 3; for (int i = 3; i> -1; i-) {if (rset [i] [j]! = null) {list [k-] [j] = new Rectobject (rset [i] [j]); }}} for (int j = 0; j <4 && flag; j ++) {for (int i = 3; i> 0; 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); } list [i-1] [j] = null; я--; }}} if (ischange ()) {if (checkMode == false) {copyset (rset, list); Repaint (); перемещен (ложь); } изменение = true; } else {Repaint (); }} // другие функции 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]; }}} // Обнаружение того, отличается ли rset от списка или нет частного логического iSchange () {for (int i = 0; i <4; i ++) {for (int j = 0; j <4; j ++) {if (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; }} вернуть 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; }}} // Получить случайный прямоугольник @suppresswarnings ({"unchecked", "rawtypes"}) public void getarandomrect () {arraylist list = new arraylist (); for (int i = 0; i <4; i ++) {for (int j = 0; j <4; j ++) {if (rset [i] [j] == null) {list.add (new Point (i, j)); }}}} if (list.size () == 0 &&! adirable ()) {gameover (); возвращаться; } Случайный rand = new Random (); int index = rand.nextint (list.size ()); Point loc = (точка) list.get (index); index = rand.nextint (2); rset [loc.x] [loc.y] = new Rectobject (); if (index == 1) {rset [loc.x] [loc.y] .value = 4; } else {rset [loc.x] [loc.y] .value = 2; }} // Обнаружение того, есть ли другие шаги или нет общедоступных логических AdiRable () {checkMode = true; изменение = false; Moveleft (True); Movererate (True); перемещен (правда); MoveUp (True); 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 = новый шрифт ("Timesroman", font.bold, 30); jb1.setopaque (false); jb1.setfont (font); Jbutton jb2 = new jbutton ("close"); jb2.setize (jb1.getSize ()); jb2.setopaque (false); jb2.setfont (шрифт); jb1.addactionListener (new ActionListener () {public void actionPerformed (actionEvent e) {scorelabel.settext ("0"); myp.remove (jl); clearlist (rset); myp.validate (); getarandomRect (); getarandomRect (); repaint (); jb2.addactionListener (new ActionListener () {public void actionPerformed (actionEvent e) {refreshbest (); file f = new File ("lastercord"); 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 = новый шрифт ("Timesroman", font.bold, 30); jb1.setopaque (false); jb1.setfont (font); Jbutton jb2 = new jbutton ("close"); jb2.setize (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 (savelist.size () <20) {@suppresswarnings ("ravtypes") arraylist arr = new ArrayList (); int score = integer.parseint (scorelabel.getText ()); arr.add (счет); for (int i = 0; i <4; i ++) {for (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 (); }} public static String title (Object o) {string t = o.getClass (). toString (); if (t.indexof ("class")! =-1) {t = t.substring (6); } return 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); } else {file = new randomAccessfile (f, "rw"); } //System.out.println(" лучшая оценка "+Best); 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 (new File ("lastercord"), "rw"); int score = integer.parseint (scorelabel.getText ()); file.WriteInt (SCORE); for (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, int width, int height) {jframe frame = new jframe (title (applet)); frame.addwindowlistener (new windowdapter () {public void windowclose (windowevent e) {refreshbest (); saverecord (); //system.out.println(" stock "+scoreLabel.getText ());}}); frame.setDefaultCloseoPeration (jframe.exit_on_close); Frame.getContentPane (). Add (applet); Frame.setize (ширина, высота); applet.init (); applet.start (); Frame.SetVisible (true); } public static void main (string [] args) {run (new Game2048 (), 900, 800); }}PS: Здесь мы рекомендуем две другие игры 2048 для вашей ссылки (реализация JS)
Онлайн 2048 игры:
http://tools.vevb.com/games/game2048
Онлайн 2048 Mini Game Digital Version:
http://tools.vevb.com/games/game2048num
Для получения дополнительной информации об алгоритмах Java, читатели, которые заинтересованы в этом сайте, могут просмотреть темы: «Учебное пособие по структуре данных Java и алгоритм», «Сводка операции Java Dom Node», «Сводка Java File и каталог
Я надеюсь, что эта статья будет полезна для всех Java Programming.