首页 > 代码库 > 用java实现简易PC版2048

用java实现简易PC版2048

import java.awt.Color;import java.awt.EventQueue;import java.awt.BorderLayout;import java.awt.FlowLayout;import java.awt.Font;import java.awt.event.*;import java.util.Random;import javax.swing.BorderFactory;import javax.swing.Icon;import javax.swing.ImageIcon;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;import javax.swing.SwingConstants;import javax.swing.border.*;import javax.swing.JTextField;public class Copy2048 extends JFrame{    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,l5;                //用于判断游戏是否失败    Font font = new Font("", Font.BOLD,14);            //设置字体类型和大小    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(500, 50, 500, 615);        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, 50, 30);    //设置最懂啊分标签的位置尺寸        scoresPane.add(labelMaxScores);    //将最高分标签添加到得分容器中                textMaxScores = new JTextField("暂不可用");            //得分标签        textMaxScores.setBounds(60, 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(20, 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(120 * j, 120 * i, 100, 100);        //设置方块的大小位置                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(60,480,400,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:            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:            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:            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;        }    }}

 

用java实现简易PC版2048