2048小游戏

代码:

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;
        }
    }
}

结果示意图:

这里写图片描述

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值