首页>代码>java swing高仿2048游戏代码>/game2048/src/AWTGame2048.java
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;

@SuppressWarnings("serial")
public class AWTGame2048 extends JApplet {
    @SuppressWarnings("unused")
    private static final int UP = 0, DOWN = 1, LEFT = 2, RIGHT = 3;
    private static final int WID = 150, SP = 10;
    @SuppressWarnings("unused")
    private int scores = 0;
    private static JLabel scoreLabel;
    private boolean change, CheckMode = false, gameOverFlag = false, successFlag = false;
    private int[] label = {2, 4, 8, 16, 32, 64, 128};
    private Color[] clo = {
            new Color(200, 200, 200), new Color(228, 228, 160), new Color(214, 163, 92),
            new Color(234, 124, 72), new Color(240, 84, 77), new Color(255, 68, 53), new Color(200, 200, 64)
    };
    @SuppressWarnings("rawtypes")
    private Map cmap = new HashMap();
    public static RectObject[][] rset = new RectObject[4][4];
    public RectObject[][] list = new RectObject[4][4];
    private My2048Panel myp;
    @SuppressWarnings("rawtypes")
    private LinkedList saveList = new LinkedList();
    private JButton goBackButton;
    KeyListener kl = new KeyListener() {
        public void keyPressed(KeyEvent e) {
            saveTheStep();
            goBackButton.setVisible(true);
            if (gameOverFlag == true) {
                return;
            }
            if (!aDirAble()) {
                gameOver();
            }
            int key = e.getKeyCode();
            switch (key) {
                case KeyEvent.VK_UP:
                    change = false;
                    moveUp(true);
                    if (change == true) {
                        getARandomRect();
                        //saveTheStep();
                    }
                    break;
                case KeyEvent.VK_DOWN:
                    change = false;
                    moveDown(true);
                    if (change == true) {
                        getARandomRect();
                        //saveTheStep();
                    }
                    break;
                case KeyEvent.VK_LEFT:
                    change = false;
                    moveLeft(true);
                    if (change == true) {
                        getARandomRect();
                        //saveTheStep();
                    }
                    break;
                case KeyEvent.VK_RIGHT:
                    change = false;
                    moveRight(true);
                    if (change == true) {
                        getARandomRect();
                        //saveTheStep();
                    }
                    break;
            }
            //saveTheStep();
        }

        public void keyTyped(KeyEvent e) {
        }

        public void keyReleased(KeyEvent e) {
        }
    };

    class RectObject {
        private int value;

        public RectObject() {
            value = 0;
        }

        public RectObject(RectObject obj) {
            value = obj.value;
        }

        public boolean equals(Object inobj) {
            RectObject obj = (RectObject) inobj;
            if (obj.value == value) {
                return true;
            }
            return false;
        }
    }

    class Point {
        int x;
        int y;

        public Point(int i, int j) {
            x = i;
            y = j;
        }
    }

    class My2048Panel extends JPanel {
        private int[] xindex = {SP, 2 * SP + WID, 3 * SP + 2 * WID, 4 * SP + 3 * WID};
        private int[] yindex = {SP, 2 * SP + WID, 3 * SP + 2 * WID, 4 * SP + 3 * WID};

        @SuppressWarnings("deprecation")
        public void paintComponent(Graphics g) {
            //background
            super.paintComponent(g);
            for (int i = 0; i < xindex.length; i++) {
                for (int j = 0; j < yindex.length; j++) {
                    g.setColor(Color.WHITE);
                    g.drawRoundRect(xindex[i], yindex[j], WID, WID, WID / 5, WID / 5);
                    g.setColor(new Color(197, 183, 129));
                    g.fillRoundRect(xindex[i], yindex[j], WID, WID, WID / 5, WID / 5);
                }
            }
            //paint rectangle
            for (int i = 0; i < 4; i++) {
                for (int j = 0; j < 4; j++) {
                    if (rset[i][j] != null) {
                        g.setColor(Color.WHITE);
                        g.drawRoundRect(yindex[j], xindex[i], WID, WID, WID / 5, WID / 5);
                        if (rset[i][j].value < 128) {
                            g.setColor((Color) cmap.get(rset[i][j].value));
                        } else {
                            g.setColor((Color) cmap.get(128));
                        }
                        g.fillRoundRect(yindex[j], xindex[i], WID, WID, WID / 5, WID / 5);
                        g.setColor(Color.BLACK);
                        Font font = new Font("TimesRoman", Font.BOLD, 50);
                        g.setFont(font);
                        FontMetrics fm = Toolkit.getDefaultToolkit().getFontMetrics(font);
                        int len = fm.stringWidth("" + rset[i][j].value);
                        int hg = fm.getHeight();
                        g.drawString("" + rset[i][j].value, yindex[j] + WID / 2 - len / 2, xindex[i] + WID / 2 + hg / 4);
                        if (rset[i][j].value == 2048 && successFlag == false) {
                            successFlag = true;
                            gameSuccess();
                        }
                    }
                }
            }
        }
    }

    class GameOverPane extends JPanel {
        public GameOverPane(int w, int h) {
            setSize(w, h);
            //setOpaque(false);
        }

        @SuppressWarnings("deprecation")
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            Font font = new Font("TimesRoman", Font.BOLD, 80);
            g.setFont(font);
            FontMetrics fm = Toolkit.getDefaultToolkit().getFontMetrics(font);
            int width = fm.stringWidth("Game Over");
            int height = fm.getHeight();
            g.setColor(new Color(255, 0, 0));
            g.drawString("Game Over!", getWidth() / 2 - width / 2, getHeight() / 2 - height / 2);
        }
    }

    class SuccessPane extends JPanel {
        public SuccessPane(int w, int h) {
            setSize(w, h);
            //setOpaque(false);
        }

        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            Font font = new Font("TimesRoman", Font.BOLD, 80);
            g.setFont(font);
            @SuppressWarnings("deprecation")
            FontMetrics fm = Toolkit.getDefaultToolkit().getFontMetrics(font);
            int width = fm.stringWidth("Success!");
            int height = fm.getHeight();
            g.setColor(new Color(255, 0, 0));
            g.drawString("Success!", getWidth() / 2 - width / 2, getHeight() / 2 - height / 2);
        }
    }

    class LOGO extends JPanel {
        public LOGO(int w, int h) {
            setSize(w, h);
        }

        @SuppressWarnings("unused")
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            Font font = new Font("TimesRoman", Font.BOLD, 60);
            g.setFont(font);
            @SuppressWarnings("deprecation")
            FontMetrics fm = Toolkit.getDefaultToolkit().getFontMetrics(font);
            int width = fm.stringWidth("2048");
            int height = fm.getHeight();
            g.setColor(new Color(255, 0, 0));
            g.drawString("2048", 20, getHeight() / 2 + 20);
        }
    }

    public class goBackListener implements ActionListener {
        @SuppressWarnings("rawtypes")
        public void actionPerformed(ActionEvent e) {
            if (saveList.size() == 0) {
                goBackButton.setVisible(false);
                return;
            }
            ArrayList arr = (ArrayList) saveList.getLast();
            scoreLabel.setText("" + arr.get(0));
            for (int i = 0; i < 4; i++) {
                for (int j = 0; j < 4; j++) {
                    int num = (int) arr.get(4 * i + j + 1);
                    if (num != 0) {
                        rset[i][j] = new RectObject();
                        rset[i][j].value = num;
                    } else {
                        rset[i][j] = null;
                    }
                }
            }
            saveList.removeLast();
            repaint();
        }
    }

    public class resetListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            refreshBest();
            for (int i = 0; i < 4; i++) {
                for (int j = 0; j < 4; j++) {
                    rset[i][j] = null;
                }
            }
            scoreLabel.setText("0");
            repaint();
            getARandomRect();
            getARandomRect();
        }
    }

    //the applet init
    public void init() {
        Container cp = getContentPane();
        cp.setLayout(null);
        cp.setFocusable(true);
        cp.addKeyListener(kl);
        Font font = new Font("TimesNewman", Font.BOLD, 30);
        JLabel sl = new JLabel();
        sl.setLayout(new GridLayout(2, 1));
        JLabel sllb = new JLabel("Scores");
        sllb.setFont(font);
        scoreLabel = new JLabel("0");
        scoreLabel.setFont(font);
        sl.add(sllb);
        sl.add(scoreLabel);
        int best = 0;
        try {
            File file = new File("BestRecord");
            if (file.exists()) {
                RandomAccessFile f = new RandomAccessFile(file, "rw");
                best = f.readInt();
                f.close();
            }
        } catch (FileNotFoundException e) {
            best = 0;
            e.printStackTrace();
        } catch (IOException e) {
            best = 0;
            e.printStackTrace();
        }
        JLabel bsl = new JLabel();
        bsl.setLayout(new GridLayout(2, 1));
        JLabel jl = new JLabel("Best");
        jl.setFont(font);
        JLabel jl1 = new JLabel("" + best);
        jl1.setFont(font);
        bsl.add(jl);
        bsl.add(jl1);
        myp = new My2048Panel();
        LOGO logo = new LOGO(0, 0);
        goBackButton = new JButton("UNDO");
        goBackButton.setFont(font);
        goBackButton.addActionListener(new goBackListener());
        goBackButton.addKeyListener(kl);
        JButton jb = new JButton("RESET");
        jb.setFont(font);
        jb.addActionListener(new resetListener());
        jb.addKeyListener(kl);
        sl.setBounds(500, 20, 200, 80);
        bsl.setBounds(300, 20, 200, 80);
        logo.setBounds(0, 0, 600, 100);
        myp.setBounds(0, 90, 700, 700);
        goBackButton.setBounds(700, 250, 150, 60);
        jb.setBounds(700, 450, 150, 60);
        cp.add(sl);
        cp.add(bsl);
        cp.add(logo);
        cp.add(myp);
        cp.add(goBackButton);
        cp.add(jb);
        File f = new File("LASTRECORD");
        if (f.exists()) {
            try {
                RandomAccessFile file = new RandomAccessFile(f, "rw");
                int num = file.readInt();
                scoreLabel.setText("" + num);
                for (int i = 0; i < 4; i++) {
                    for (int j = 0; j < 4; j++) {
                        num = file.readInt();
                        if (num != 0) {
                            rset[i][j] = new RectObject();
                            rset[i][j].value = num;
                        }
                    }
                }
                file.close();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        } else {
            getARandomRect();
            getARandomRect();
        }
    }

    @SuppressWarnings("unchecked")
    public AWTGame2048() {
        //saveTheStep();
        for (int i = 0; i < 7; i++) {
            cmap.put(label[i], clo[i]);
        }
    }

    //moveLeft
    public void moveLeft(boolean flag) {
        clearList(list);
        for (int i = 0; i < 4; i++) {
            int k = 0;
            for (int j = 0; j < 4; j++) {
                if (rset[i][j] != null) {
                    list[i][k++] = new RectObject(rset[i][j]);
                }
            }
        }
        for (int i = 0; i < 4 && flag; i++) {
            for (int j = 0; j < 3; j++) {
                if (list[i][j] != null && list[i][j + 1] != null && list[i][j].value == list[i][j + 1].value) {
                    list[i][j].value *= 2;
                    if (CheckMode == false) {
                        int sum = Integer.parseInt(scoreLabel.getText());
                        sum += list[i][j].value;
                        scoreLabel.setText("" + sum);
                    }
                    list[i][j + 1] = null;
                    j++;
                }
            }
        }
        if (isChange()) {
            if (CheckMode == false) {
                copySet(rset, list);
                repaint();
                moveLeft(false);
            }
            change = true;
        } else {
            repaint();
        }
    }

    //moveRight
    public void moveRight(boolean flag) {
        clearList(list);
        for (int i = 0; i < 4; i++) {
            int k = 3;
            for (int j = 3; j > -1; j--) {
                if (rset[i][j] != null) {
                    list[i][k--] = new RectObject(rset[i][j]);
                }
            }
        }
        for (int i = 0; i < 4 && flag; i++) {
            for (int j = 3; j > 0; j--) {
                if (list[i][j] != null && list[i][j - 1] != null && list[i][j].value == list[i][j - 1].value) {
                    list[i][j].value *= 2;
                    if (CheckMode == false) {
                        int sum = Integer.parseInt(scoreLabel.getText());
                        sum += list[i][j].value;
                        scoreLabel.setText("" + sum);
                    }
                    list[i][j - 1] = null;
                    j--;
                }
            }
        }
        if (isChange()) {
            if (CheckMode == false) {
                copySet(rset, list);
                repaint();
                moveRight(false);
            }
            change = true;
        } else {
            repaint();
        }
    }

    //moveup
    public void moveUp(boolean flag) {
        clearList(list);
        for (int j = 0; j < 4; j++) {
            int k = 0;
            for (int i = 0; i < 4; i++) {
                if (rset[i][j] != null) {
                    list[k++][j] = new RectObject(rset[i][j]);
                }
            }
        }
        for (int j = 0; j < 4 && flag; j++) {
            for (int i = 0; i < 3; i++) {
                if (list[i][j] != null && list[i + 1][j] != null && list[i][j].value == list[i + 1][j].value) {
                    list[i][j].value *= 2;
                    if (CheckMode == false) {
                        int sum = Integer.parseInt(scoreLabel.getText());
                        sum += list[i][j].value;
                        scoreLabel.setText("" + sum);
                    }
                    list[i + 1][j] = null;
                    i++;
                }
            }
        }
        if (isChange()) {
            if (CheckMode == false) {
                copySet(rset, list);
                repaint();
                moveUp(false);
            }
            change = true;
        } else {
            repaint();
        }
    }

    //movedown
    public void moveDown(boolean flag) {
        clearList(list);
        for (int j = 0; j < 4; j++) {
            int k = 3;
            for (int i = 3; i > -1; i--) {
                if (rset[i][j] != null) {
                    list[k--][j] = new RectObject(rset[i][j]);
                }
            }
        }
        for (int j = 0; j < 4 && flag; j++) {
            for (int i = 3; i > 0; i--) {
                if (list[i][j] != null && list[i - 1][j] != null && list[i][j].value == list[i - 1][j].value) {
                    list[i][j].value *= 2;
                    if (CheckMode == false) {
                        int sum = Integer.parseInt(scoreLabel.getText());
                        sum += list[i][j].value;
                        scoreLabel.setText("" + sum);
                    }
                    list[i - 1][j] = null;
                    i--;
                }
            }
        }
        if (isChange()) {
            if (CheckMode == false) {
                copySet(rset, list);
                repaint();
                moveDown(false);
            }
            change = true;
        } else {
            repaint();
        }
    }

    //other functions
    private void copySet(RectObject[][] dst, RectObject[][] src) {
        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < 4; j++) {
                dst[i][j] = src[i][j];
            }
        }
    }

    //detect whether rset is different from list or not
    private boolean isChange() {
        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < 4; j++) {
                if (rset[i][j] != null && list[i][j] != null && !rset[i][j].equals(list[i][j])) {
                    return true;
                }
                if (rset[i][j] != null && list[i][j] == null) {
                    return true;
                }
                if (rset[i][j] == null && list[i][j] != null) {
                    return true;
                }
            }
        }
        return false;
    }

    private void clearList(RectObject[][] s) {
        for (int i = 0; i < s.length; i++) {
            for (int j = 0; j < s[i].length; j++) {
                s[i][j] = null;
            }
        }
    }

    //get a random rectangle
    @SuppressWarnings({"unchecked", "rawtypes"})
    public void getARandomRect() {
        ArrayList list = new ArrayList();
        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < 4; j++) {
                if (rset[i][j] == null) {
                    list.add(new Point(i, j));
                }
            }
        }
        if (list.size() == 0 && !aDirAble()) {
            gameOver();
            return;
        }
        Random rand = new Random();
        int index = rand.nextInt(list.size());
        Point loc = (Point) list.get(index);
        index = rand.nextInt(2);
        rset[loc.x][loc.y] = new RectObject();
        if (index == 1) {
            rset[loc.x][loc.y].value = 4;
        } else {
            rset[loc.x][loc.y].value = 2;
        }
    }

    //detect whether there are other steps or not
    public boolean aDirAble() {
        CheckMode = true;
        change = false;
        moveLeft(true);
        moveRight(true);
        moveDown(true);
        moveUp(true);
        CheckMode = false;
        if (change == true) {
            return true;
        } else {
            return false;
        }
    }

    public void gameOver() {
        gameOverFlag = true;
        JPanel jl = new GameOverPane(myp.getWidth(), myp.getHeight());
        jl.setBounds(0, 0, 700, 700);
        JButton jb1 = new JButton("Again");
        Font font = new Font("TimesRoman", Font.BOLD, 30);
        jb1.setOpaque(false);
        jb1.setFont(font);
        JButton jb2 = new JButton("Close");
        jb2.setSize(jb1.getSize());
        jb2.setOpaque(false);
        jb2.setFont(font);
        jb1.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                scoreLabel.setText("0");
                myp.remove(jl);
                clearList(rset);
                myp.validate();
                getARandomRect();
                getARandomRect();
                repaint();
                gameOverFlag = false;
                refreshBest();
            }
        });
        jb2.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                refreshBest();
                File f = new File("LASTRECORD");
                if (f.exists()) {
                    f.delete();
                }
                System.exit(0);
            }
        });
        jl.add(jb1);
        jl.add(jb2);
        myp.add(jl);
        jl.validate();
    }

    public void gameSuccess() {
        JPanel jl = new SuccessPane(myp.getWidth(), myp.getHeight());
        jl.setOpaque(false);
        jl.setBounds(0, 0, 700, 700);
        JButton jb1 = new JButton("Continue");
        Font font = new Font("TimesRoman", Font.BOLD, 30);
        jb1.setOpaque(false);
        jb1.setFont(font);
        JButton jb2 = new JButton("Close");
        jb2.setSize(jb1.getSize());
        jb2.setOpaque(false);
        jb2.setFont(font);
        jb1.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                myp.remove(jl);
                myp.validate();
                repaint();
            }
        });
        jb2.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                refreshBest();
                System.exit(0);
            }
        });
        jl.add(jb1);
        jl.add(jb2);
        myp.add(jl);
        jl.validate();
    }

    @SuppressWarnings("unchecked")
    public void saveTheStep() {
        if (saveList.size() < 20) {
            @SuppressWarnings("rawtypes")
            ArrayList arr = new ArrayList();
            int score = Integer.parseInt(scoreLabel.getText());
            arr.add(score);
            for (int i = 0; i < 4; i++) {
                for (int j = 0; j < 4; j++) {
                    if (rset[i][j] != null) {
                        arr.add(rset[i][j].value);
                    } else {
                        arr.add(0);
                    }
                }
            }
            saveList.addLast(arr);
        } else {
            saveList.removeFirst();
            saveTheStep();
        }
    }

    public static String title(Object o) {
        String t = o.getClass().toString();
        if (t.indexOf("class") != -1) {
            t = t.substring(6);
        }
        return t;
    }

    public static void refreshBest() {
        try {
            int best = 0;
            File f = new File("BestRecord");
            RandomAccessFile file;
            if (f.exists()) {
                file = new RandomAccessFile(f, "rw");
                best = file.readInt();
                file.seek(0);
            } else {
                file = new RandomAccessFile(f, "rw");
            }
            //System.out.println("The Best score is "+best);
            int cur = Integer.parseInt(scoreLabel.getText());
            if (cur > best) {
                file.writeInt(cur);
            }
            file.close();
        } catch (FileNotFoundException e1) {
            e1.printStackTrace();
        } catch (IOException e2) {
            e2.printStackTrace();
        }
    }

    @SuppressWarnings("resource")
    public static void saveRecord() {
        try {
            RandomAccessFile file = new RandomAccessFile(new File("LASTRECORD"), "rw");
            int score = Integer.parseInt(scoreLabel.getText());
            file.writeInt(score);
            for (int i = 0; i < 4; i++) {
                for (int j = 0; j < 4; j++) {
                    if (rset[i][j] != null) {
                        file.writeInt(rset[i][j].value);
                    } else {
                        file.writeInt(0);
                    }
                }
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void run(JApplet applet, int width, int height) {
        JFrame frame = new JFrame(title(applet));
        frame.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                refreshBest();
                saveRecord();
                //System.out.println("The score is "+scoreLabel.getText());
            }
        });
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(applet);
        frame.setSize(width, height);
        applet.init();
        applet.start();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        run(new AWTGame2048(), 900, 800);
    }
}
最近下载更多
微信网友_6793785677565952  LV1 2023年12月25日
jkjfdgbkl  LV2 2023年11月1日
去死吧aaa  LV1 2023年6月20日
wxqxhm  LV1 2022年12月21日
总有人间一两风  LV8 2022年12月12日
xixiwoaini  LV3 2022年11月30日
微信网友_6004879537377280  LV3 2022年9月13日
cheng1127  LV1 2022年7月31日
1937291320  LV1 2022年3月5日
522484651  LV1 2021年11月16日
最近浏览更多
qqqww11  LV2 6月26日
不不要  LV1 5月15日
java小书童  LV18 1月18日
微信网友_6793785677565952  LV1 2023年12月25日
lshlsh 2023年12月25日
暂无贡献等级
jkjfdgbkl  LV2 2023年11月1日
去死吧aaa  LV1 2023年6月20日
hbj1285984841  LV4 2023年5月31日
LongTory  LV2 2023年4月4日
Wu_大花  LV1 2023年3月21日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友