이 기사는 Java가 구현 한 2048 게임에 대해 설명합니다. 다음과 같이 참조에 대해 공유하십시오.
실행 효과를 살펴 보겠습니다.
특정 코드는 다음과 같습니다.
패키지 awtdemo; import javax.swing.*; import java.awt.*; import java.awt.event.*; import Java.io. 개인 정적 최종 int wid = 150, sp = 10; @suppresswarnings ( "미사용") 개인 int score = 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), 새로운 색 (200,200,64)}}; @suppresswarnings ( "rawtypes") 개인지도 cmap = new Hashmap (); public static rectobject [] [] rset = new rectobject [4] [4]; public rectobject [] [] list = new rectobject [4] [4]; Private 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 (); 스위치 (키) {case keyEvent.vk_up : change = false; 이동 (true); if (change == true) {getArandomRect (); // savethestep (); } 부서지다; case keyEvent.vk_down : change = false; 이동 된 (True); if (change == true) {getArandomRect (); // savethestep (); } 부서지다; case keyEvent.vk_left : change = false; moveleft (true); if (change == true) {getArandomRect (); // savethestep (); } 부서지다; case keyevent.vk_right : change = false; 무도 (True); if (change == true) {getArandomRect (); // savethestep (); } 부서지다; } // savethestep (); } public void keytyped (keyevent e) {} public void kyyReleased (keyevent e) {}}; 클래스 rectobject {private int 값; 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를 반환합니다. }} 클래스 포인트 {int x; in 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 ( "감가 상각") public void paintcomponent (그래픽 g) {// background super.paintcomponent (g); for (int i = 0; i <xindex.length; i ++) {for (int j = 0; 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 ((색상) 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 = new Font ( "TimesRoman", font.bold, 50); G. 세트 폰트 (글꼴); fontMetrics fm = 툴킷 .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 ( "감가 상각") public void paintcomponent (그래픽 g) {super.paintcomponent (g); font font = new Font ( "TimesRoman", font.bold, 80); G. 세트 폰트 (글꼴); fontMetrics fm = 툴킷 .getDefaultToolKit (). getFontMetrics (font); int width = fm.stringWidth ( "게임 오버"); int height = fm.getheight (); G. 세트 컬러 (새로운 색상 (255,0,0)); G.DrawString ( "Game Over!", getWidth ()/2-width/2, getheight ()/2-Height/2); }} class successpane 확장 jpanel {public successpane (int w, int h) {setsize (w, h); // setOpaque (false); } public void paintcomponent (그래픽 g) {super.paintcomponent (g); font font = new Font ( "TimesRoman", font.bold, 80); G. 세트 폰트 (글꼴); @suppresswarnings ( "감가 상각") fontmetrics fm = thoolkit.getDefaultToolKit (). getFontMetrics (font); int width = fm.stringwidth ( "성공!"); int height = fm.getheight (); G. 세트 컬러 (새로운 색상 (255,0,0)); G.DrawString ( "성공!", getWidth ()/2-width/2, getheight ()/2-Height/2); }} 클래스 로고는 jpanel {public logo (int w, int h) {setsize (w, h); } @SuppressWarnings ( "미사용") 공개 void paintcomponent (그래픽 g) {super.paintcomponent (g); font font = new Font ( "TimesRoman", font.bold, 60); G. 세트 폰트 (글꼴); @suppresswarnings ( "감가 상각") fontmetrics fm = thoolkit.getDefaultToolKit (). getFontMetrics (font); int width = fm.stringwidth ( "2048"); int height = fm.getheight (); G. 세트 컬러 (새로운 색상 (255,0,0)); G.DrawString ( "2048", 20, getheight ()/2+20); }} public class gobacklistener는 ActionListener {@suppresswarnings ( "rawtypes") public void ActionPerformed (ActionEvent e) {if (savelist.size () == 0) {gobackbutton.setVisible (false); 반품; } arraylist arr = (arraylist) savelist.getLast (); skorelabel.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 (); 리 페인트 (); }} public class resetlistener는 ActionListener를 구현합니다. for (int i = 0; i <4; i ++) {for (int j = 0; j <4; j ++) {rset [i] [j] = null; }} skorelabel.settext ( "0"); 리 페인트 (); getArandomRect (); getArandomRect (); }} // 애플릿 init public void init () {컨테이너 cp = getContentPane (); cp.setlayout (null); cp.setfocusable (true); 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 (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 (); 로고 로고 = 새로운 로고 (0,0); GobackButton = New JButton ( "undo"); gobackbutton.setfont (font); gobackbutton.addactionListener (new GobackListener ()); gobackbutton.addkeylistener (KL); JBUTTON JB = NEW JBUTTON ( "Reset"); jb.setfont (font); jb.addactionListener (New ResetListener ()); JB.addkeylistener (KL); sl.setBounds (500,20,200,80); BSL. 세트 바운드 (300,20,200,80); 로고. 세트 바운드 (0, 0, 600, 100); myp.setbounds (0,90,700,700); GobackButton.SetBounds (700,250,150,60); JB. 세트 바운드 (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); 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 ( "확인되지 않은") public game2048 () {// savethestep (); for (int i = 0; i <7; i ++) {cmap.put (레이블 [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; 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); 리 페인트 (); moveleft (false); } change = true; } else {refaint (); }} // 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]); }}} for (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 == [i] [j-1] .value) {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); 리 페인트 (); 무기 (거짓); } change = true; } else {refaint (); }} // moveUp public void MoveyUp (부울 플래그) {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; 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); 리 페인트 (); 이동 (false); } change = true; } else {refaint (); }} // moveNdown public void mizodown (부울 플래그) {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; 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); 리 페인트 (); 이동 된 (거짓); } change = true; } else {refaint (); }} // 기타 함수 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가 목록과 다른지 여부를 감지합니다 진실; } 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를 가져옵니다 ({ "선택 취소", "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 (); 반품; } random rand = new random (); int index = rand.nextInt (list.size ()); 포인트 loc = (포인트) list.get (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; }} // 다른 단계가 있는지 여부를 감지합니다. 변경 = 거짓; moveleft (true); 무도 (True); 이동 된 (True); 이동 (true); 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 = 새로운 JBUTTON ( "Again"); font font = new Font ( "TimesRoman", font.bold, 30); jb1.setopaque (false); jb1.setfont (font); JBUTTON JB2 = New JButton ( "Close"); 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 (); gameoverflag (); }); jb2.addactionListener (new ActionListener () {public void actionPerformed (actionEvent e) {reformbest (); 파일 f = 새 파일 ( "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 (font); JBUTTON JB2 = New JButton ( "Close"); jb2.setsize (jb1.getsize ()); jb2.setopaque (false); jb2.setfont (font); 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 ( "확인되지 않은") public void savethestep () {if (savelist.size () <20) {@suppresswarnings ( "rawtypes") arraylist arr = new arraylist (); int score = integer.parseint (skorelabel.getText ()); arr.add (score); 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 (); }} 공개 정적 문자열 제목 (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 (skorelabel.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 (skorelabel.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 (japplet appret, int width, int height) {jframe frame = new Jframe (title (appret)); frame.addwindowlistener (새 WindowAdapter () {public void WindowClosing (windowevent e) {refreshbest (); saverecord (); //system.out.println(”은 "+scorelabel.getText ());}}); frame.setDefaultCloseOperation (jframe.exit_on_close); frame.getContentPane (). Add (애플릿); frame.setsize (너비, 높이); Applet.init (); Applet.start (); frame.setVisible (true); } public static void main (String [] args) {run (new Game2048 (), 900, 800); }}추신 : 여기에서는 참조에 다른 2048 게임을 권장합니다 (JS 구현).
온라인 2048 게임 :
http://tools.vevb.com/games/game2048
온라인 2048 미니 게임 디지털 버전 :
http://tools.vevb.com/games/game2048num
Java 알고리즘에 대한 자세한 내용은이 사이트에 관심이있는 독자들이 주제를 볼 수 있습니다. "Java 데이터 구조 및 알고리즘 자습서", "Java Operation Dom Node Tips 요약", "Java 파일 및 디렉토리 작동 팁 요약"및 "Java Cache Operation Tips의 요약"을 볼 수 있습니다.
이 기사가 모든 사람의 Java 프로그래밍에 도움이되기를 바랍니다.