java扫雷源码

import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.border.LineBorder;

import java.math.*;
import java.awt.*;
import java.awt.event.*;

public class Minesweeper {
    public static void main(String arg[]) {
        new win_Start().frameLaunch();
    }
}

class win_Start {
    Frame installWin = null;
    TextField tf_lage = null;
    TextField tf_number = null;

    public void frameLaunch() {
        installWin = new Frame();
        installWin.setBounds(300, 300, 300, 500);
        installWin.setTitle("设置");
        installWin.setVisible(true);
        installWin.setLayout(null);
        installWin.setBackground(new Color(235, 235, 235));
        installWin.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                installWin.setVisible(false);
                System.exit(0);
            }
        });
        Label l1 = new Label("  输入棋盘大小(8-16):");
        l1.setFont(new Font("宋体", Font.BOLD, 18));
        Label l2 = new Label("  输入地雷数(大于等于8):");
        l2.setFont(new Font("宋体", Font.BOLD, 16));
        Button sure = new Button("启动");
        l1.setBounds(50, 50, 200, 50);
        l2.setBounds(50, 200, 200, 50);
        sure.setBounds(50, 350, 200, 100);
        sure.addActionListener(new sureLaunch());
        l1.setBackground(new Color(245, 245, 245));
        l2.setBackground(new Color(245, 245, 245));
        tf_lage = new TextField();
        tf_number = new TextField();
        tf_lage.setBounds(100, 100, 100, 50);
        tf_number.setBounds(100, 250, 100, 50);
        tf_lage.setFont(new Font("宋体", Font.BOLD, 38));
        tf_number.setFont(new Font("宋体", Font.BOLD, 38));
        installWin.add(l1);
        installWin.add(l2);
        installWin.add(tf_lage);
        installWin.add(tf_number);
        installWin.add(sure);
    }

    class sureLaunch implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            int number = 0;
            int lage = 0;
            try {
                lage = Integer.parseInt(tf_lage.getText());
                number = Integer.parseInt(tf_number.getText());
            } catch (Exception ae) {
                JOptionPane.showMessageDialog(null, "错误!  请输入数字!", "出现错误!", JOptionPane.ERROR_MESSAGE);
                return;
            }
            if (lage > 7 && lage < 17 && number <= lage * lage) {
                if (number >= 8) {
                    // 启动下一步Frame.
                    installWin.setVisible(false);
                    new mainFrame(lage, number).mainFrameLaunch();
                } else
                    JOptionPane.showMessageDialog(null, "错误!  输入范围应大于等于8!", "出现错误!", JOptionPane.ERROR_MESSAGE);
            } else
                JOptionPane.showMessageDialog(null, "错误!  输入范围有误!", "出现错误!", JOptionPane.ERROR_MESSAGE);
        }
    }

    class mainFrame {
        boolean timeStop = true;
        private int lage = 0;
        private int number = 0;
        private int[][] around = { { -1, 0 }, { -1, 1 }, { 0, 1 }, { 1, 1 }, { 1, 0 }, { 1, -1 }, { 0, -1 },
                { -1, -1 } };
        JPanel p_mine = null;
        Panel p_main = null;
        TextField tf_time = null;
        JButton[][] Mine = null;
        timeStart timeStartLaunch = new timeStart();

        mainFrame(int lage, int number) {
            this.lage = lage;
            this.number = number;
            Mine = new JButton[lage][lage];
        }

        public void mainFrameLaunch() {
            Frame mainFrame = new Frame();
            mainFrame.setBackground(new Color(230, 230, 250));
            mainFrame.setTitle("扫雷");
            mainFrame.setBounds(200, 200, 150 + (35 * lage), 350 + (35 * lage));
            mainFrame.setVisible(true);
            mainFrame.setLayout(null);
            Panel p_time = new Panel();
            p_time.setLayout(null);
            p_time.setBounds((150 + (35 * lage)) / 2 - 100, 50, 200, 50);
            p_time.setBackground(new Color(245, 245, 245));
            Button b_reStart = new Button("重新开始");
            b_reStart.setFont(new Font("宋体", Font.BOLD, 36));
            b_reStart.setBounds((150 + (35 * lage)) / 2 - 100, 200 + (35 * lage), 200, 100);
            b_reStart.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    for (int a = 0; a < lage; a++) {
                        for (int b = 0; b < lage; b++) {
                            Mine[a][b].setIcon(null);
                            Mine[a][b].setText("");
                            String thisName = Mine[a][b].getName();
                            thisName = thisName.replace("@", "");
                            Mine[a][b].setName(thisName);
                            Mine[a][b].setBackground(new Color(176, 196, 222));
                            timeStop = true;
                            new Thread(new timeStart()).start();
                        }
                    }
                }
            });
            p_main = new Panel();
            p_main.setBackground(new Color(245, 245, 245));
            p_main.setBounds(75, 150, 35 * lage, 35 * lage);
            p_main.setLayout(null);
            Panel p_background = new Panel();
            p_background.setBounds(73, 147, (35 * lage) + 4, (35 * lage) + 4);
            p_background.setBackground(new Color(176, 196, 222));

            // 计算时间.
            {
                Label l_time = new Label(" 时间:");
                l_time.setBounds(0, 0, 80, 50);
                l_time.setFont(new Font("宋体", Font.BOLD, 28));
                tf_time = new TextField();
                tf_time.setEditable(false);
                tf_time.setFont(new Font("宋体", Font.BOLD, 40));
                tf_time.setBackground(Color.WHITE);
                tf_time.setBounds(90, 0, 110, 50);
                new Thread(timeStartLaunch).start();
                p_time.add(l_time);
                p_time.add(tf_time);
            }
            mainFrame.add(p_time);
            mainFrame.add(b_reStart);
            mainFrame.add(p_main);
            mainFrame.add(p_background);
            addMineButton();
            // 可以addMineButton.
            mainFrame.addWindowListener(new WindowAdapter() {
                public void windowClosing(WindowEvent e) {
                    mainFrame.setVisible(false);
                    System.exit(0);
                }
            });
        }

        public void addMineButton() {
            for (int a = 0; a < lage; a++) {
                for (int b = 0; b < lage; b++) {
                    // 可以运行
                    Mine[a][b] = new JButton();
                    Mine[a][b].setName("0_<x>" + a + "</x><y>" + b + "</y>");
                    Mine[a][b].setBackground(new Color(176, 196, 222));
                    Mine[a][b].setBorder(new LineBorder(new Color(112, 128, 144)));
                    Mine[a][b].addMouseListener(new mouseTry());
                    Mine[a][b].setBounds(a * 35, b * 35, 35, 35);
                    p_main.add(Mine[a][b]);
                    // 可以add
                }
            }
            addMine();
        }

        public void addMine() {
            // 埋雷方法
            Random r = new Random();
            int i = 0;
            while (i < number) {
                int x = r.nextInt(lage);
                int y = r.nextInt(lage);
                String nameList = Mine[x][y].getName();
                char[] nameCharList = nameList.toCharArray();

                if (nameCharList[0] == 48) {
                    nameList = nameList.replaceFirst("0", "1");
                    Mine[x][y].setName(nameList);
                } else
                    continue;
                // 可以随机
                i++;
                // 0为有累 1没雷
            }
        }

        public void showMine() {
            ImageIcon mine = new ImageIcon("image/mine.gif");
            timeStop = false;
            for (int a = 0; a < lage; a++) {
                for (int b = 0; b < lage; b++) {
                    String name = Mine[a][b].getName();
                    char[] nameList = name.toCharArray();
                    int isHave = (int) nameList[0];
                    if (isHave == 49) {
                        Mine[a][b].setIcon(mine);
                    }
                }
            }
        }

        class mouseTry implements MouseListener {
            JButton jb = null;
            ImageIcon flag = new ImageIcon("image/flag.jpg");
            ImageIcon bloom = new ImageIcon("image/blood.gif");

            public void mouseClicked(MouseEvent e) {
                jb = (JButton) e.getSource();
                if (e.getButton() == 3) {
                    if (jb.getName().contains("@") == false) {
                        if (jb.getName().contains("^")) {
                            jb.setIcon(null);
                            String afterName = jb.getName();
                            afterName = afterName.replace("^", "");
                            jb.setName(afterName);
                        } else {
                            String jbName = jb.getName();
                            jbName = jbName + "^";
                            jb.setName(jbName);
                            jb.setIcon(flag);
                        }
                    }
                } else if (e.getButton() == 1) {
                    String name = jb.getName();
                    String mineHave = name.substring(0, 1);
                    // System.out.print(name);
                    // System.out.println(mineHave);
                    int have = Integer.parseInt(mineHave);
                    if (name.contentEquals("^") == false) {
                        if (have == 1) {
                            jb.setBackground(Color.RED);
                            jb.setIcon(bloom);
                            showMine();
                            JOptionPane.showMessageDialog(null, "失败!", "提示", JOptionPane.ERROR_MESSAGE);
                        } else if (have == 0) {
                            // 检查四周有没有雷
                            {
                                String mineName = jb.getName();
                                mineName = mineName.substring(1, mineName.length());
                                mineName = mineName.replace("_", "");
                                int jbY = 0, jbX = 0;
                                // 截取字符设定坐标.
                                String regexX = "<x>(.*)</x>";
                                Pattern patternX = Pattern.compile(regexX);
                                Matcher matcherX = patternX.matcher(mineName);// 匹配类
                                while (matcherX.find()) {
                                    jbX = Integer.parseInt(matcherX.group(1));
                                }
                                String regexY = "<y>(.*)</y>";
                                Pattern patternY = Pattern.compile(regexY);
                                Matcher matcherY = patternY.matcher(mineName);// 匹配类
                                while (matcherY.find()) {
                                    jbY = Integer.parseInt(matcherY.group(1));// 打印中间字符
                                }
                                // 检查四周是否有雷.
                                {
                                    cheakMine(jbX, jbY);
                                    cheakWin();
                                }
                            }
                        }
                    }
                }
            }

            public void cheakWin() {
                int cheakNumber = 0;
                for (int a = 0; a < lage; a++) {
                    for (int b = 0; b < lage; b++) {
                        String mineName = Mine[a][b].getName();
                        if (mineName.contains("@")) {
                            cheakNumber++;
                        }
                        if (cheakNumber == lage * lage - number) {
                            String timeWin = tf_time.getText();
                            tf_time.setText(timeWin);
                            timeStop = false;
                            JOptionPane.showMessageDialog(null, "成功!  用时:" + timeWin, "提示", JOptionPane.ERROR_MESSAGE);
                        }
                    }
                }
            }

            public void cheakMine(int jbX, int jbY) {
                Mine[jbX][jbY].setName(Mine[jbX][jbY].getName() + "@");
                int MineNumber = 0;
                for (int i = 0; i < 8; i++) {
                    int jb_X = jbX + around[i][0];
                    int jb_Y = jbY + around[i][1];
                    if (jb_X >= 0 && jb_X < lage && jb_Y >= 0 && jb_Y < lage) {
                        // System.out.println(jb_X + " " + jb_Y);
                        try {
                            String jbName1 = Mine[jb_X][jb_Y].getName();
                            // System.out.println(jbName1);
                            String jbMine = jbName1.substring(0, 1);
                            int Mine1 = Integer.parseInt(jbMine);
                            if (Mine1 == 1) {
                                MineNumber++;
                            }
                        } catch (Exception ae1) {
                            // DoNothing
                        }
                    }
                }
                if (MineNumber != 0) {
                    Mine[jbX][jbY].setFont(new Font("宋体", Font.BOLD, 32));
                    Mine[jbX][jbY].setBackground(Color.WHITE);
                    Mine[jbX][jbY].setText("" + MineNumber);
                } else if (MineNumber == 0) {
                    Mine[jbX][jbY].setBackground(Color.WHITE);
                    for (int i = 0; i < 8; i++) {
                        int jb_X = jbX + around[i][0];
                        int jb_Y = jbY + around[i][1];
                        try {
                            boolean flag = Mine[jb_X][jb_Y].getName().contains("@");
                            if (jb_X >= 0 && jb_X < lage && jb_Y >= 0 && jb_Y < lage && flag == false) {
                                cheakMine(jb_X, jb_Y);
                            }
                        } catch (ArrayIndexOutOfBoundsException ae) {
                            ;
                        }

                    }
                }
            }

            public void mousePressed(MouseEvent e) {
            }

            public void mouseReleased(MouseEvent e) {
            }

            public void mouseEntered(MouseEvent e) {
            }

            public void mouseExited(MouseEvent e) {
            }
        }

        class timeStart extends Thread {
            public void run() {
                int time = 0;
                while (timeStop) {
                    tf_time.setText("" + time + "秒");
                    // 可以输出.可以暂停.
                    try {
                        sleep(1000);
                    } catch (InterruptedException ae) {
                        System.out.println("sleep Error");
                    }
                    time = time + 1;
                }
            }
        }
    }
}