首页 > 代码库 > 无聊写了个2048

无聊写了个2048

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) {

		}

	}

}


本文出自 “专注Java,linux技术” 博客,转载请与作者联系!