2048小游戏

来源:互联网 发布:硬盘播放器 知乎 编辑:程序博客网 时间:2024/05/24 06:50

代码:

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

结果示意图:

这里写图片描述

这里写图片描述

0 0
原创粉丝点击