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