この記事では、Javaが実装した2048ゲームについて説明します。次のように、参照のために共有してください。
実行中の効果を見てみましょう。
特定のコードは次のとおりです。
パッケージawtdemo; import javax.swing。*; import java.awt。*; import java.awt.event。*; import java.util。*; @suppresswarnings( "serial")public class game2048 extends japplet {@suppresswarnings up = 0、down = 1、左= 2、右= 3; private static final int wid = 150、sp = 10; @suppresswarnings( "unused")private int scores = 0;プライベート静的Jlabelスコアラベル;プライベートブールの変更、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];プライベート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: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 keyReleased(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拡張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(グラフィックスG){// background super.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 = new Font( "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 && suctusflag == false){suctusflag = true; gamesuccess(); }}}}}}}} class gameoverpone extends jpanel {public gameoverpane(int w、int h){setsize(w、h); // setopaque(false); } @suppresswarnings( "deprecation")public void paintComponent(graphics g){super.paintComponent(g); font font = new Font( "Timesroman"、font.bold、80); G.SetFont(Font); fontmetrics fm = toolkit.getDefaultToolkit()。getFontmetrics(font); int width = fm.StringWidth( "Game Over"); int height = fm.getheight(); G.SetColor(新しい色(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(Graphics G){super.paintComponent(g); font font = new Font( "Timesroman"、font.bold、80); G.SetFont(Font); @suppresswarnings( "deprecation")fontmetrics fm = toolkit.getDefaultToolkit()。getFontmetrics(font); int width = fm.stringwidth( "success!"); int height = fm.getheight(); G.SetColor(新しい色(255,0,0)); g.drawstring( "success!"、getWidth()/2-width/2、getheight()/2-height/2); }} classロゴ拡張jpanel {public logo(int w、int h){setsize(w、h); } @suppresswarnings( "unused")public void paintComponent(graphics g){super.paintComponent(g); font font = new Font( "Timesroman"、font.bold、60); G.SetFont(Font); @suppresswarnings( "deprecation")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); }} public class gobackListenerはactionlistener {@suppresswarnings( "rawtypes")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(); }} public class resetlistenerはactionlistener {public void actionperformed(actionevent e){refleshbest(); for(int i = 0; i <4; i ++){for(int j = 0; j <4; j ++){rset [i] [j] = null; }} scorelabel.settext( "0"); Repaint(); getArandomRect(); getArandomRect(); }} //アプレットinit public void init(){container 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(新しいGridlayout(2,1)); jlabel sllb = new Jlabel( "Scores"); 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.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 = new file( "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( "unchecked")public game2048(){// savethestep(); for(int i = 0; i <7; i ++){cmap.put(label [i]、clo [i]); }} // moveleft public void moveleft(boolean flag){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 && list [i] [j] .value == list [i] [i] {j+1] {j+1] {j+1] {j+1] {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); } change = true; } else {repaint(); }} // Moveright public void Moveright(boolean flag){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 == list [i] [i] [i] [i] [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();ムーブライト(false); } change = true; } else {repaint(); }} // public public void moveup(boolean flag){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 && list [i] [j] .value == list [i+1] {j] {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();ムーブアップ(false); } change = true; } else {repaint(); }} //移動下にpublic void movedown(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] [j] .value == list [i-1] [i-1] {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();移動(false); } change = 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] [i]; }}} // rsetがリストとは異なるかどうかを検出しないかどうかを検出しないかどうかを検出します。 真実; } 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; }}} //ランダムなrectangle @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(j)); }}}} if(list.size()== 0 &&!adirable()){gameover();戻る; }ランダムrand = new Random(); int index = rand.nextint(list.size());ポイント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; }} //他の手順があるかどうかを検出しますpublic boolean adirable(){checkmode = true;変更= false; 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 = new 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(); myp.validate(); getarandomrect(); getarandomrect(); getarandomrect(); getarandomrect(); }); JB2.AddActionListener(new ActionListener(){public void actionPerformed(actionEvent e){refreshbest(); file f = new file( "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( "continue"); 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( "unchecked")public void savethestep(){if(savelist.size()<20){@suppresswarnings( "rawtypes")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 = new File( "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スコアは "+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( "lastrecord")、 "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(japplet applet、int width、int height){jframe frame = new jframe(title(applet)); frame.addwindowlistener(new windowadapter(){public void windowclosing(windowevent e){refreshbest(); saverecord(); //system.out.println( "the score is"+scorelabel.getText();}}); frame.setDefaultCloseoperation(jframe.exit_on_close); frame.getContentPane()。add(applet); frame.setsize(幅、高さ); applet.init(); applet.start(); frame.setVisible(true); } public static void main(string [] args){run(new Game2048()、900、800); }}PS:参照には他の2つの2048ゲームをお勧めします(JS実装)
オンライン2048ゲーム:
http://tools.vevb.com/games/game2048
オンライン2048ミニゲームデジタルバージョン:
http://tools.vevb.com/games/game2048num
Javaアルゴリズムの詳細については、このサイトに興味のある読者は、「Javaデータ構造とアルゴリズムのチュートリアル」、「Java操作DOMノードのヒントの要約」、「Javaファイルの要約およびディレクトリ操作のヒント」、「Java Cache操作のヒントの要約」というトピックを見ることができます。
この記事がみんなのJavaプログラミングに役立つことを願っています。