zoukankan      html  css  js  c++  java
  • 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);
                }
            }
    
        }
    }
  • 相关阅读:
    Server Tomcat v8.0 Server at localhost was unable to start within 45 seconds. If the server requires more time, try increasing the timeout in the server editor.
    用户画像——“打标签”
    python replace函数替换无效问题
    python向mysql插入数据一直报TypeError: must be real number,not str
    《亿级用户下的新浪微博平台架构》读后感
    【2-10】标准 2 维表问题
    【2-8】集合划分问题(给定要分成几个集合)
    【2-7】集合划分问题
    【2-6】排列的字典序问题
    【2-5】有重复元素的排列问题
  • 原文地址:https://www.cnblogs.com/kekexxr/p/12292143.html
Copyright © 2011-2022 走看看