代码:
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.Random;
import javax.swing.BorderFactory;
import javax.swing.Icon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
public class Copy2048 extends JFrame {
private static final long serialVersionUID = -1019108309790740156L;
private JPanel scoresPane;
private JPanel mainPane;
private JLabel labelMaxScores;
private JLabel labelScores;
private JLabel tips;// 提示操作标签
private JTextField textMaxScores;
private JLabel textScores;
private JLabel[][] texts;
private Icon icon2;
private int times = 16;// 记录剩余空方块数目
private int scores = 0;// 记录分数
private int l1, l2, l3, l4;// 用于判断游戏是否失败
Font font = new Font("华文楷体", Font.BOLD, 16);// 设置字体类型和大小
Font font2 = new Font("", Font.BOLD, 30);
Random random = new Random();
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Copy2048 frame = new Copy2048();
frame.setVisible(true);
// Thread thread = new Thread(frame);
// thread.start();
} catch (Exception e1) {
e1.printStackTrace();
}
}
});
}
/**
* 构造方法
*/
public Copy2048() {
super();
setResizable(false); // 禁止调整窗体大小
getContentPane().setLayout(null); // 设置空布局
setBounds(700, 220, 500, 600); // 设置在桌面上的位置和大小
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setTitle("2048PC版"); // 设置窗体标题
/*
* 创建分数显示面板
*/
scoresPane = new JPanel();
scoresPane.setBackground(Color.green); // 设置分数显示面板的背景色
scoresPane.setBounds(20, 20, 460, 40);
scoresPane.setBorder(BorderFactory.createMatteBorder(2, 2, 2, 2, Color.YELLOW));// 设置得分面板的边框
getContentPane().add(scoresPane); // 将得分面板添加到窗体
scoresPane.setLayout(null); // 设置面板空布局
/*
* 最高分标签
*/
labelMaxScores = new JLabel("最高分:");
labelMaxScores.setFont(font); // 设置字体类型和大小
labelMaxScores.setBounds(10, 5, 70, 30);// 设置最高分标签的位置尺寸
scoresPane.add(labelMaxScores); // 将最高分标签添加到得分容器中
textMaxScores = new JTextField(" 暂不可用");// 得分标签
textMaxScores.setBounds(80, 5, 150, 30);
textMaxScores.setFont(font);
textMaxScores.setEditable(false);
scoresPane.add(textMaxScores); // 将得分标签添加到分数面板中
/*
* 得分标签
*/
labelScores = new JLabel("得 分:");
labelScores.setFont(font); // 设置字体类型和大小
labelScores.setBounds(240, 5, 50, 30);
scoresPane.add(labelScores);
textScores = new JLabel(String.valueOf(scores));
textScores.setFont(font);
textScores.setBounds(290, 5, 150, 30);
scoresPane.add(textScores);
/*
* 创建游戏主面板
*/
mainPane = new JPanel();
mainPane.setBounds(28, 70, 460, 500); // 设置主面板位置尺寸
this.getContentPane().add(mainPane);
mainPane.setLayout(null); // 设置空布局
texts = new JLabel[4][4]; // 创建文本框二维数组
for (int i = 0; i < 4; i++) { // 遍历数组
for (int j = 0; j < 4; j++) {
texts[i][j] = new JLabel(); // 创建标签
texts[i][j].setFont(font2);
texts[i][j].setHorizontalAlignment(SwingConstants.CENTER);
texts[i][j].setText("");
texts[i][j].setBounds(110 * j, 110 * i, 109, 109);// 设置方块的大小位置
setColor(i, j, "");
texts[i][j].setOpaque(true);
texts[i][j].setBorder(BorderFactory.createMatteBorder(2, 2, 2, 2, Color.green));// 设置方块边框颜色
mainPane.add(texts[i][j]); // 将创建的文本框放在
}
}
/*
* 提示使用方法
*/
tips = new JLabel("Tips:使用上、下、左、右键或者W、S、A、D键控制");
tips.setFont(font);
tips.setBounds(10, 450, 430, 20);
mainPane.add(tips);
/*
* 为最高分标签添加按键监听器
*/
textMaxScores.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
do_label_keyPressed(e);// 调用时间处理方法
}
});
Create2();
Create2();
}
/**
* 按键输入事件的处理方法
*
* @param e
*/
protected void do_label_keyPressed(final KeyEvent e) {
int code = e.getKeyCode(); // 获取按键代码
int a; // a 的引入是为了防止连加的情况出现
String str;
String str1;
int num;
switch (code) {
case KeyEvent.VK_LEFT:
case KeyEvent.VK_A: // 如果按键代码是左方向键或者A键
for (int i = 0; i < 4; i++) {
a = 5;
for (int k = 0; k < 3; k++) {
for (int j = 1; j < 4; j++) { // 遍历16个方块
str = texts[i][j].getText(); // 获取当前方块标签文本字符
str1 = texts[i][j - 1].getText(); // 获取当前左1方块标签文本字符
if (str1.compareTo("") == 0) { // 如果左1方块文本为空字符
texts[i][j - 1].setText(str); // 字符左移
setColor(i, j - 1, str);
texts[i][j].setText(""); // 当前方块字符置空
setColor(i, j, "");
} else if ((str.compareTo(str1) == 0) && (j != a) && (j != a - 1)) {// 如果当前方块和左1方块文本字符相等
num = Integer.parseInt(str);
scores += num;
times++;
str = String.valueOf(2 * num);
texts[i][j - 1].setText(str); // 左1方块文本字符变为两方块之和
setColor(i, j - 1, str);
texts[i][j].setText(""); // 当前方块字符置空
setColor(i, j, "");
a = j;
}
}
}
}
l1 = 1;// 用于判断游戏是否失败
Create2();
break;
case KeyEvent.VK_RIGHT:
case KeyEvent.VK_D: // 如果按键代码是右方向键或者D键
for (int i = 0; i < 4; i++) {
a = 5;
for (int k = 0; k < 3; k++) {
for (int j = 2; j >= 0; j--) {
str = texts[i][j].getText();
str1 = texts[i][j + 1].getText();
if (str1.compareTo("") == 0) {
texts[i][j + 1].setText(str);
setColor(i, j + 1, str);
texts[i][j].setText("");
setColor(i, j, "");
} else if (str.compareTo(str1) == 0 && j != a && j != a + 1) {
num = Integer.parseInt(str);
scores += num;
times++;
str = String.valueOf(2 * num);
texts[i][j + 1].setText(str);
setColor(i, j + 1, str);
texts[i][j].setText("");
setColor(i, j, "");
a = j;
}
}
}
}
l2 = 1;
Create2();
break;
case KeyEvent.VK_UP:
case KeyEvent.VK_W: // 如果按键代码是上方向键或者W键
for (int j = 0; j < 4; j++) {
a = 5;
for (int k = 0; k < 3; k++) {
for (int i = 1; i < 4; i++) {
str = texts[i][j].getText();
str1 = texts[i - 1][j].getText();
if (str1.compareTo("") == 0) {
texts[i - 1][j].setText(str);
setColor(i - 1, j, str);
texts[i][j].setText("");
setColor(i, j, "");
} else if (str.compareTo(str1) == 0 && i != a && i != a - 1) {
num = Integer.parseInt(str);
scores += num;
times++;
str = String.valueOf(2 * num);
texts[i - 1][j].setText(str);
setColor(i - 1, j, str);
texts[i][j].setText("");
setColor(i, j, "");
a = i;
}
}
}
}
l3 = 1;
Create2();
break;
case KeyEvent.VK_DOWN:
case KeyEvent.VK_S: // 如果按键代码是下方向键或者S键
for (int j = 0; j < 4; j++) {
a = 5;
for (int k = 0; k < 5; k++) {
for (int i = 2; i >= 0; i--) {
str = texts[i][j].getText();
str1 = texts[i + 1][j].getText();
if (str1.compareTo("") == 0) {
texts[i + 1][j].setText(str);
setColor(i + 1, j, str);
texts[i][j].setText("");
setColor(i, j, "");
} else if (str.compareTo(str1) == 0 && i != a && i != a + 1) {
num = Integer.parseInt(str);
scores += num;
times++;
str = String.valueOf(2 * num);
texts[i + 1][j].setText(str);
setColor(i + 1, j, str);
texts[i][j].setText("");
setColor(i, j, "");
a = i;
}
}
}
}
l4 = 1;
Create2();
break;
default:
break;
}
textScores.setText(String.valueOf(scores));
}
/**
* 在随机位置产生一个2号方块的方法
*
* @param i,j
*/
public void Create2() {
int i, j;
boolean r = false;
String str;
if (times > 0) {
while (!r) {
i = random.nextInt(4);
j = random.nextInt(4);
str = texts[i][j].getText();
if ((str.compareTo("") == 0)) {
texts[i][j].setIcon(icon2);
texts[i][j].setText("2");
setColor(i, j, "2");
times--;
r = true;
l1 = l2 = l3 = l4 = 0;
}
}
} else if (l1 > 0 && l2 > 0 && l3 > 0 && l4 > 0) {// l1到l4同时被键盘赋值为1说明任何方向键都不能产生新的数字2,说明游戏失败
tips.setText(" GAME OVER !");
}
}
/**
* 设置标签颜色
*
* @param i , j ,str
*/
public void setColor(int i, int j, String str) {
switch (str) {
case "2":
texts[i][j].setBackground(Color.yellow);
break;
case "4":
texts[i][j].setBackground(Color.red);
break;
case "8":
texts[i][j].setBackground(Color.pink);
break;
case "16":
texts[i][j].setBackground(Color.orange);
break;
case "32":
texts[i][j].setBackground(Color.magenta);
break;
case "64":
texts[i][j].setBackground(Color.LIGHT_GRAY);
break;
case "128":
texts[i][j].setBackground(Color.green);
break;
case "256":
texts[i][j].setBackground(Color.gray);
break;
case "512":
texts[i][j].setBackground(Color.DARK_GRAY);
break;
case "1024":
texts[i][j].setBackground(Color.cyan);
break;
case "2048":
texts[i][j].setBackground(Color.blue);
break;
case "":
case "4096":
texts[i][j].setBackground(Color.white);
break;
default:
break;
}
}
}
结果示意图: