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

    }
}

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM