• java消消乐


    package game消消乐;
    
    import java.awt.BorderLayout;
    import java.awt.FlowLayout;
    import java.awt.GridLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.util.Random;
    import javax.swing.*;
    
    public class Myjframe extends JFrame {
        private JPanel panel1 = new JPanel();
        private JButton buttona = new JButton("开始");
        private JLabel label1 = new JLabel("分数");
        private JTextField textarea1 = new JTextField(10);
        private JLabel buttonc = new JLabel("时间");
        private JProgressBar jindu = new JProgressBar();
        private Timer timer;   //定时器
        private JButton buttonb = new JButton("退出");
        private JPanel panel2 = new JPanel();
        private JButton button[][] = new JButton[8][8];
        private int animal[][] = new int[8][8];
        private ImageIcon Iocn[] = new ImageIcon[7];
        // 标记是否有三个以上的连接
        private final int EMPTY = 0;// 无为0,有为1
        // 随机数
        private Random rand = new Random();// new 一个监听器
        // 标记是否有三个以上的连接
        private boolean isThreeLinked;
        // 标记单击次数
        private boolean isDoubleClicked;    
        private int x1;// 记录第一次被点击按钮的X坐标    
        private int y1;// 记录第一次被点击按钮的Y坐标
        private int grade = 0; //得分
    
        Myjframe() {
            // 加载图片
            Iocn[0] = new ImageIcon("image//cat.png");
            Iocn[1] = new ImageIcon("image//cattle.png");
            Iocn[2] = new ImageIcon("image//chicken.png");
            Iocn[3] = new ImageIcon("image//fox.png");
            Iocn[4] = new ImageIcon("image//monkey.png");
            Iocn[5] = new ImageIcon("image//panda.png");
            Iocn[6] = new ImageIcon("image//frog.png");
            panel1.setLayout(new FlowLayout());
            panel1.add(buttona);
            panel1.add(label1);
            panel1.add(textarea1);
            textarea1.setEditable(false);
            textarea1.setText(Integer.toString(grade));//
            panel1.add(buttonc);
            jindu.setMaximum(100);
            panel1.add(jindu);
            panel1.add(buttonb);
            this.setLayout(new BorderLayout());
            this.add(panel1, BorderLayout.NORTH);        
            panel2.setLayout(new GridLayout(8, 8, 1, 1));        
            MyListener mylisten = new MyListener();
            int m;
            // 初始化动物数组
            for (int i = 0; i < 8; i++)
                for (int j = 0; j < 8; j++) {
                    m = (int) (Math.random() * 7);
                    button[i][j] = new JButton(Iocn[m]);
                    animal[i][j] = m;
                    button[i][j].setSize(50, 50);
                    //button[i][j].setFont(new Font(null, Font.BOLD, 25));
                    button[i][j].addActionListener(mylisten);                
                    button[i][j].setEnabled(false); //图形按钮无效
                    panel2.add(button[i][j]);
                }
            this.add(panel2, BorderLayout.CENTER);        
            buttona.addActionListener(mylisten);
            buttonb.addActionListener(mylisten);
        }
    
        // 初始化动物数组
        private void initAnimalMatrix() {
            for (int i = 0; i < 8; i++) {
                for (int j = 0; j < 8; j++) {
                    // 随机选取动物
                    animal[i][j] = rand.nextInt(7);
                }
            }
        }
        //消除三个以上连接的点
        private void removeLinked(int x, int y) {
            if(animal[x][y] == EMPTY)return;
            int n=0;
            int tmp;
            int linked = 1;
            if (x + 1 < 8) {
                tmp = x + 1;
                while (tmp < 8 && animal[x][y] == animal[tmp][y]) {
                    linked++;
                    tmp++;
                }
            }
            if (x - 1 >= 0) {
                tmp = x - 1;
                while (tmp >= 0 && animal[x][y] == animal[tmp][y]) {
                    linked++;
                    tmp--;
                }
            }        
            if (linked >= 3) {
                n=n+linked; 
                tmp = x + 1;
                while (tmp < 8 && animal[tmp][y] == animal[x][y]) {                
                    animal[tmp][y] = EMPTY;
                    tmp++;
                }
                tmp = x - 1;
                while (tmp >= 0 && animal[tmp][y] == animal[x][y]) {
                    animal[tmp][y] = EMPTY;
                    tmp--;
                }
                // 当前交换过来的点
                animal[x][y] = EMPTY;
            }
            tmp = 0;
            linked = 1;
            if (y + 1 < 8) {
                tmp = y + 1;
                while (tmp < 8 && animal[x][y] == animal[x][tmp]) {
                    linked++;
                    tmp++;
                }
            }
            if (y - 1 >= 0) {
                tmp = y - 1;
                while (tmp >= 0 && animal[x][y] == animal[x][tmp]) {
                    linked++;
                    tmp--;
                }
            }
            if (linked >= 3) {
                n=n+linked; 
                tmp = y + 1;
                while (tmp < 8 && animal[x][y] == animal[x][tmp]) {
                    animal[x][tmp] = EMPTY;
                    tmp++;
                }
                tmp = y - 1;
                while (tmp >= 0 && animal[x][y] == animal[x][tmp]) {
                    animal[x][tmp] = EMPTY;
                    tmp--;
                }
                // 当前交换过来的点
                animal[x][y] = EMPTY;
            }        
            grade+=n*10;
            textarea1.setText(Integer.toString(grade));
            System.out.println(grade + " ======"+x+" "+y);
        }
        private boolean globalSearch(int flag) {
            if (1 == flag) {
                for (int i = 0; i < 8; i++) {
                    for (int j = 0; j < 8; j++) {
                        if (isThreeLinked(i, j)) {                        
                            return true;
                        }
                    }
                }
            } else if (2 == flag) {
                
                for (int i = 0; i < 8; i++) {
                    for (int j = 0; j < 8; j++) {
                        // 删除三个相连的点
                        removeLinked(i, j);
    
                    }
                }
            }
            return false;
        }
    
        // 是否有三个以上连接的点
        private boolean isThreeLinked(int x, int y) {
            int tmp;
            int linked = 1;
            if (x + 1 < 8) {
                tmp = x + 1;
                while (tmp < 8 && animal[x][y] == animal[tmp][y]) {
                    linked++;
                    tmp++;
                }
            }
            if (x - 1 >= 0) {
                tmp = x - 1;
                while (tmp >= 0 && animal[x][y] == animal[tmp][y]) {
                    linked++;
                    tmp--;
                }
            }
            if (linked >= 3) {
    
                return true;
            }
            linked = 1;
            if (y + 1 < 8) {
                tmp = y + 1;
                while (tmp < 8 && animal[x][y] == animal[x][tmp]) {
                    linked++;
                    tmp++;
                }
            }
            if (y - 1 >= 0) {
                tmp = y - 1;
                while (tmp >= 0 && animal[x][y] == animal[x][tmp]) {
                    linked++;
                    tmp--;
                }
            }
            if (linked >= 3) {
    
                return true;
            }
            return false;
        }
    
        // 更新动物矩阵
        private void updateAnimal() {
            for (int i = 0; i < 8; i++) {
                for (int j = 0; j < 8; j++) {
                    if (animal[i][j] == EMPTY) {
                        // 将矩阵中为空值的点再进行随机赋值
                        animal[i][j] = rand.nextInt(7);
                    }
                }
            }
        }
    
        // 动物下降
        private void downAnimal() {
            int tmp;
            for (int j = 8 - 1; j >= 0; j--) {
                for (int i = 0; i < 8; i++) {
                    if (animal[j][i] == EMPTY) {
                        for (int k = j - 1; k >= 0; k--) {
                            if (animal[k][i] != EMPTY) {
                                tmp = animal[k][i];
                                animal[k][i] = animal[j][i];
                                animal[j][i] = tmp;
                                break;
                            }
                        }
                    }
                }
            }
        }
    
        private void print() { //重新显示按钮图形
            for (int i = 0; i < 8; i++) {
                for (int j = 0; j < 8; j++) {
                    button[i][j].setIcon(Iocn[animal[i][j]]);
                }
            }
        }
    
        private void swapAnimal(int x, int y) {        
            if ((x >= 0 && x <= 8) && (y >= 0 && y <= 8)) {
                // 被点击的动物的坐标
                int x2;
                int y2;
                if (!isDoubleClicked) { //第一次单击
                    isDoubleClicked = true;
                    x1 = x;
                    y1 = y;
                    System.out.println("被单击的点的X坐标 = " + x1);
                    System.out.println("被单击的点的Y坐标 = " + y1);
                } else{               //第2次单击
                    x2 = x;
                    y2 = y;
                    isDoubleClicked = false;
                    //两点的坐标绝对值等于1时视为相邻的两点
                    if (1 == Math.abs(x2 - x1) && y2 == y1
                            || 1 == Math.abs(y2 - y1)&& x2 == x1) {
                        //-------------交换矩阵中相邻的两点的值--------------
                        int tmp;
                        tmp = animal[y2][x2];
                        animal[y2][x2] = animal[y1][x1];
                        animal[y1][x1] = tmp;
                        //-----------------------------------------------------
    
                        if (isThreeLinked(y2, x2)||isThreeLinked(y1, x1)) {
                            System.out.println("消除点");
                            if(isThreeLinked(y2, x2))
                                removeLinked(y2, x2);
                            if(isThreeLinked(y1, x1))
                                removeLinked(y1, x1);
                            downAnimal();//被削去处上方的动物下降
                            //该列上方重新随机产生新的动物,更新动物矩阵
                            updateAnimal();
                            print();
                            
                            //全局扫描判断是否有新的三个以上连接点,有则删除
                            while (globalSearch(1)) {
                                //全局扫描消除三个以上相连的点
                                globalSearch(2);
                                //动物再次下落
                                downAnimal();
                                //再次更新动物矩阵
                                updateAnimal();
                                print();
                                
                            }  
                        }
                        else {//没有三个以上相同的点,交换回来  
                            System.out.println("交换回来");
                            tmp = animal[y1][x1];
                            animal[y1][x1] = animal[y2][x2];
                            animal[y2][x2] = tmp;
                            print();                         
                        }
                    }
                }
            }
        }
        public void init() {
            do {
                System.out.println("重新初始化");
                initAnimalMatrix();
            } while (globalSearch(1));
            print();
            pack();
            setResizable(false);
            setVisible(true);
        }
    
    
        public static void main(String[] args) {
            Myjframe frame = new Myjframe();
            frame.setTitle("对对碰游戏2012-6-28");
            frame.setSize(500, 500);
            frame.setVisible(true);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.init();
        }
        // 监听器
        class MyListener implements ActionListener {
            public void actionPerformed(ActionEvent e) {
                if (e.getSource() == buttona) {
                    buttona.setEnabled(false);
                    jindu.setStringPainted(true);
                    jindu.setMaximum(100);
                    jindu.setMinimum(0);
                    timer = new Timer(800, new TimeListener());
                    timer.start();
                    grade = 0;
                    textarea1.setText(Integer.toString(grade));
                    for (int i = 0; i < 8; i++)
                        for (int j = 0; j < 8; j++) {
                            button[i][j].setEnabled(true); //图形按钮有效
                        }
                }
                if (e.getSource() == buttonb) {
                    System.out.println("end");
                    System.exit(1);
                }
                for (int i = 0; i < 8; i++) {
                    for (int j = 0; j < 8; j++) {
                        if (e.getSource() == button[i][j]) {
                            //System.out.println("第" + i + " " + j + "键");
                            swapAnimal(j, i);
                        }
                    }
                }
            }
        }
    
        class TimeListener implements ActionListener {
            int times = 0;
            public void actionPerformed(ActionEvent e) {
                jindu.setValue(times++);
                if (times > 100) {
                    timer.stop();
                    //定时器结束
                    for (int i = 0; i < 8; i++)
                        for (int j = 0; j < 8; j++) {
                            button[i][j].setEnabled(false); //图形按钮无效
                        }
                    buttona.setEnabled(true);
                }
            }
    
        }
    }
  • 相关阅读:
    linux学习网站
    Go select的使用和实现原理
    Python 多进程数据共享及异步调用 multiprocessing Manager ThreadPoolExecutor
    算法学习列表
    Jenkins build 的 lock resource
    Telegraf Input Plugin
    【转】Linux系统硬盘的IOPS测试
    SAP系统和微信集成的系列教程之四:如何将SAP C4C主数据变化推送给微信公众号的关注者
    SAP系统和微信集成的系列教程之三:微信用户关注公众号之后,自动在SAP C4C系统创建客户主数据
    SAP系统和微信集成的系列教程之二:如何通过微信公众号消费API
  • 原文地址:https://www.cnblogs.com/kekexxr/p/12292143.html
Copyright © 2020-2023  润新知