import java.util.*;importjava.util.regex.Matcher;importjava.util.regex.Pattern;importjavax.swing.ImageIcon;importjavax.swing.JButton;importjavax.swing.JOptionPane;importjavax.swing.JPanel;importjavax.swing.border.LineBorder;import java.math.*;import java.awt.*;import java.awt.event.*;public classMinesweeper {public static voidmain(String arg[]) {newwin_Start().frameLaunch();
}
}classwin_Start {
Frame installWin= null;
TextField tf_lage= null;
TextField tf_number= null;public voidframeLaunch() {
installWin= newFrame();
installWin.setBounds(300, 300, 300, 500);
installWin.setTitle("设置");
installWin.setVisible(true);
installWin.setLayout(null);
installWin.setBackground(new Color(235, 235, 235));
installWin.addWindowListener(newWindowAdapter() {public voidwindowClosing(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(newsureLaunch());
l1.setBackground(new Color(245, 245, 245));
l2.setBackground(new Color(245, 245, 245));
tf_lage= newTextField();
tf_number= newTextField();
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 implementsActionListener {public voidactionPerformed(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);newmainFrame(lage, number).mainFrameLaunch();
}elseJOptionPane.showMessageDialog(null, "错误! 输入范围应大于等于8!", "出现错误!", JOptionPane.ERROR_MESSAGE);
}elseJOptionPane.showMessageDialog(null, "错误! 输入范围有误!", "出现错误!", JOptionPane.ERROR_MESSAGE);
}
}classmainFrame {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= newtimeStart();
mainFrame(int lage, intnumber) {this.lage =lage;this.number =number;
Mine= newJButton[lage][lage];
}public voidmainFrameLaunch() {
Frame mainFrame= newFrame();
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= newPanel();
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(newActionListener() {public voidactionPerformed(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(newtimeStart()).start();
}
}
}
});
p_main= newPanel();
p_main.setBackground(new Color(245, 245, 245));
p_main.setBounds(75, 150, 35 * lage, 35 *lage);
p_main.setLayout(null);
Panel p_background= newPanel();
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= newTextField();
tf_time.setEditable(false);
tf_time.setFont(new Font("宋体", Font.BOLD, 40));
tf_time.setBackground(Color.WHITE);
tf_time.setBounds(90, 0, 110, 50);newThread(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(newWindowAdapter() {public voidwindowClosing(WindowEvent e) {
mainFrame.setVisible(false);
System.exit(0);
}
});
}public voidaddMineButton() {for (int a = 0; a < lage; a++) {for (int b = 0; b < lage; b++) {//可以运行
Mine[a][b] = newJButton();
Mine[a][b].setName("0_" + a + "" + b + "");
Mine[a][b].setBackground(new Color(176, 196, 222));
Mine[a][b].setBorder(new LineBorder(new Color(112, 128, 144)));
Mine[a][b].addMouseListener(newmouseTry());
Mine[a][b].setBounds(a* 35, b * 35, 35, 35);
p_main.add(Mine[a][b]);//可以add
}
}
addMine();
}public voidaddMine() {//埋雷方法
Random r = newRandom();int i = 0;while (i
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 voidshowMine() {
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 implementsMouseListener {
JButton jb= null;
ImageIcon flag= new ImageIcon("image/flag.jpg");
ImageIcon bloom= new ImageIcon("image/blood.gif");public voidmouseClicked(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 = "(.*)";
Pattern patternX=Pattern.compile(regexX);
Matcher matcherX= patternX.matcher(mineName);//匹配类
while(matcherX.find()) {
jbX= Integer.parseInt(matcherX.group(1));
}
String regexY= "(.*)";
Pattern patternY=Pattern.compile(regexY);
Matcher matcherY= patternY.matcher(mineName);//匹配类
while(matcherY.find()) {
jbY= Integer.parseInt(matcherY.group(1));//打印中间字符
}//检查四周是否有雷.
{
cheakMine(jbX, jbY);
cheakWin();
}
}
}
}
}
}public voidcheakWin() {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, intjbY) {
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
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 voidmousePressed(MouseEvent e) {
}public voidmouseReleased(MouseEvent e) {
}public voidmouseEntered(MouseEvent e) {
}public voidmouseExited(MouseEvent e) {
}
}class timeStart extendsThread {public voidrun() {int time = 0;while(timeStop) {
tf_time.setText("" + time + "秒");//可以输出.可以暂停.
try{
sleep(1000);
}catch(InterruptedException ae) {
System.out.println("sleep Error");
}
time= time + 1;
}
}
}
}
}