2048小游戏(Java)(swing实现)(二)
最近扩充了一下知识面,实现了用键盘操控2048小游戏
但是还是不支持同时使用键盘和鼠标同时操作
1 import javax.swing.*; 2 3 //import com.sun.glass.events.KeyEvent; 4 5 import java.awt.*; 6 import java.awt.event.*; 7 8 public class JF2048 extends JFrame { 9 10 /** 11 * 12 */ 13 private static final long serialVersionUID = 1L; 14 15 private Ja2048 ja; 16 17 public JButton b[] = { 18 new JButton(), 19 new JButton(), 20 new JButton(), 21 new JButton() 22 }; 23 24 public JButton back = new JButton("back"); 25 26 private ActionListener b0 = new ActionListener(){ 27 public void actionPerformed(ActionEvent e){ 28 ja.cp0(); 29 }}; 30 31 private ActionListener b1 = new ActionListener(){ 32 public void actionPerformed(ActionEvent e){ 33 ja.cp1(); 34 }}; 35 36 private ActionListener b2 = new ActionListener(){ 37 public void actionPerformed(ActionEvent e){ 38 ja.cp2(); 39 }}; 40 41 private ActionListener b3 = new ActionListener(){ 42 public void actionPerformed(ActionEvent e){ 43 ja.cp3(); 44 }}; 45 46 private ActionListener back1 = new ActionListener(){ 47 public void actionPerformed(ActionEvent e){ 48 ja.back(); 49 }}; 50 51 public JLabel[][] la ={ 52 {new JLabel(),new JLabel(),new JLabel(),new JLabel()}, 53 {new JLabel(),new JLabel(),new JLabel(),new JLabel()}, 54 {new JLabel(),new JLabel(),new JLabel(),new JLabel()}, 55 {new JLabel(),new JLabel(),new JLabel(),new JLabel()}, 56 }; 57 58 59 public JF2048(){ 60 61 super("2048"); 62 63 //this.addKeyListener(x); 64 65 b[0].setBounds(3,20,16,156); 66 b[1].setBounds(178,20,16,156); 67 b[2].setBounds(20,3,156,16); 68 b[3].setBounds(20,178,156,16); 69 back.setBounds(3,3,16,16); 70 71 b[0].addActionListener(b0); 72 b[1].addActionListener(b1); 73 b[2].addActionListener(b2); 74 b[3].addActionListener(b3); 75 back.addActionListener(back1); 76 77 78 for(int i =0;i<4;i++) 79 for(int j =0;j<4;j++){ 80 la[i][j].setBounds(20+40*i,20+40*j,36,36); 81 la[i][j].setOpaque(true); 82 //la[i][j].setFont(new Font("幼圆",1,24)); 83 la[i][j].setHorizontalAlignment(SwingConstants.CENTER); 84 } 85 86 this.setSize(217,238); 87 //this.add(b[0]); 88 //this.add(b[1]); 89 //this.add(b[2]); 90 //this.add(b[3]); 91 //this.add(back); 92 for(int i =0;i<4;i++) 93 for(int j =0;j<4;j++) 94 this.add(la[i][j]); 95 JLabel p = new JLabel(); 96 p.setBackground(new Color(127,127,127)); 97 p.setOpaque(true); 98 this.add(p); 99 this.addKeyListener(new KeyAdapter()//键盘监听按钮 100 { 101 public void keyPressed(KeyEvent e) 102 { 103 switch(e.getKeyCode()){ 104 case KeyEvent.VK_UP:ja.cp2();break; 105 case KeyEvent.VK_DOWN:ja.cp3();break; 106 case KeyEvent.VK_RIGHT:ja.cp1();break; 107 case KeyEvent.VK_LEFT:ja.cp0();break; 108 case KeyEvent.VK_BACK_SPACE:ja.back(); 109 } 110 } 111 112 }); 113 114 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 115 this.setVisible(true); 116 } 117 118 public static void main(String[] args){ 119 JF2048 jf = new JF2048(); 120 jf.ja=new Ja2048(jf); 121 } 122 123 }
1 import java.awt.*; 2 public class Ja2048{ 3 4 public static int[][] state=new int[4][4]; 5 public static int[][] bac=new int[4][4]; 6 7 private JF2048 linkF; 8 9 10 public Ja2048(JF2048 a){ 11 this.linkF = a; 12 setNull(state,getRandom()); 13 setNull(state,getRandom()); 14 setState(); 15 } 16 /** 17 * 向左 18 */ 19 public void cp0(){ 20 boolean bool= false; 21 for(int i = 1;i<4;i++) 22 for(int j = 0;j<4;j++) 23 if(state[i][j]!=0&&(state[i-1][j]==0||state[i-1][j]==state[i][j])) 24 bool=true; 25 if(!bool)return; 26 27 for(int i =0;i<4;i++) 28 for(int j =0;j<4;j++) 29 bac[i][j]=state[i][j]; 30 31 int[][] b = new int[4][4]; 32 for(int j=0;j<4;j++){ 33 int[] a ={state[0][j],state[1][j],state[2][j],state[3][j]}; 34 b[j]=LierIntArr.drop(a); 35 } 36 setNull(b,getRandom()); 37 int[][] x=new int[4][4]; 38 for(int i=0;i<4;i++) 39 for(int j=0;j<4;j++) 40 x[i][j]=b[j][i]; 41 state=x; 42 setState(); 43 }//向左 44 /** 45 * 向右 46 */ 47 public void cp1(){ 48 boolean bool=false; 49 for(int i=0;i<3;i++) 50 for(int j=0;j<4;j++) 51 if(state[i][j]!=0&&(state[i+1][j]==0||state[i+1][j]==state[i][j])) 52 bool=true; 53 if(!bool)return; 54 bac=state; 55 int[][] b = new int[4][4]; 56 for(int j=0;j<4;j++){ 57 int[] a = {state[3][j],state[2][j],state[1][j],state[0][j]}; 58 b[j]=LierIntArr.drop(a); 59 } 60 setNull(b,getRandom()); 61 int[][] x=new int[4][4]; 62 for(int i=0;i<4;i++) 63 for(int j=0;j<4;j++) 64 x[i][j]=b[j][3-i]; 65 state=x; 66 setState(); 67 }//向右 68 /** 69 * 向上 70 */ 71 public void cp2(){ 72 boolean bool=false; 73 for(int i=0;i<4;i++) 74 for(int j=1;j<4;j++) 75 if(state[i][j]!=0&&(state[i][j-1]==0||state[i][j-1]==state[i][j])) 76 bool=true; 77 if(!bool)return; 78 bac=state.clone(); 79 int[][] b = new int[4][4]; 80 for(int i=0;i<4;i++) 81 b[i]=LierIntArr.drop(state[i]); 82 setNull(b,getRandom()); 83 state=b.clone(); 84 setState(); 85 }//向上 86 /** 87 * 向下 88 */ 89 public void cp3(){ 90 boolean bool=false; 91 for(int i=0;i<4;i++) 92 for(int j=0;j<3;j++) 93 if(state[i][j]!=0&&(state[i][j+1]==0||state[i][j+1]==state[i][j])) 94 bool=true; 95 if(!bool)return; 96 bac=state.clone(); 97 int[][] b=new int[4][4]; 98 for(int i=0;i<4;i++){ 99 int[] a ={state[i][3],state[i][2],state[i][1],state[i][0]}; 100 b[i]=LierIntArr.drop(a); 101 } 102 setNull(b,getRandom()); 103 int[][] x=new int[4][4]; 104 for(int i=0;i<4;i++) 105 for(int j=0;j<4;j++) 106 x[i][j]=b[i][3-j]; 107 state=x; 108 setState(); 109 }//向下 110 /** 111 * 回滚 112 */ 113 public void back(){ 114 state=bac.clone(); 115 setState(); 116 } 117 private void setState(){ 118 for(int i=0;i<4;i++) 119 for(int j=0;j<4;j++){ 120 if(state[i][j]==0){ 121 linkF.la[i][j].setText(""); 122 linkF.la[i][j].setBackground(new Color(227,227,227)); 123 linkF.la[i][j].setForeground(new Color(0,0,0)); 124 } 125 else if(state[i][j]==2){ 126 linkF.la[i][j].setText("2"); 127 linkF.la[i][j].setFont(new Font("幼圆",1,20)); 128 linkF.la[i][j].setBackground(new Color(255,255,255)); 129 linkF.la[i][j].setForeground(new Color(0,0,0)); 130 } 131 else if(state[i][j]==4){ 132 linkF.la[i][j].setText("4"); 133 linkF.la[i][j].setFont(new Font("幼圆",1,20)); 134 linkF.la[i][j].setBackground(new Color(127,227,127)); 135 linkF.la[i][j].setForeground(new Color(0,0,0)); 136 } 137 else if(state[i][j]==8){ 138 linkF.la[i][j].setText("8"); 139 linkF.la[i][j].setFont(new Font("幼圆",1,20)); 140 linkF.la[i][j].setBackground(new Color(0,127,127)); 141 linkF.la[i][j].setForeground(new Color(255,255,255)); 142 } 143 else if(state[i][j]==16){ 144 linkF.la[i][j].setText("16"); 145 linkF.la[i][j].setFont(new Font("幼圆",1,20)); 146 linkF.la[i][j].setBackground(new Color(0,255,0)); 147 linkF.la[i][j].setForeground(new Color(255,255,255)); 148 } 149 else if(state[i][j]==32){ 150 linkF.la[i][j].setText("32"); 151 linkF.la[i][j].setFont(new Font("幼圆",1,20)); 152 linkF.la[i][j].setBackground(new Color(127,127,0)); 153 linkF.la[i][j].setForeground(new Color(255,255,255)); 154 } 155 else if(state[i][j]==64){ 156 linkF.la[i][j].setText("64"); 157 linkF.la[i][j].setFont(new Font("幼圆",1,20)); 158 linkF.la[i][j].setBackground(new Color(255,0,0)); 159 linkF.la[i][j].setForeground(new Color(255,255,255)); 160 } 161 else if(state[i][j]==128){ 162 linkF.la[i][j].setText("128"); 163 linkF.la[i][j].setFont(new Font("幼圆",1,20)); 164 linkF.la[i][j].setBackground(new Color(127,255,0)); 165 linkF.la[i][j].setForeground(new Color(255,255,255)); 166 } 167 else if(state[i][j]==256){ 168 linkF.la[i][j].setText("256"); 169 linkF.la[i][j].setFont(new Font("幼圆",1,20)); 170 linkF.la[i][j].setBackground(new Color(255,255,0)); 171 linkF.la[i][j].setForeground(new Color(0,0,0)); 172 } 173 else if(state[i][j]==512){ 174 linkF.la[i][j].setText("512"); 175 linkF.la[i][j].setFont(new Font("幼圆",1,20)); 176 linkF.la[i][j].setBackground(new Color(255,255,0)); 177 linkF.la[i][j].setForeground(new Color(0,0,0)); 178 } 179 else if(state[i][j]==1024){ 180 linkF.la[i][j].setText("1024"); 181 linkF.la[i][j].setFont(new Font("幼圆",1,16)); 182 linkF.la[i][j].setBackground(new Color(63,63,63)); 183 linkF.la[i][j].setForeground(new Color(255,255,255)); 184 } 185 }//for循环 186 187 }//setState方法 188 189 private static int getRandom(){ 190 int a = (int)(1000*Math.random()); 191 if(a%10<3) 192 return 4; 193 else 194 return 2; 195 }//随机生成一个2或4,可通过调整判断条件中的数字大小来调整2和4所占的比率 196 /** 197 * 用于在4x4二维数组中随机挑出一个值为0的元素,并将其赋值为给定整数。特殊地,若该二维数组已满,返回false。 198 * @param x 该二维数组 199 * @param y 给定整数 200 * @return 201 */ 202 private static boolean setNull(int[][] x,int y){ 203 boolean bool=false; 204 for(int i=0;i<4;i++) 205 for(int j=0;j<4;j++) 206 if(x[i][j]==0)bool=true; 207 if(!bool)return false; 208 209 int a = (int)(100*Math.random()); 210 int b = (int)(6+10*Math.random()); 211 int c = a%b; 212 while(true){ 213 for(int i=0;i<4;i++) 214 for(int j=0;j<4;j++){ 215 if(x[i][j]==0&&c<=0){ 216 x[i][j]=y; 217 return true; 218 } 219 else if(x[i][j]==0&&c>0) 220 c--; 221 i=(i==4?0:i); 222 j=(j==4?0:j); 223 } 224 } 225 }//boolean setNull(int[][],int)方法用于在4x4二维数组中随机挑出一个值为0的元素,并将其赋值为给定整数。特殊地,若该二维数组已满,返回false。 226 227 228 }
1 /** 2 * 3 * @author qliujinming@qq.com 4 * 5 * @see http://www.cnblogs.com/liujinming/ 6 * 7 */ 8 public class LierIntArr{ 9 /** 10 * 该方法用于接受一个整数数组,对该数组进行drop操作后返回 11 * 示例:接受 2 0 2 0 5 5,返回4 10 0 0 0 0 12 * @param 需要进行drop操作的数组 13 * @return drop操作之后的数组 14 */ 15 public static int[] drop(int[] a){ 16 int b = a.length; 17 if(b<=1)return a; 18 int[] c = new int[b]; 19 int j=0; 20 for(int i=0;i<b;i++){ 21 if(c[j]==0&&a[i]!=0) 22 c[j]=a[i]; 23 else if(c[j]!=0&&a[i]==c[j]){ 24 c[j]=2*a[i]; 25 j++; 26 } 27 else if(a[i]!=0&&c[j]!=0&&a[i]!=c[j]){ 28 j++; 29 c[j]=a[i]; 30 } 31 } 32 return c; 33 } 34 //该方法用于接受一个整数数组,对该数组进行drop操作后返回 35 //示例:接受 2 0 2 0 5 5,返回4 10 0 0 0 0 36 37 public static void main(String[] args){ 38 int[] a = {0,2,0,2,4,0,0,4,2,0,2,5,5,0,10}; 39 int[] b = drop(a); 40 for(int i = 0;i<b.length;i++) 41 System.out.print(b[i]+","); 42 } 43 //输出结果:4,8,4,10,10,0,0,0,0,0,0,0,0,0,0, 44 45 }