2048-Javase代码
还有一个src目录下的 名为TopScore.properties文件 用于记录最高分 内容如下
# #Thu Mar 08 23:53:04 CST 2018 TOP=11
一下是源代码 因为用了递归算法 所以反应有一点慢..
import java.awt.Button; import java.awt.Color; import java.awt.Font; import java.awt.Frame; import java.awt.Label; import java.awt.Panel; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.FileReader; import java.io.IOException; import java.io.OutputStream; import java.io.Reader; import java.io.Writer; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.Properties; import javax.swing.SwingConstants; public class main { public static void main(String arg[]) { new showMainWin(); } } class showMainWin extends Frame{ int maxNumber ; int top_score ; lattice[][] latticebox = new lattice[4][4]; Panel panel ; Button newGame ; Label score_label; Label addScore_label ; Reader reader ; Properties p ; Font f_main = new Font("Arial",Font.BOLD,44); showMainWin(){ setBounds(200,200,600,800); setVisible(true); setTitle("2048_Lxa"); setLayout(null); setBackground(new Color(255,255,224)); this.setResizable(false); Label name_lable = new Label("2048"); Label score_labelTitle = new Label("SCORE",Label.CENTER); Label name_topScoreTitle = new Label("BEST",Label.CENTER); Font f_title = new Font("Arial",Font.BOLD,16); Font f_score = new Font("Arial",Font.BOLD,32); score_labelTitle.setFont(f_title); name_topScoreTitle.setFont(f_title); score_labelTitle.setForeground(Color.WHITE); name_topScoreTitle.setForeground(Color.WHITE); score_labelTitle.setBackground(new Color(211,211,211)); name_topScoreTitle.setBackground(new Color(211,211,211)); score_labelTitle.setBounds(250,50,150,20); name_topScoreTitle.setBounds(425,50,150,20); name_lable.setBounds(35,35,200,100); name_lable.setForeground(new Color(210,180,140)); Font f = new Font("Arial",Font.BOLD,78); name_lable.setFont(f); Label name_topScore = new Label("",Label.CENTER); name_topScore.setBackground(new Color(245,222,179)); name_topScore.setBounds(425,70,150,45); name_topScore.setFont(f_score); name_topScore.setForeground(Color.WHITE); score_label = new Label("0", Label.CENTER); score_label.setBounds(250,70,150,45); score_label.setBackground(new Color(245,222,179)); score_label.setFont(f_score); score_label.setForeground(Color.WHITE); addScore_label = new Label("",Font.CENTER_BASELINE); addScore_label.setForeground(Color.white); addScore_label.setBackground(new Color(245,222,179)); Font f_addScore = new Font("Arial",Font.BOLD,22); addScore_label.setFont(f_addScore); addScore_label.setBounds(360,70,35,25); newGame = new Button(); this.add(name_lable); this.add(addScore_label); this.add(score_label); this.add(name_topScore); this.add(score_labelTitle); this.add(name_topScoreTitle); name_topScore.setText(showTopScore()); LaunchMainLabel(); this.add(panel); //每个小格125*125 for(int a = 0 ;a<4;a++) { for(int b=0;b<4;b++) { lattice lat = new lattice(); lat.setLocation(a*10+a*125+10,b*10+b*125+10); panel.add(lat); lat.loc_x = a+1 ; lat.loc_y = b+1 ; latticebox[a][b] = lat ; } } launchLattice(2); addKeyListener(new keyMove()); this.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { setVisible(false); System.exit(0); } }); } public void LaunchMainLabel() { panel = new Panel(); panel.setVisible(true); panel.setLayout(null); panel.setBackground(new Color(238,232,170)); panel.setBounds(25,155,550,550); } public void launchLattice(int latNum){ List emptyList = new ArrayList(); for(int a=0;a<4;a++) { for(int b=0;b<4;b++) { if(latticebox[a][b].numValue == 0) { emptyList.add(latticebox[a][b]); } } } Iterator i = emptyList.iterator(); Collections.shuffle(emptyList); //随机打乱ArrayList if(latNum==1) { lattice latChangeNum = (lattice)i.next(); latChangeNum.numValue = 2 ; try { latChangeNum.setBackground(Color.WHITE); latChangeNum.setForeground(Color.BLACK); Thread.sleep(150); } catch (InterruptedException e) { e.printStackTrace(); } latChangeNum.setForeground(Color.WHITE); changeLattice(latChangeNum); }else if(latNum==2) { //进行第一次初始化 lattice latChangeNum1 = (lattice)i.next(); latChangeNum1.numValue = 2 ; lattice latChangeNum2 = (lattice)i.next(); latChangeNum2.numValue = 2 ; changeLattice(latChangeNum1); changeLattice(latChangeNum2); } } public void changeLattice(lattice lat) { int Num = lat.numValue ; if(Num==0) { lat.setBackground(new Color(255,250,205)); lat.setText(""); }else { int c_Num = 0 ; switch (Num){ case 2 : c_Num=1;break; case 4 : c_Num=2;break; case 8 : c_Num=3;break; case 16 : c_Num=4;break; case 32 : c_Num=5;break; case 64 : c_Num=6;break; case 128 : c_Num=7;break; case 256 : c_Num=8;break; case 512 : c_Num=9;break; case 1024 : c_Num=10;break; case 2048 : c_Num=11; } int c_a = 235 ; int c_b = 230-c_Num*20 ; int c_c = 230-c_Num*20 ; lat.setBackground(new Color(c_a,c_b,c_c)); lat.setText(""+Num); } } class lattice extends Label { int numValue = 0 ; int loc_x ; int loc_y ; lattice(){ //这里设置默认lattice setSize(125,125); setBackground(new Color(255,250,205)); Font f_latNum = new Font("Arial",Font.BOLD,56); this.setForeground(Color.white); this.setFont(f_latNum); this.setText(""); this.setAlignment(SwingConstants.CENTER); } } class numberLattice extends lattice { numberLattice(int number){ } } class keyMove extends KeyAdapter{ List w_list = new ArrayList(); List d_list = new ArrayList(); List r_list = new ArrayList(); List l_list = new ArrayList(); public void keyPressed(KeyEvent e) { if(e.getKeyCode()==KeyEvent.VK_W) { moveUp(); launchLattice(1); }else if(e.getKeyCode()==KeyEvent.VK_S) { moveDown(); launchLattice(1); }else if(e.getKeyCode()==KeyEvent.VK_A) { moveLeft(); launchLattice(1); }else if(e.getKeyCode()==KeyEvent.VK_D) { moveRight(); launchLattice(1); } } public void moveUp() { for(int a=0;a<4;a++) { for(int b=0;b<4;b++) { if(latticebox[a][b].numValue!=0) { w_list.add(latticebox[a][b]); } } } Iterator w_i = w_list.iterator(); lattice lat_around ; while(w_i.hasNext()) { lattice w_lat = (lattice)w_i.next(); while(w_lat.loc_y >= 2) { System.out.println(w_lat.loc_x+","+w_lat.loc_y); // System.out.println("!!!"); int x = w_lat.loc_x ; int y = w_lat.loc_y ; // System.out.println(x+"要移动之前"+y); lat_around = latticebox[x-1][y-2]; // System.out.println(lat_around.loc_x+"上方的"+lat_around.loc_y); if(lat_around.numValue==0) { int numValue = w_lat.numValue ; //向上移动一格 lattice j ; j = w_lat ; j.numValue = 0 ; w_lat = lat_around ; w_lat.numValue = numValue ; changeLattice(j); changeLattice(w_lat); }else if(lat_around.numValue == w_lat.numValue) { // System.out.println(lat_around.loc_x+"*"+lat_around.loc_y); int numValue = w_lat.numValue ; lattice k ; k = w_lat ; k.numValue = 0 ; w_lat = lat_around ; w_lat.numValue = numValue * 2; changeLattice(w_lat); changeLattice(k); addScore(numValue*2); cheakWin(w_lat); cheakDead(); }else { break ; } } } } public void moveDown() { for(int a=0;a<4;a++) { for(int b=3;b>=0;b--) { if(latticebox[a][b].numValue!=0) { // System.out.println(latticebox[a][b].loc_x+"存在数字的"+latticebox[a][b].loc_y); d_list.add(latticebox[a][b]); } } } Iterator d_i = d_list.iterator(); lattice lat_around ; while(d_i.hasNext()) { lattice d_lat = (lattice)d_i.next(); while(d_lat.loc_y <= 3) { System.out.println(d_lat.loc_x+","+d_lat.loc_y); // System.out.println("!!!"); int x = d_lat.loc_x ; int y = d_lat.loc_y ; // System.out.println(x+"要移动之前"+y); lat_around = latticebox[x-1][y]; // System.out.println(lat_around.loc_x+"上方的"+lat_around.loc_y); if(lat_around.numValue==0) { int numValue = d_lat.numValue ; //向上移动一格 lattice j ; j = d_lat ; j.numValue = 0 ; d_lat = lat_around ; d_lat.numValue = numValue ; changeLattice(j); changeLattice(d_lat); }else if(lat_around.numValue == d_lat.numValue) { // System.out.println(lat_around.loc_x+"*"+lat_around.loc_y); int numValue = d_lat.numValue ; lattice k ; k = d_lat ; k.numValue = 0 ; d_lat = lat_around ; d_lat.numValue = numValue * 2; changeLattice(d_lat); changeLattice(k); addScore(numValue*2); cheakWin(d_lat); cheakDead(); }else { break ; } } } } public void moveLeft() { for(int a=0;a<4;a++) { for(int b=0;b<4;b++) { if(latticebox[a][b].numValue!=0) { l_list.add(latticebox[a][b]); } } } Iterator l_i = l_list.iterator(); lattice lat_around ; while(l_i.hasNext()) { lattice l_lat = (lattice)l_i.next(); while(l_lat.loc_x >= 2) { int x = l_lat.loc_x ; int y = l_lat.loc_y ; lat_around = latticebox[x-2][y-1]; if(lat_around.numValue==0) { int numValue = l_lat.numValue ; //向上移动一格 lattice j ; j = l_lat ; j.numValue = 0 ; l_lat = lat_around ; l_lat.numValue = numValue ; changeLattice(j); changeLattice(l_lat); }else if(lat_around.numValue == l_lat.numValue) { // System.out.println(lat_around.loc_x+"*"+lat_around.loc_y); int numValue = l_lat.numValue ; lattice k ; k = l_lat ; k.numValue = 0 ; l_lat = lat_around ; l_lat.numValue = numValue * 2; changeLattice(l_lat); changeLattice(k); addScore(numValue*2); cheakWin(l_lat); cheakDead(); }else { break ; } } } } public void moveRight() { for(int a=3;a>=0;a--) { for(int b=0;b<4;b++) { if(latticebox[a][b].numValue!=0) { r_list.add(latticebox[a][b]); } } } Iterator r_i = r_list.iterator(); lattice lat_around ; while(r_i.hasNext()) { lattice r_lat = (lattice)r_i.next(); while(r_lat.loc_x <= 3) { int x = r_lat.loc_x ; int y = r_lat.loc_y ; lat_around = latticebox[x][y-1]; if(lat_around.numValue==0) { int numValue = r_lat.numValue ; //向上移动一格 lattice j ; j = r_lat ; j.numValue = 0 ; r_lat = lat_around ; r_lat.numValue = numValue ; changeLattice(j); changeLattice(r_lat); }else if(lat_around.numValue == r_lat.numValue) { // System.out.println(lat_around.loc_x+"*"+lat_around.loc_y); int numValue = r_lat.numValue ; lattice k ; k = r_lat ; k.numValue = 0 ; r_lat = lat_around ; r_lat.numValue = numValue * 2; changeLattice(r_lat); changeLattice(k); addScore(numValue*2); cheakWin(r_lat); cheakDead(); }else { break ; } } } } } public void scoreShow() { score_label.setText(""+maxNumber); } public void cheakWin(lattice lat) { if(lat.numValue == 2048) { checkTopScore(Integer.parseInt(score_label.getText())); Panel winPanel = new Panel(); winPanel.setBackground(new Color(245,222,179)); winPanel.setBounds(0,0,600,800); Button b_restart = new Button("PlayAgain"); Button b_exit = new Button("Exit"); b_exit.setFont(f_main); b_restart.setFont(f_main); b_restart.setBounds(200,200,200,100); b_exit.setBounds(200,400,200,100); b_restart.setBackground(new Color(255,255,224)); b_exit.setBackground(new Color(255,255,224)); winPanel.add(b_restart); winPanel.add(b_exit); panel.add(winPanel); b_exit.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { System.exit(0); } }); b_restart.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { for(int a=0;a<4;a++) { for(int b=0;b<4;b++) { lattice lat = latticebox[a][b]; lat.numValue = 0 ; } } winPanel.setVisible(false); } }); } } public void cheakDead() { int num = 0 ; int aroundNum = 0; for(int a=0;a<4;a++) { for(int b=0;b<4;b++) { if(latticebox[a][b].numValue!=0) { num++; lattice midLat = latticebox[a][b] ; int midValue = midLat.numValue ; try { lattice lattice_up = latticebox[a][b-1]; lattice lattice_down = latticebox[a][b+1]; lattice lattice_left = latticebox[a+1][b]; lattice lattice_right = latticebox[a-1][b]; if(lattice_up.numValue==midValue) { aroundNum++; } if(lattice_down.numValue==midValue) { aroundNum++; } if(lattice_left.numValue==midValue) { aroundNum++; } if(lattice_right.numValue==midValue) { aroundNum++; } }catch(Exception e) { //不可避免的。 } } } } if(num==16&&aroundNum==0) { //输了 Panel losePanel = new Panel(); losePanel.setBackground(new Color(245,222,179)); losePanel.setBounds(0,0,600,800); Button b_restart = new Button("ReTry"); Button b_exit = new Button("Exit"); b_exit.setFont(f_main); b_restart.setFont(f_main); b_restart.setBounds(200,200,200,100); b_exit.setBounds(200,400,200,100); b_restart.setBackground(new Color(255,255,224)); b_exit.setBackground(new Color(255,255,224)); losePanel.add(b_restart); losePanel.add(b_exit); panel.add(losePanel); b_exit.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { System.exit(0); } }); b_restart.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { for(int a=0;a<4;a++) { for(int b=0;b<4;b++) { lattice lat = latticebox[a][b]; lat.numValue = 0 ; } } losePanel.setVisible(false); } }); } } public String showTopScore() { p = new Properties(); reader = null; try { reader = new FileReader("src//TopScore"); } catch (FileNotFoundException e1) { e1.printStackTrace(); } try { p.load(reader); } catch (IOException e) { e.printStackTrace(); } String score = p.getProperty("TOP"); top_score = Integer.parseInt(score); System.out.println(score); return score ; } public void addScore(int addNum) { int nowScore = Integer.parseInt(score_label.getText()); int afterScore = nowScore + addNum ; String add = "+"+addNum ; addScore_label.setText(add); try { Thread.sleep(500); addScore_label.setText(""); } catch (InterruptedException e) { e.printStackTrace(); } score_label.setText(""+afterScore); } public void checkTopScore(int score) { if(top_score<score) { String top = ""+score; Properties p_in = new Properties(); OutputStream fos = null ; try { fos = new FileOutputStream("src//TopScore"); } catch (FileNotFoundException e1) { e1.printStackTrace(); } try { p_in.load(new FileInputStream("src//TopScore")); } catch (IOException e1) { e1.printStackTrace(); } p_in.setProperty("TOP", top); try { p_in.store(fos,"updata new top-score"); } catch (IOException e1) { e1.printStackTrace(); } } } }