Dieser Artikel beschreibt das von Java implementierte Spiel von 2048. Teilen Sie es für Ihre Referenz wie folgt weiter:
Schauen wir uns den Laufeffekt an:
Der spezifische Code lautet wie folgt:
Paket awtdemo; import javax.swing.*; import Java.awt.*; import Java.awt.event. private statische endgültige int wid = 150, sp = 10; @SuppressWarnings ("unbenutzt") Private int Scores = 0; privates statisches Jlabel Scorelabel; private boolesche Änderung, checkMode = false, GameOverflag = false, successFlag = false; private int [] label = {2,4,8,16,32,64,128}; Private Color [] Clo = {New Color (200.200,200), neue Farbe (228.228,160), neue Farbe (214.163,92), neue Farbe (234,124,72), neue Farbe (240,84,77), neue Farbe (255,68,53), neue Farbe (200,200,64) $ $ (200,200,64)}; @SuppressWarnings ("rawtypes") private map cmap = new HashMap (); öffentliches statisches rectObject [] [] rset = neues rectObject [4] [4]; öffentliches rectObject [] [] list = neues rectObject [4] [4]; privat my2048panel myp; @SuppressWarnings ("rawtypes") private linkedList savelist = new LinkedList (); Privat Jbutton Govebutton; Keystierener kL = new KeyListener () {public void keypressed (KeyEvent e) {SavethEstep (); GOBACKBUTTON.SETVISIBLE (TRUE); if (GameOverflag == true) {return; } if (! adirable ()) {GameOver (); } int key = e.getKeyCode (); Switch (Schlüssel) {case keyEvent.vk_up: change = false; MoveUp (wahr); if (change == true) {getarandomrect (); // Savethestep (); } brechen; case keyEvent.vk_down: change = false; bewegt (wahr); if (change == true) {getarandomrect (); // Savethestep (); } brechen; case keyEvent.vk_left: change = false; MOBELEFT (wahr); if (change == true) {getarandomrect (); // Savethestep (); } brechen; case keyEvent.vk_right: change = false; Movertight (wahr); if (change == true) {getarandomrect (); // Savethestep (); } brechen; } // Savethestep (); } public void keytyPed (keyEvent e) {} public void keyRepest (KeyEvent e) {}}; Klasse RectObject {private int value; public rectObject () {value = 0; } public rectObject (rectObject obj) {value = obj.value; } public boolean gleich (Objekt inobj) {rectObject obj = (rectObject) inobj; if (obj.value == value) {return true; } return false; }} Klassenpunkt {int x; int y; public point (int i, int j) {x = i; y = j; }} class my2048Panel erweitert 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 ("Abschaltung") public void PaintComponent (Grafik g) {// Hintergrund super.paintComponent (g); für (int i = 0; i <xIndex.length; i ++) {für (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 (New Color (197,183,129)); G. -FillRoundRect (XIndex [i], yIndex [j], wid, wid, wid/5, wid/5); }} // Rechteck malen Sie (int i = 0; i <4; i ++) {für (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 ((Farbe) cmap.get (rset [i] [j] .Value)); } else {g.setColor ((Farbe) cmap.get (128)); } g.fillroundRect (yIndex [j], xindex [i], wid, wid, wid/5, wid/5); g.setColor (color.black); Schriftart = Neue Schriftart ("Timesroman", Font.bold, 50); G.SetFont (Schriftart); FontMetrics fm = Toolkit.getDefaulttoolkit (). GetFontMetrics (Schriftart); 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; Gaminguccess (); }}}}}}} class GameOverpone erweitert jpanel {public GameOverPane (int w, int h) {setSize (w, h); // setopaque (false); } @SuppressWarnings ("Abschaltung") public void PaintComponent (Grafik g) {Super.PaintComponent (g); Schriftart = Neue Schriftart ("Timesroman", Font.bold, 80); G.SetFont (Schriftart); FontMetrics fm = Toolkit.getDefaulttoolkit (). GetFontMetrics (Schriftart); int width = fm.stringwidth ("game Over"); int Höhe = fM.Getheight (); G.SetColor (neue Farbe (255,0,0)); G.Drawstring ("Game Over!", Getwidth ()/2-Width/2, Geteight ()/2-Hoch/2); }} class SuccessPane erweitert JPanel {Public SuccessPane (int w, int h) {setSize (w, h); // setopaque (false); } public void PaintComponent (Grafik g) {Super.PaintComponent (g); Schriftart = Neue Schriftart ("Timesroman", Font.bold, 80); G.SetFont (Schriftart); @SuppressWarnings ("Abschaltung") fontMetrics fm = Toolkit.getDefaulttoolkit (). GetFontMetrics (Schriftart); int width = fm.stringwidth ("Erfolg!"); int Höhe = fM.Getheight (); G.SetColor (neue Farbe (255,0,0)); G.Drawstring ("Erfolg!", Getwidth ()/2-Width/2, Geteight ()/2-Höhe/2); }} Klasse -Logo erweitert JPanel {public Logo (int w, int h) {setSize (w, h); } @SuppressWarnings ("unbenutzt") public void PaintComponent (Graphics g) {Super.PaintComponent (g); Schriftart = Neue Schriftart ("Timesroman", Font.bold, 60); G.SetFont (Schriftart); @SuppressWarnings ("Abschaltung") fontMetrics fm = Toolkit.getDefaulttoolkit (). GetFontMetrics (Schriftart); int width = fm.stringwidth ("2048"); int Höhe = fM.Getheight (); G.SetColor (neue Farbe (255,0,0)); G.Drawstring ("2048", 20, Geteight ()/2+20); }} public class goBackListener implementiert actionListener {@Suppresswarnings ("rawtypes") public void actionPerformed (actionEvent e) {if (savelist.size () == 0) {goBackbutton.setvisible (false); zurückkehren; } ArrayList arr = (ArrayList) savelist.getLast (); scorelabel.setText (""+arr.get (0)); für (int i = 0; i <4; i ++) {für (int j = 0; j <4; j ++) {int num = (int) arr.get (4*i+j+1); if (num! = 0) {rset [i] [j] = neu rectObject (); rset [i] [j] .Value = num; } else {rset [i] [j] = null; }}} savelist.removelast (); Repaint (); }} public class ResetListener implementiert ActionListener {public void actionPerformed (actionEvent e) {refreshBest (); für (int i = 0; i <4; i ++) {für (int j = 0; j <4; j ++) {rset [i] [j] = null; }} scorelabel.setText ("0"); Repaint (); getarandomrect (); getarandomrect (); }} // Das Applet init public void init () {container cp = getContentPane (); cp.setLayout (null); cp.setFocuSable (true); CP.AddKeyListener (KL); Schriftart = neuer Schrift ("TimesNewman", font.bold, 30); JLabel SL = new JLabel (); Sl.SetLayout (neuer GridLayout (2,1)); JLabel Sllb = new JLabel ("Scores"); SllB.SetFont (Schriftart); scorelabel = new JLabel ("0"); scorelabel.setfont (Schriftart); sl.add (Sllb); sl.add (skorelabel); int am besten = 0; try {file file = new Datei ("BESTRECORD"); if (file.exists ()) {randomAccessfile f = new randomAccessfile (Datei, "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 (neuer GridLayout (2,1)); Jlabel JL = new Jlabel ("Best"); Jl.SetFont (Schriftart); JLabel Jl1 = new JLabel (""+Best); jl1.setfont (font); Bsl.add (JL); bsl.add (jl1); myp = new my2048panel (); Logo Logo = neues Logo (0,0); GOBACKBUTTON = New Jbutton ("Rückgänger"); GOBACKBUTTON.SETFONT (Schriftart); goBackbutton.AddactionListener (neuer goBackListener ()); GOBACKBUTTON.ADDKeyListener (KL); Jbutton JB = New Jbutton ("Reset"); JB.SetFont (Schriftart); JB.AddActionListener (neuer 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 (Logo); cp.add (myp); CP.Add (GOBACKBUTTON); CP.ADD (JB); Datei f = neue Datei ("LastreCord"); if (f.Exists ()) {try {randomAccessfile file = new randomAccessfile (f, "rw"); int num = file.readint (); scorelabel.setText (""+num); für (int i = 0; i <4; i ++) {für (int j = 0; j <4; j ++) {num = file.readint (); if (num! = 0) {rset [i] [j] = neu rectObject (); rset [i] [j] .Value = num; }}} file.close (); } catch (FilenotFoundException e) {e.printstacktrace (); } catch (ioException e) {e.printstacktrace (); }} else {getarandomrect (); getarandomrect (); }} @SuppressWarnings ("Deaktiviert") public Game2048 () {// Savethestep (); für (int i = 0; i <7; i ++) {cmap.put (label [i], clo [i]); }} // moveleft public void moveleft (boolean flag) {ClearList (Liste); für (int i = 0; i <4; i ++) {int k = 0; für (int j = 0; j <4; j ++) {if (rset [i] [j]! }}} für (int i = 0; i <4 && flag; i ++) {für (int j = 0; j <3; j ++) {if (list [i] [j]! = null && list [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 (); MOBELEFT (falsch); } change = true; } else {repaint (); }} // Moveright public void moveright (boolean Flag) {ClearList (Liste); für (int i = 0; i <4; i ++) {int k = 3; für (int j = 3; j> -1; j-) {if (rset [i] [j]! }}} für (int i = 0; i <4 && flag; i ++) {für (int j = 3; j> 0; j-) {if (list [i] [j]! = null && list [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 (); Movertight (falsch); } change = true; } else {repaint (); }} // MOVEUP public void MoveUp (boolean Flag) {ClearList (Liste); für (int j = 0; j <4; j ++) {int k = 0; für (int i = 0; i <4; i ++) {if (rset [i] [j]! }}} für (int j = 0; j <4 && flag; j ++) {für (int i = 0; i <3; i ++) {if (list [i] [j]! = null && list [i+1] [j]! if (checkMode == false) {int sum = integer.parseInt (scorelabel.getText ()); sum+= list [i] [j] .Value; scorelabel.setText (""+sum); } list [i+1] [j] = null; i ++; }}} if (iSchange ()) {if (checkMode == false) {copySet (rset, list); Repaint (); MoveUp (falsch); } change = true; } else {repaint (); }} // bewegt public void bewegt (boolesche Flagge) {ClearList (Liste); für (int j = 0; j <4; j ++) {int k = 3; für (int i = 3; i> -1; i-) {if (rset [i] [j]! }}} für (int j = 0; j <4 && flag; j ++) {für (int i = 3; i> 0; i-) {if (list [i] [j]! = null && list [i-1] [j]! if (checkMode == false) {int sum = integer.parseInt (scorelabel.getText ()); sum+= list [i] [j] .Value; scorelabel.setText (""+sum); } list [i-1] [j] = null; ich--; }}} if (iSchange ()) {if (checkMode == false) {copySet (rset, list); Repaint (); bewegt (falsch); } change = true; } else {repaint (); }} // Andere Funktionen private void copyset (rectObject [] [] dst, rectObject [] [] src) {for (int i = 0; i <4; i ++) {für (int j = 0; j <4; j ++) {dst [i] [j] = src [i] [j]; }}} // Erkennen Sie, ob sich Rset von der Liste unterscheidet oder nicht. WAHR; } 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) {für (int i = 0; i <sength; i ++) {for (int j = 0; j <s [i] .Length; j ++) {s [i] [j] = null; }}} // Erhalten Sie ein zufälliges Rechteck @SuppressWarnings ({"Deaktiviert", "rawtypes"}) public void getarandomrect () {ArrayList list = new ArrayList (); für (int i = 0; i <4; i ++) {für (int j = 0; j <4; j ++) {if (rset [i] [j] == null) {list.add (neuer Punkt (i, j)); }}}} if (list.size () == 0 &&! adirable ()) {GameOver (); zurückkehren; } Random Rand = new random (); int index = rand.nextint (list.size ()); Point loc = (point) 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; }} // Erkennen, ob es andere Schritte gibt oder nicht public boolean adirable () {checkMode = true; Änderung = falsch; MOBELEFT (wahr); Movertight (wahr); bewegt (wahr); MoveUp (wahr); CheckMode = false; if (change == 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 ("Again"); Schriftart = neue Schriftart ("Timesroman", Schriftart.bold, 30); JB1.Setopaque (Falsch); JB1.SetFont (Schriftart); Jbutton JB2 = New Jbutton ("Close"); JB2.SetSize (jb1.getSize ()); JB2.Setopaque (falsch); JB2.SetFont (Schriftart); jb1.addactionListener (new ActionListener () {public void actionPerformed (actionEvent e) {scorelabel.setText ("0"); myp.remove (jl); clearlist (rset); myp.validat (); getarandomrect (); }); jb2.addActionListener (new ActionListener () {public void actionPerformed (actionEvent e) {requestreeshBest (); Datei f = Neue Datei ("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 (falsch); Jl.SetBounds (0, 0, 700, 700); Jbutton JB1 = New Jbutton ("Weiter"); Schriftart = neue Schriftart ("Timesroman", Schriftart.bold, 30); JB1.Setopaque (Falsch); JB1.SetFont (Schriftart); Jbutton JB2 = New Jbutton ("Close"); JB2.SetSize (jb1.getSize ()); JB2.Setopaque (falsch); JB2.SetFont (Schriftart); 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 ("Deaktiviert") public void Savethestep () {if (savelist.size () <20) {@SuppressWarnings ("rawtypes") ArrayList arr = new ArrayList (); Int Score = Integer.ParseInt (scorelabel.getText ()); arr.add (Punktzahl); für (int i = 0; i <4; i ++) {für (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 (Objekt o) {String t = O.getClass (). toString (); if (t.indexof ("class")! =-1) {t = t.substring (6); } return t; } public static void refreshbest () {try {int be Besten = 0; Datei f = neue Datei ("BEBRECORD"); RandomAccessfile -Datei; if (f.Exists ()) {file = new randomAccessfile (f, "rw"); Best = Datei.Readint (); Datei.seek (0); } else {file = new randomAccessfile (f, "rw"); } //System.out.println("Die beste Punktzahl ist "+am besten); int cur = integer.parseInt (scorelabel.getText ()); if (cur> am besten) {file.writeInt (cur); } file.close (); } catch (FilenotFoundException e1) {e1.printstacktrace (); } catch (ioException e2) {e2.printstacktrace (); }} @SuppressWarnings ("Ressource") public static void SavereCord () {try {randomAccessFile -Datei = new randomAccessfile (neue Datei ("Lastrecord"), "RW"); Int Score = Integer.ParseInt (scorelabel.getText ()); Datei.WriteInt (Score); für (int i = 0; i <4; i ++) {für (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 (japplet Applet, int width, int height) {jframe Fram = new JFrame (title (applet)); Frame.Addwindowlistener (neuer Fensteradapter () {public void windowsClosing (windowEvent e) {refreshBest (); SavereCord (); //system.out.println("Dhe Score ist "+scorelabel.gettext ());}}); Frame.SetDefaultCloseOperation (jframe.exit_on_close); Frame.GetContentPane (). Add (Applet); Frame.SetSize (Breite, Höhe); Applet.init (); Applet.Start (); Frame.SetVisible (True); } public static void main (String [] args) {run (new Game2048 (), 900, 800); }}PS: Hier empfehlen wir zwei weitere 2048 -Spiele als Referenz (JS -Implementierung)
Online 2048 Spiele:
http://tools.vevb.com/games/game2048
Online 2048 Mini Game Digitale Version:
http://tools.vevb.com/games/game2048num
Für weitere Informationen zu Java -Algorithmen können Leser, die an dieser Website interessiert sind, die Themen "Java -Datenstruktur und Algorithmus -Tutorial", "Zusammenfassung der Java -Operation DOM -Knoten -Tipps", "Zusammenfassung der Java -Datei- und Verzeichnisoperationstipps" und "Zusammenfassung der Java -Cache -Operation Tipps" anzeigen
Ich hoffe, dieser Artikel wird für Java -Programme aller hilfreich sein.