import java.awt.Color;import java.awt.Font;import java.awt.event.KeyEvent;import java.awt.event.KeyListener;import java.awt.event.MouseAdapter;import java.awt.event.MouseEvent;import java.util.Random;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JMenu;import javax.swing.JMenuBar;import javax.swing.JOptionPane;import javax.swing.JPanel;import javax.swing.SwingConstants;import javax.swing.border.EmptyBorder;/** * 修复了一些bug 加入了判断输赢的功能 *  * @author Administrator *  */public class Game1_2 {	private JFrame jf = null;	private JPanel contentPane = null;	private int[][] num = new int[4][4];	private JLabel[][] labels = new JLabel[4][4];	private Random r = new Random();	boolean flag = false;	boolean isWin = false;	public static void main(String[] args) {		new Game1_2().go();	}	public void go() {		jf = new JFrame("2048小游戏");		jf.setResizable(false);		init();		initNum();		jf.setVisible(true);		jf.addKeyListener(new MyKeyListener());		jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);		/**		 * 开启一个线程用来判断用户的输赢的		 */		new Thread(new Runnable() {			@Override			public void run() {				while (true) {					int length = num.length;					while (!isWin) {						int count = 0;						for (int i = 0; i < length; i++) {							for (int j = 0; j < length - 1; j++) {								if (num[i][j] != num[i][j + 1]										&& num[i][j] != 0 && num[i][j + 1] != 0) {									count++;								}							}						}						for (int i = 0; i < length; i++) {							for (int j = 0; j < length - 1; j++) {								if (num[j][i] != num[j + 1][i]										&& num[j][i] != 0 && num[j + 1][i] != 0) {									count++;								}							}						}						for (int i = 0; i < length; i++) {							for (int j = 0; j < length - 1; j++) {								if (num[j][i] == 2048) {									JOptionPane.showMessageDialog(jf, "你是王者!");									isWin = true;								}							}						}						if (count == 24) {							JOptionPane.showMessageDialog(jf, "没关系,再来一次");							isWin = true;						}					}				}			}		}).start();	}	/**	 * 初始化JLabel	 */	public void initNum() {		for (int i = 0; i < labels.length; i++) {			for (int j = 0; j < labels[i].length; j++) {				if (num[i][j] != 0) {					labels[i][j].setText(num[i][j] + "");					if (num[i][j] == 2) {						labels[i][j].setBackground(new Color(255, 255, 0));					} else if (num[i][j] == 4) {						labels[i][j].setBackground(new Color(223, 159, 0));					} else if (num[i][j] == 8) {						labels[i][j].setBackground(new Color(231, 69, 8));					} else if (num[i][j] == 16) {						labels[i][j].setBackground(new Color(102, 118, 151));					} else if (num[i][j] == 32) {						labels[i][j].setBackground(new Color(43, 68, 235));					} else if (num[i][j] == 64) {						labels[i][j].setBackground(new Color(255, 0, 255));					} else if (num[i][j] == 128) {						labels[i][j].setBackground(new Color(255, 80, 6));					} else if (num[i][j] == 256) {						labels[i][j].setBackground(new Color(6, 219, 0));					} else if (num[i][j] == 512) {						labels[i][j].setBackground(new Color(205, 254, 104));					} else if (num[i][j] == 1024) {						labels[i][j].setBackground(new Color(165, 165, 165));					} else if (num[i][j] == 2048) {						labels[i][j].setBackground(new Color(232, 192, 58));					} else if (num[i][j] == 4096) {						labels[i][j].setBackground(new Color(255, 80, 6));					}				} else {					labels[i][j].setText("");					labels[i][j].setBackground(new Color(255, 255, 255));				}			}		}	}	/**	 * 初始化界面	 */	public void init() {		num[r.nextInt(4)][r.nextInt(4)] = 2;		for (int i = 0; i < labels.length; i++) {			for (int j = 0; j < labels[i].length; j++) {				labels[i][j] = new JLabel();			}		}				JMenu menu = new JMenu("重新开始");		menu.addMouseListener(new MouseAdapter() {			@Override			public void mouseClicked(MouseEvent e) {				// TODO Auto-generated method stub				for (int i = 0; i < num.length; i++) {					for (int j = 0; j < num[i].length; j++) {						num[i][j] = 0;					}				}				num[r.nextInt(4)][r.nextInt(4)] = 2;				initNum();				isWin = false;			}		});				JMenu help = new JMenu("帮助");		help.addMouseListener(new MouseAdapter() {			@Override			public void mouseClicked(MouseEvent e) {				// TODO Auto-generated method stub				JOptionPane.showMessageDialog(jf, "用键盘上的:↑ ← → ↓ 来控制移动。");			}		});		JMenu about = new JMenu("关于");		about.addMouseListener(new MouseAdapter() {			@Override			public void mouseClicked(MouseEvent e) {				// TODO Auto-generated method stub				JOptionPane.showMessageDialog(jf, "制作:吴庆龙\nQQ:1554165134");			}		});				JMenuBar bar = new JMenuBar();		bar.add(menu);		bar.add(help);		bar.add(about);				jf.setJMenuBar(bar);				jf.setFont(null);		jf.setBounds(100, 100, 368, 410);		contentPane = new JPanel();		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));		jf.setContentPane(contentPane);		contentPane.setLayout(null);		labels[0][0] = new JLabel();		labels[0][0].setOpaque(true);		labels[0][0].setFont(new Font("宋体", Font.PLAIN, 40));		labels[0][0].setHorizontalAlignment(SwingConstants.CENTER);		labels[0][0].setBounds(0, 0, 85, 85);		contentPane.add(labels[0][0]);		labels[0][1] = new JLabel();		labels[0][1].setFont(new Font("宋体", Font.PLAIN, 40));		labels[0][1].setOpaque(true);		labels[0][1].setHorizontalAlignment(SwingConstants.CENTER);		labels[0][1].setBounds(90, 0, 85, 85);		contentPane.add(labels[0][1]);		labels[0][2] = new JLabel();		labels[0][2].setFont(new Font("宋体", Font.PLAIN, 40));		labels[0][2].setOpaque(true);		labels[0][2].setHorizontalAlignment(SwingConstants.CENTER);		labels[0][2].setBounds(180, 0, 85, 85);		contentPane.add(labels[0][2]);		labels[0][3] = new JLabel();		labels[0][3].setFont(new Font("宋体", Font.PLAIN, 40));		labels[0][3].setOpaque(true);		labels[0][3].setHorizontalAlignment(SwingConstants.CENTER);		labels[0][3].setBounds(270, 0, 85, 85);		contentPane.add(labels[0][3]);		labels[1][0] = new JLabel();		labels[1][0].setFont(new Font("宋体", Font.PLAIN, 40));		labels[1][0].setOpaque(true);		labels[1][0].setHorizontalAlignment(SwingConstants.CENTER);		labels[1][0].setBounds(0, 90, 85, 85);		contentPane.add(labels[1][0]);		labels[1][1] = new JLabel();		labels[1][1].setFont(new Font("宋体", Font.PLAIN, 40));		labels[1][1].setOpaque(true);		labels[1][1].setHorizontalAlignment(SwingConstants.CENTER);		labels[1][1].setBounds(90, 90, 85, 85);		contentPane.add(labels[1][1]);		labels[1][2] = new JLabel();		labels[1][2].setFont(new Font("宋体", Font.PLAIN, 40));		labels[1][2].setOpaque(true);		labels[1][2].setHorizontalAlignment(SwingConstants.CENTER);		labels[1][2].setBounds(180, 90, 85, 85);		contentPane.add(labels[1][2]);		labels[1][3] = new JLabel();		labels[1][3].setFont(new Font("宋体", Font.PLAIN, 40));		labels[1][3].setOpaque(true);		labels[1][3].setHorizontalAlignment(SwingConstants.CENTER);		labels[1][3].setBounds(270, 90, 85, 85);		contentPane.add(labels[1][3]);		labels[2][0] = new JLabel();		labels[2][0].setFont(new Font("宋体", Font.PLAIN, 40));		labels[2][0].setOpaque(true);		labels[2][0].setHorizontalAlignment(SwingConstants.CENTER);		labels[2][0].setBounds(0, 180, 85, 85);		contentPane.add(labels[2][0]);		labels[2][1] = new JLabel();		labels[2][1].setFont(new Font("宋体", Font.PLAIN, 40));		labels[2][1].setOpaque(true);		labels[2][1].setHorizontalAlignment(SwingConstants.CENTER);		labels[2][1].setBounds(90, 180, 85, 85);		contentPane.add(labels[2][1]);		labels[2][2] = new JLabel();		labels[2][2].setFont(new Font("宋体", Font.PLAIN, 40));		labels[2][2].setOpaque(true);		labels[2][2].setHorizontalAlignment(SwingConstants.CENTER);		labels[2][2].setBounds(180, 180, 85, 85);		contentPane.add(labels[2][2]);		labels[2][3] = new JLabel();		labels[2][3].setFont(new Font("宋体", Font.PLAIN, 40));		labels[2][3].setOpaque(true);		labels[2][3].setHorizontalAlignment(SwingConstants.CENTER);		labels[2][3].setBounds(270, 180, 85, 85);		contentPane.add(labels[2][3]);		labels[3][0] = new JLabel();		labels[3][0].setFont(new Font("宋体", Font.PLAIN, 40));		labels[3][0].setOpaque(true);		labels[3][0].setHorizontalAlignment(SwingConstants.CENTER);		labels[3][0].setBounds(0, 270, 85, 85);		contentPane.add(labels[3][0]);		labels[3][1] = new JLabel();		labels[3][1].setFont(new Font("宋体", Font.PLAIN, 40));		labels[3][1].setOpaque(true);		labels[3][1].setHorizontalAlignment(SwingConstants.CENTER);		labels[3][1].setBounds(90, 270, 85, 85);		contentPane.add(labels[3][1]);		labels[3][2] = new JLabel();		labels[3][2].setFont(new Font("宋体", Font.PLAIN, 40));		labels[3][2].setOpaque(true);		labels[3][2].setHorizontalAlignment(SwingConstants.CENTER);		labels[3][2].setBounds(180, 270, 85, 85);		contentPane.add(labels[3][2]);		labels[3][3] = new JLabel();		labels[3][3].setFont(new Font("宋体", Font.PLAIN, 40));		labels[3][3].setOpaque(true);		labels[3][3].setHorizontalAlignment(SwingConstants.CENTER);		labels[3][3].setBounds(270, 270, 85, 85);		contentPane.add(labels[3][3]);	}	/**	 * 随机产生2或者4	 */	public void randomNum() {		while (true) {			int i = r.nextInt(4);			int j = r.nextInt(4);			int k = r.nextInt(2);			if (k == 1) {				if (num[i][j] == 0) {					num[i][j] = 4;					break;				}			}			if (k == 0) {				if (num[i][j] == 0) {					num[i][j] = 2;					break;				}			}		}	}	/**	 * 键盘监听器	 * 	 * @author Administrator	 * 	 */	class MyKeyListener implements KeyListener {		@Override		public void keyTyped(KeyEvent e) {		}		@Override		public void keyPressed(KeyEvent e) {			if (e.getKeyCode() == KeyEvent.VK_UP) {				// [0][0] [0][1] [0][2] [0][3]				// [1][0] [1][1] [1][2] [1][3]				// [2][0] [2][1] [2][2] [2][3]				// [3][0] [3][1] [3][2] [3][3]				int length = num.length;				for (int i = 0; i < length; i++) {					for (int j = 0; j < length - 1; j++) {						// 中间有一个 0						if (num[j][i] == 0) {							for (int j2 = j + 1; j2 < length - 1; j2++) {								if (num[j2][i] != 0) {									num[j][i] = num[j2][i];									num[j2][i] = 0;									flag = true;									break;								}							}						}					}				}				for (int i = 0; i < length; i++) {					if (num[3][i] != 0) {						for (int j2 = 0; j2 < length; j2++) {							if (num[j2][i] == 0) {								num[j2][i] = num[3][i];								num[3][i] = 0;								flag = true;							}						}					}				}				for (int i = 0; i < length; i++) {					for (int j = 0; j < length - 1; j++) {						// 中间没有 0						if (num[j][i] == num[j + 1][i] && num[j][i] != 0) {							num[j][i] *= 2;							for (int j2 = j + 1; j2 < length - 1; j2++) {								num[j2][i] = num[j2 + 1][i];							}							num[3][i] = 0;							flag = true;						}					}				}				if (flag) {					randomNum();					initNum();					flag = false;				}			} else if (e.getKeyCode() == KeyEvent.VK_DOWN) {				int length = num.length;				for (int i = length - 1; i >= 0; i--) {					for (int j = length - 1; j >= 0; j--) {						// 中间有一个 0						if (num[j][i] == 0) {							for (int j2 = j - 1; j2 > 0; j2--) {								if (num[j2][i] != 0) {									num[j][i] = num[j2][i];									num[j2][i] = 0;									flag = true;									break;								}							}						}					}				}				for (int i = length - 1; i >= 0; i--) {					if (num[0][i] != 0) {						for (int j2 = length - 1; j2 > 0; j2--) {							if (num[j2][i] == 0) {								num[j2][i] = num[0][i];								num[0][i] = 0;								flag = true;							}						}					}				}				for (int i = length - 1; i >= 0; i--) {					for (int j = length - 1; j > 0; j--) {						// 中间没有 0						if (num[j][i] == num[j - 1][i] && num[j][i] != 0) {							num[j][i] *= 2;							for (int j2 = j - 1; j2 > 0; j2--) {								num[j2][i] = num[j2 - 1][i];							}							num[0][i] = 0;							flag = true;						}					}				}				if (flag) {					randomNum();					initNum();					flag = false;				}			} else if (e.getKeyCode() == KeyEvent.VK_LEFT) {				int length = num.length;				for (int i = 0; i < length; i++) {					for (int j = 0; j < length - 1; j++) {						// 中间有一个 0						if (num[i][j] == 0) {							for (int j2 = j + 1; j2 < length - 1; j2++) {								if (num[i][j2] != 0) {									num[i][j] = num[i][j2];									num[i][j2] = 0;									flag = true;									break;								}							}						}					}				}				for (int i = 0; i < length; i++) {					if (num[i][3] != 0) {						for (int j2 = 0; j2 < length - 1; j2++) {							if (num[i][j2] == 0) {								num[i][j2] = num[i][3];								num[i][3] = 0;								flag = true;							}						}					}				}				for (int i = 0; i < length; i++) {					for (int j = 0; j < length - 1; j++) {						// 中间已经没有 0 了						if (num[i][j] == num[i][j + 1] && num[i][j] != 0) {							num[i][j] *= 2;							for (int j2 = j + 1; j2 < length - 1; j2++) {								num[i][j2] = num[i][j2 + 1];							}							num[i][3] = 0;							flag = true;						}					}				}				if (flag) {					randomNum();					initNum();					flag = false;				}			} else if (e.getKeyCode() == KeyEvent.VK_RIGHT) {				int length = num.length;				for (int i = 3; i >= 0; i--) {					for (int j = 3; j > 0; j--) {						// 中间有一个 0						if (num[i][j] == 0) {							for (int j2 = j - 1; j2 > 0; j2--) {								if (num[i][j2] != 0) {									num[i][j] = num[i][j2];									num[i][j2] = 0;									flag = true;									break;								}							}						}					}				}				for (int i = 3; i >= 0; i--) {					if (num[i][0] != 0) {						for (int j2 = length - 1; j2 > 0; j2--) {							if (num[i][j2] == 0) {								num[i][j2] = num[i][0];								num[i][0] = 0;								flag = true;							}						}					}				}				for (int i = length - 1; i >= 0; i--) {					for (int j = length - 1; j > 0; j--) {						// 中间已经没有 0 了						if (num[i][j] == num[i][j - 1] && num[i][j] != 0) {							num[i][j] *= 2;							for (int j2 = j - 1; j2 > 0; j2--) {								num[i][j2] = num[i][j2 - 1];							}							num[i][0] = 0;							flag = true;						}					}				}				if (flag) {					randomNum();					initNum();					flag = false;				}			}		}		@Override		public void keyReleased(KeyEvent e) {		}	}}