日期:2014-05-20  浏览次数:20812 次

扫雷中雷数为0的怎样递归的去实现周围有0的一起显示?
Java code

public class ShaoLei extends JFrame implements ActionListener {
    public JButton[][] jbu = new JButton[15][20];
    public static int[][] number = new int[15][20];// 有雷 的坐标保存为1,无雷为0
    public static int[][] numberL = new int[15][20];// 对应坐标为周围雷的数量,如果该坐标是雷,保存为9
    public int[][] xy = { { -1, -1 }, { -1, 0 }, { -1, 1 }, { 0, 1 }, { 1, 1 },
            { 1, 0 }, { 1, -1 }, { 0, -1 } };// 该数组对应了相应坐标周围的8个坐标的加减

    public ShaoLei() {
        setTitle("一個簡單的掃雷實現");
        setBounds(100, 100, 1000, 800);
        init();
        setVisible(true);
        setLayout(new GridLayout(15, 20));
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public void init() {
        printQP();// 生成按钮
        initNumber();// 随机生成50个雷
        countL();// 该方法用来计算对应坐标周围雷的数量,并保存到numberL 数组
    }

    // 随机生成50个雷
    public void initNumber() {
        int x = (int) (Math.random() * 15);
        int y = (int) (Math.random() * 20);
        int i = 0;
        while (i < 50) {
            if (i == 0) {
                number[x][y] = 1;
            } else {
                while (number[x][y] == 1) {// 如果该位置已经有雷则重新生成x和y,则到没有和前面的重复
                    x = (int) (Math.random() * 15);
                    y = (int) (Math.random() * 20);
                }
                number[x][y] = 1;
            }
            i++;
        }
    }

    // 生成按钮
    public void printQP() {
        for (int i = 0; i < jbu.length; i++) {
            for (int j = 0; j < jbu[i].length; j++) {
                jbu[i][j] = new JButton();
                jbu[i][j].addActionListener(this);
                add(jbu[i][j]);
            }
        }
    }

    // 该方法用来计算雷的数量
    public void countL() {
        for (int i = 0; i < number.length; i++) {
            for (int j = 0; j < number[i].length; j++) {
                int sumT = 0;//计数每个坐标周围的雷数
                if (number[i][j] == 0) {// 如果不是雷则对该坐标周围的8个按钮进行判断
                    for (int k = 0; k < xy.length; k++) {// 循环8次
                        int[] tempXY = xy[k];
                        int TX = i + tempXY[0];// 每次循环的X坐标
                        int TY = j + tempXY[1];// 每次循环的Y坐标
                        if (TX >= 0 && TY >= 0 && TX <= 14 && TY <= 19) {// 如果越界就不计算在内
                            if (number[TX][TY] == 1) {// 如果该坐标是雷则sumT加 1
                                sumT++;
                            }
                        }
                    }
                    numberL[i][j] = sumT;// 将计算出的改坐标的累的数量保存到numberL数组
                } else if (number[i][j] == 1) {//如果该坐标有雷,则将该数组的该处保存为9
                    numberL[i][j] = 9;
                }

            }
        }
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        JButton jb = (JButton) e.getSource();
        int x = 0, y = 0;
        for (int i = 0; i < jbu.length; i++)
            for (int j = 0; j < jbu[i].length; j++) {
                if (jbu[i][j].equals(jb)) {// 找到对于的按钮
                    x = i;
                    y = j;
                }
            }
        if (number[x][y] == 1) {
            for (int i = 0; i < number.length; i++)
                for (int j = 0; j < number[i].length; j++) {
                    if (number[i][j] == 1) {
                        x = i;
                        y = j;
                        jbu[x][y].setText("雷");
                        jbu[x][y].setBackground(Color.red);// 有雷就将该按钮设置为红色
                    }
                }
        } else {
            if (numberL[x][y] == 0) {//如果该坐标的雷数量为0,则将周围的8个按钮一起显示
                space(x, y);            
            }
            jbu[x][y].setText("" + numberL[x][y]);// 设置按钮的文本为周围雷的数量
            jbu[x][y].setBackground(Color.blue);// 无雷就将按钮设置为蓝色
        }
    }

    //设置显示对应的x,y坐标周围的8个按钮
    public void space(int x, int y) {
        for (int i = 0; i < xy.length; i++) {
            int[] tempXY = xy[i];
            int TX = x + tempXY[0];// 每次循环的X坐标
            int TY = y + tempXY[1];// 每次循环的Y坐标
            if (TX >= 0 && TY >= 0 && TX <= 14 && TY <= 19) {
                /*if (numberL[TX][TY] == 0) {
                    space(TX, TY);此处想用递归去处理8个坐标中是否有雷数为0的
                }*/
                jbu[TX][TY].setText("" + numberL[TX][TY]);// 设置按钮的文本为周围雷的数量
                jbu[TX][TY].setBackground(Color.blue);// 无雷就将按钮设置为蓝色
            }
        }
    }

    public static void main(String args[]) {
        new ShaoLei();
        System.out.println("-------------有雷的坐标为1-------------------");
        for (int i = 0; i < 15; i++) {
            for (int j = 0; j < 20; j++) {
                System.out.print(number[i][j] + " ");
            }
            System.out.println();
        }
        System.out.println("----------对应坐标周围雷的数量-------------------");

        for (int i = 0; i < 15; i++) {
            for (int j = 0; j < 20; j++) {
                System.out.print(numberL[i][j] + " ");
            }
            System.out.println();
        }
    }

}