简单JavaSE游戏----扫雷

  1 package chinasoft.game.fengke;
  2 
  3 import java.awt.BorderLayout;
  4 import java.awt.Color;
  5 import java.awt.Container;
  6 import java.awt.Font;
  7 import java.awt.GridLayout;
  8 import java.awt.Insets;
  9 import java.awt.event.ActionEvent;
 10 import java.awt.event.ActionListener;
 11 import java.awt.event.MouseAdapter;
 12 import java.awt.event.MouseEvent;
 13 import javax.swing.JButton;
 14 import javax.swing.JFrame;
 15 import javax.swing.JLabel;
 16 import javax.swing.JMenu;
 17 import javax.swing.JMenuBar;
 18 import javax.swing.JMenuItem;
 19 import javax.swing.JPanel;
 20 import javax.swing.Timer;
 21 
 22 /**
 23  * 扫雷游戏
 24  * 
 25  * @author 锋客 功能: 时间限制;难度选择。
 26  * 
 27  */
 28 public class MineSweepGame {
 29 
 30     // 声明所需组件
 31     private JFrame frame;
 32     private Container contentPane;// 视图
 33     private JPanel menuPanel, timePanel, gamePanel;// 菜单,时间,游戏三个部分
 34     private JLabel timeLabel, resutLabel, mineCountLabel;// 时间标签,状态标签,地雷数量
 35     private JMenuItem menuItem1, menuItem2, menuItem3;// 游戏难度选择
 36 
 37     private JButton[][] buttons;
 38     private int[][] buttonsValue;
 39     private boolean[][] buttonsFlag;
 40 
 41     private int timeLength = 0;
 42     private int row, col;
 43 
 44     private int mineRealCount = 10;
 45     private boolean winGame = false;
 46     // 计时器
 47     private Timer timer;
 48     private int gameStatus = 0;
 49     private TimerActionListener temp = new TimerActionListener();
 50     // 构造方法
 51     public MineSweepGame() {
 52         row = 9;
 53         col = 9;
 54 
 55         frame = new JFrame("锋客扫雷游戏");
 56         contentPane = frame.getContentPane();
 57 
 58         menuPanel = new JPanel();
 59         timePanel = new JPanel();
 60         gamePanel = new JPanel();
 61 
 62         timeLabel = new JLabel("游戏时间:" + new Integer(timeLength).toString()
 63                 + "秒");
 64         resutLabel = new JLabel("   状态:准备游戏");
 65         mineCountLabel = new JLabel("地雷个数:" + mineRealCount);
 66 
 67         timer = new Timer(1000,temp);
 68     }
 69 
 70     public void initButtonsAllValues() {
 71         buttons = new JButton[row + 2][col + 2];
 72         buttonsValue = new int[row + 2][col + 2];
 73         buttonsFlag = new boolean[row + 2][col + 2];
 74         for (int i = 0; i < row + 2; i++) {
 75             for (int j = 0; j < col + 2; j++) {
 76                 buttons[i][j] = new JButton();
 77                 buttons[i][j].setMargin(new Insets(0, 0, 0, 0));
 78                 buttons[i][j].setFont(new Font(null, Font.BOLD, 25));
 79                 buttons[i][j].setText("");
 80                 buttonsValue[i][j] = 0;
 81 
 82             }
 83 
 84         }
 85 
 86     }
 87 
 88     // 初始化游戏界面
 89     public void initGame() {
 90         JMenuBar menuBar = new JMenuBar();
 91         JMenu menu = new JMenu("游戏设置");
 92         menuItem1 = new JMenuItem("初级");
 93         menuItem2 = new JMenuItem("中级");
 94         menuItem3 = new JMenuItem("高级");
 95 
 96         menuBar.add(menu);
 97         menu.add(menuItem1);
 98         menu.add(menuItem2);
 99         menu.add(menuItem3);
100         menuPanel.add(menuBar);
101 
102         timePanel.add(timeLabel);
103         timePanel.add(mineCountLabel);
104         timePanel.add(resutLabel);
105 
106         JPanel panel = new JPanel();
107         panel.setLayout(new BorderLayout());
108         panel.add(menuPanel, BorderLayout.NORTH);
109         panel.add(timePanel, BorderLayout.SOUTH);
110         contentPane.add(panel, BorderLayout.NORTH);
111 
112         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
113         frame.pack();
114         frame.setSize(297, 377);
115         frame.setBounds(400, 100, 400, 500);
116         frame.setVisible(true);
117         // 选择难度(匿名内部类)
118         menuItem1.addActionListener(new ActionListener() {
119 
120             @Override
121             public void actionPerformed(ActionEvent e) {
122                 if (gameStatus == 0) {
123                     timer.start();
124                 }
125                 gameStatus = 1;
126                 row = 9;
127                 col = 9;
128                 mineRealCount = 10;
129                 mineCountLabel.setText("地雷个数:" + mineRealCount);
130                 resutLabel.setText("   状态:准备游戏");
131                 // 设置埋雷区域
132                 gamePanel.removeAll();
133                 initButtonsAllValues();
134                 gamePanel.setLayout(new GridLayout(row, col, 0, 0));
135                 for (int i = 1; i <= row; i++) {
136                     for (int j = 1; j <= col; j++) {
137                         gamePanel.add(buttons[i][j]);
138                     }
139                 }
140                 contentPane.add(gamePanel, BorderLayout.CENTER);
141                 // 设置地雷
142                 timeLength = 0;
143                 setMines(mineRealCount);
144                 setButtonValue();
145                 addListener();
146 
147             }
148         });
149         menuItem2.addActionListener(new ActionListener() {
150 
151             @Override
152             public void actionPerformed(ActionEvent e) {
153                 if (gameStatus == 0) {
154                     timer.start();
155                 }
156                 gameStatus = 1;
157                 row = 9;
158                 col = 9;
159                 mineRealCount = 30;
160                 mineCountLabel.setText("地雷个数:" + mineRealCount);
161                 resutLabel.setText("   状态:准备游戏");
162                 // 设置埋雷区域
163                 gamePanel.removeAll();
164                 initButtonsAllValues();
165                 gamePanel.setLayout(new GridLayout(row, col, 0, 0));
166                 for (int i = 1; i <= row; i++) {
167                     for (int j = 1; j <= col; j++) {
168                         gamePanel.add(buttons[i][j]);
169                     }
170                 }
171                 contentPane.add(gamePanel, BorderLayout.CENTER);
172                 // 设置地雷
173                 timeLength = 0;
174                 setMines(mineRealCount);
175                 setButtonValue();
176                 addListener();
177 
178             }
179         });
180         menuItem3.addActionListener(new ActionListener() {
181 
182             @Override
183             public void actionPerformed(ActionEvent e) {
184                 if (gameStatus == 0) {
185                     timer.start();
186                 }
187                 gameStatus = 1;
188                 row = 15;
189                 col = 15;
190                 mineRealCount = 15;
191                 mineCountLabel.setText("地雷个数:" + mineRealCount);
192                 resutLabel.setText("   状态:准备游戏");
193                 // 设置埋雷区域
194                 gamePanel.removeAll();
195                 initButtonsAllValues();
196                 gamePanel.setLayout(new GridLayout(row, col, 0, 0));
197                 for (int i = 1; i <= row; i++) {
198                     for (int j = 1; j <= col; j++) {
199                         gamePanel.add(buttons[i][j]);
200                     }
201                 }
202 
203                 contentPane.add(gamePanel, BorderLayout.CENTER);
204 
205                 // 设置地雷
206                 timeLength = 0;
207                 setMines(mineRealCount);
208                 setButtonValue();
209                 addListener();
210 
211             }
212         });
213 
214     }
215 
216     // 设置地雷
217     public void setMines(int mineCount) {
218         this.mineRealCount = mineCount;
219         int[] randomValue = new int[mineCount];
220         // mineCount是地雷的个数,先获得mineCount个不重复的随机数,然后通过随机数计算出地雷的位置
221         for (int i = 0; i < mineCount; i++) {
222 
223             int temp = (int) (Math.random() * row * col);
224             for (int j = 0; j < randomValue.length; j++) {
225                 if (randomValue[j] == temp) {
226                     temp = (int) (Math.random() * row * col);
227                     j = 0;
228                 }
229 
230             }
231             randomValue[i] = temp;
232             // 把随机数转换成坐标
233             int x = randomValue[i] / col + 1;
234             int y = randomValue[i] % col + 1;
235             // 对应坐标的位置设置为地雷
236             buttonsValue[x][y] = 10;
237             // 临时显示地雷位置,作为测试使用,随机产生
238             // buttons[x][y].setText("Q");
239 
240         }
241     }
242 
243     // 对非地雷的按钮进行计算,周围没有地雷的,默认值为0,有雷的,显示地雷的个数。
244     public void setButtonValue() {
245         for (int i = 1; i <= row; i++) {
246             for (int j = 1; j <= col; j++) {
247                 if (buttonsValue[i][j] != 10) {
248                     for (int x = j - 1; x <= j + 1; x++) {
249                         if (buttonsValue[i - 1][x] == 10) {
250                             buttonsValue[i][j]++;
251                         }
252                         if (buttonsValue[i + 1][x] == 10) {
253                             buttonsValue[i][j]++;
254                         }
255 
256                     }
257                     if (buttonsValue[i][j - 1] == 10) {
258                         buttonsValue[i][j]++;
259                     }
260                     if (buttonsValue[i][j + 1] == 10) {
261                         buttonsValue[i][j]++;
262                     }
263 
264                     // 测试
265                     //buttons[i][j].setText(new Integer(buttonsValue[i][j])
266                     //        .toString());
267 
268                 }
269 
270             }
271 
272         }
273     }
274 
275     // 点击事件
276     class ButtonActionListener implements ActionListener {
277 
278         @Override
279         public void actionPerformed(ActionEvent e) {
280 
281             for (int i = 1; i <= row; i++) {
282                 for (int j = 1; j <= col; j++) {
283                     if (e.getSource() == buttons[i][j]) {
284                         if (!buttons[i][j].getText().isEmpty()
285                                 && buttonsFlag[i][j] == false) {
286                             buttons[i][j].setText("");
287                         } else {
288                             if (buttonsValue[i][j] == 0) {
289                                 markZero(i, j);
290                             } else if (buttonsValue[i][j] == 10) {
291                                 System.out.println("停止时间");
292                                 stopGame();
293                             } else {
294                                 markNumber(i, j);
295                             }
296                         }
297                     }
298 
299                 }
300 
301             }
302 
303         }
304 
305     }
306 
307     // 设置地雷属性
308     class FindMineMouseListener extends MouseAdapter {
309         public void mouseClicked(MouseEvent e) {
310             for (int i = 1; i <= row; i++) {
311                 for (int j = 1; j <= col; j++) {
312                     if (e.getSource() == buttons[i][j]
313                             && e.getButton() == MouseEvent.BUTTON3) {
314                         if (buttonsFlag[i][j] == false) {
315                             findMine(i, j);
316                         }
317 
318                     }
319 
320                 }
321 
322             }
323         }
324     }
325 
326     // 计时器
327     class TimerActionListener implements ActionListener {
328 
329         @Override
330         public void actionPerformed(ActionEvent e) {
331 
332             timeLength++;
333             timeLabel.setText("游戏时间:" + new Integer(timeLength).toString()
334                     + "秒");
335 
336             // if (timeLength>=20) {
337             // for (int i = 1; i <= row; i++) {
338             // for (int j = 1; j <=col; j++) {
339             // if (buttonsFlag[i][j]==false) {
340             // if (buttonsValue[i][j]==0) {
341             // buttons[i][j].setText("");
342             // }else if(buttonsValue[i][j]==10){
343             // buttons[i][j].setText("Q");
344             // }else{
345             // buttons[i][j].setText(new
346             // Integer(buttonsValue[i][j]).toString());
347             // }
348             // }
349             // buttons[i][j].setEnabled(false);
350             // timer.stop();
351             // gameStatus=0;
352             // if (winGame) {
353             // resutLabel.setText("恭喜你,你赢了!");
354             //
355             // }else{
356             // resutLabel.setText("很可惜,时间到!");
357             //
358             // }
359             // }
360             //
361             // }
362             // }
363         }
364 
365     }
366     //添加监听器
367     public void addListener() {
368         for (int i = 1; i <= row; i++) {
369             for (int j = 1; j <= col; j++) {
370                 buttons[i][j].addActionListener(new ButtonActionListener());
371                 buttons[i][j].addMouseListener(new FindMineMouseListener());
372 
373             }
374 
375         }
376     }
377     
378     public void markNumber(int i, int j) {
379         buttons[i][j].setText(new Integer(buttonsValue[i][j]).toString());
380         buttons[i][j].setEnabled(false);
381         buttonsFlag[i][j] = true;
382     }
383     //标记地雷
384     public void markMine(int i, int j) {
385         buttons[i][j].setForeground(Color.red);
386         buttons[i][j].setText("Q");
387         buttons[i][j].setEnabled(false);
388         buttonsFlag[i][j] = true;
389 
390     }
391     //标记空白区域
392     public void markZero(int i, int j) {
393         // 注意问题:当选择的是地雷时,不进行任何操作
394         if (buttonsValue[i][j] == 10) {
395             return;
396         } else {
397             buttons[i][j].setEnabled(false);
398             if (buttonsFlag[i][j] == true) {
399                 return;
400             } else {
401                 buttonsFlag[i][j] = true;
402                 if (buttonsValue[i][j] != 10 && buttonsValue[i][j] != 0) {
403                     markNumber(i, j);
404                 }
405                 if (buttonsValue[i][j] == 0) {
406                     buttons[i][j].setText("");
407                     for (int s = i - 1; s >= 0 && s <= row && s <= i + 1; s++)
408                         // 注意括号的问题
409                         for (int t = j - 1; t >= 0 && t <= col && t <= j + 1; t++) {
410                             markZero(s, t);
411                         }
412                 }
413 
414             }
415         }
416 
417     }
418 
419     // 发现地雷处理
420     public void findMine(int i, int j) {
421         if(buttons[i][j].getText()=="Q"){
422             buttons[i][j].setForeground(Color.yellow);
423             buttons[i][j].setText("?");
424         
425     }else{
426         buttons[i][j].setForeground(Color.red);
427         buttons[i][j].setText("Q");
428         if (buttonsValue[i][j] == 10) {
429             mineRealCount--;
430         }
431         isWinner();
432     }
433 }
434     
435 
436     // 判断游戏是否结束
437     public void stopGame() {
438         for (int i = 1; i <= row; i++) {
439             for (int j = 1; j <= col; j++) {
440 
441                 if (buttonsFlag[i][j] == false) {
442                     if (buttonsValue[i][j] == 0) {
443                         buttons[i][j].setText("");
444                     } else if (buttonsValue[i][j] == 10) {
445                         buttons[i][j].setText("Q");
446                     } else {
447                         buttons[i][j].setText(new Integer(buttonsValue[i][j])
448                                 .toString());
449                     }
450                 }
451 
452                 buttons[i][j].setEnabled(false);
453 
454             }
455 
456         }
457         gameStatus = 0;
458         timer.stop();
459         if (winGame) {
460             resutLabel.setText("恭喜你,你赢了!");
461 
462         } else {
463             resutLabel.setText("你踩到地雷了,很可惜!");
464         }
465     }
466 
467     // 判断是否游戏胜利
468     public void isWinner() {
469         if (mineRealCount == 0) {
470             winGame = true;
471             stopGame();
472         }
473     }
474 
475 }
 1 package chinasoft.game.fengke;
 2 /**
 3  * 测试
 4  * @author 锋客
 5  *
 6  */
 7 public class GammeRunner {
 8     public static void main(String[] args) {
 9         MineSweepGame game=new MineSweepGame();
10         game.initGame();
11     }
12 
13 }

 

package chinasoft.game.fengke;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.Timer;

/**
 * 扫雷游戏
 *
 * @author 锋客 功能: 时间限制;难度选择。
 *
 */
public class MineSweepGame {

 // 声明所需组件
 private JFrame frame;
 private Container contentPane;// 视图
 private JPanel menuPanel, timePanel, gamePanel;// 菜单,时间,游戏三个部分
 private JLabel timeLabel, resutLabel, mineCountLabel;// 时间标签,状态标签,地雷数量
 private JMenuItem menuItem1, menuItem2, menuItem3;// 游戏难度选择

 private JButton[][] buttons;
 private int[][] buttonsValue;
 private boolean[][] buttonsFlag;

 private int timeLength = 0;
 private int row, col;

 private int mineRealCount = 10;
 private boolean winGame = false;
 // 计时器
 private Timer timer;
 private int gameStatus = 0;
 private TimerActionListener temp = new TimerActionListener();
 // 构造方法
 public MineSweepGame() {
  row = 9;
  col = 9;

  frame = new JFrame("锋客扫雷游戏");
  contentPane = frame.getContentPane();

  menuPanel = new JPanel();
  timePanel = new JPanel();
  gamePanel = new JPanel();

  timeLabel = new JLabel("游戏时间:" + new Integer(timeLength).toString()
    + "秒");
  resutLabel = new JLabel("   状态:准备游戏");
  mineCountLabel = new JLabel("地雷个数:" + mineRealCount);

  timer = new Timer(1000,temp);
 }

 public void initButtonsAllValues() {
  buttons = new JButton[row + 2][col + 2];
  buttonsValue = new int[row + 2][col + 2];
  buttonsFlag = new boolean[row + 2][col + 2];
  for (int i = 0; i < row + 2; i++) {
   for (int j = 0; j < col + 2; j++) {
    buttons[i][j] = new JButton();
    buttons[i][j].setMargin(new Insets(0, 0, 0, 0));
    buttons[i][j].setFont(new Font(null, Font.BOLD, 25));
    buttons[i][j].setText("");
    buttonsValue[i][j] = 0;

   }

  }

 }

 // 初始化游戏界面
 public void initGame() {
  JMenuBar menuBar = new JMenuBar();
  JMenu menu = new JMenu("游戏设置");
  menuItem1 = new JMenuItem("初级");
  menuItem2 = new JMenuItem("中级");
  menuItem3 = new JMenuItem("高级");

  menuBar.add(menu);
  menu.add(menuItem1);
  menu.add(menuItem2);
  menu.add(menuItem3);
  menuPanel.add(menuBar);

  timePanel.add(timeLabel);
  timePanel.add(mineCountLabel);
  timePanel.add(resutLabel);

  JPanel panel = new JPanel();
  panel.setLayout(new BorderLayout());
  panel.add(menuPanel, BorderLayout.NORTH);
  panel.add(timePanel, BorderLayout.SOUTH);
  contentPane.add(panel, BorderLayout.NORTH);

  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  frame.pack();
  frame.setSize(297, 377);
  frame.setBounds(400, 100, 400, 500);
  frame.setVisible(true);
  // 选择难度(匿名内部类)
  menuItem1.addActionListener(new ActionListener() {

   @Override
   public void actionPerformed(ActionEvent e) {
    if (gameStatus == 0) {
     timer.start();
    }
    gameStatus = 1;
    row = 9;
    col = 9;
    mineRealCount = 10;
    mineCountLabel.setText("地雷个数:" + mineRealCount);
    resutLabel.setText("   状态:准备游戏");
    // 设置埋雷区域
    gamePanel.removeAll();
    initButtonsAllValues();
    gamePanel.setLayout(new GridLayout(row, col, 0, 0));
    for (int i = 1; i <= row; i++) {
     for (int j = 1; j <= col; j++) {
      gamePanel.add(buttons[i][j]);
     }
    }
    contentPane.add(gamePanel, BorderLayout.CENTER);
    // 设置地雷
    timeLength = 0;
    setMines(mineRealCount);
    setButtonValue();
    addListener();

   }
  });
  menuItem2.addActionListener(new ActionListener() {

   @Override
   public void actionPerformed(ActionEvent e) {
    if (gameStatus == 0) {
     timer.start();
    }
    gameStatus = 1;
    row = 9;
    col = 9;
    mineRealCount = 30;
    mineCountLabel.setText("地雷个数:" + mineRealCount);
    resutLabel.setText("   状态:准备游戏");
    // 设置埋雷区域
    gamePanel.removeAll();
    initButtonsAllValues();
    gamePanel.setLayout(new GridLayout(row, col, 0, 0));
    for (int i = 1; i <= row; i++) {
     for (int j = 1; j <= col; j++) {
      gamePanel.add(buttons[i][j]);
     }
    }
    contentPane.add(gamePanel, BorderLayout.CENTER);
    // 设置地雷
    timeLength = 0;
    setMines(mineRealCount);
    setButtonValue();
    addListener();

   }
  });
  menuItem3.addActionListener(new ActionListener() {

   @Override
   public void actionPerformed(ActionEvent e) {
    if (gameStatus == 0) {
     timer.start();
    }
    gameStatus = 1;
    row = 15;
    col = 15;
    mineRealCount = 15;
    mineCountLabel.setText("地雷个数:" + mineRealCount);
    resutLabel.setText("   状态:准备游戏");
    // 设置埋雷区域
    gamePanel.removeAll();
    initButtonsAllValues();
    gamePanel.setLayout(new GridLayout(row, col, 0, 0));
    for (int i = 1; i <= row; i++) {
     for (int j = 1; j <= col; j++) {
      gamePanel.add(buttons[i][j]);
     }
    }

    contentPane.add(gamePanel, BorderLayout.CENTER);

    // 设置地雷
    timeLength = 0;
    setMines(mineRealCount);
    setButtonValue();
    addListener();

   }
  });

 }

 // 设置地雷
 public void setMines(int mineCount) {
  this.mineRealCount = mineCount;
  int[] randomValue = new int[mineCount];
  // mineCount是地雷的个数,先获得mineCount个不重复的随机数,然后通过随机数计算出地雷的位置
  for (int i = 0; i < mineCount; i++) {

   int temp = (int) (Math.random() * row * col);
   for (int j = 0; j < randomValue.length; j++) {
    if (randomValue[j] == temp) {
     temp = (int) (Math.random() * row * col);
     j = 0;
    }

   }
   randomValue[i] = temp;
   // 把随机数转换成坐标
   int x = randomValue[i] / col + 1;
   int y = randomValue[i] % col + 1;
   // 对应坐标的位置设置为地雷
   buttonsValue[x][y] = 10;
   // 临时显示地雷位置,作为测试使用,随机产生
   // buttons[x][y].setText("Q");

  }
 }

 // 对非地雷的按钮进行计算,周围没有地雷的,默认值为0,有雷的,显示地雷的个数。
 public void setButtonValue() {
  for (int i = 1; i <= row; i++) {
   for (int j = 1; j <= col; j++) {
    if (buttonsValue[i][j] != 10) {
     for (int x = j - 1; x <= j + 1; x++) {
      if (buttonsValue[i - 1][x] == 10) {
       buttonsValue[i][j]++;
      }
      if (buttonsValue[i + 1][x] == 10) {
       buttonsValue[i][j]++;
      }

     }
     if (buttonsValue[i][j - 1] == 10) {
      buttonsValue[i][j]++;
     }
     if (buttonsValue[i][j + 1] == 10) {
      buttonsValue[i][j]++;
     }

     // 测试
     //buttons[i][j].setText(new Integer(buttonsValue[i][j])
     //  .toString());

    }

   }

  }
 }

 // 点击事件
 class ButtonActionListener implements ActionListener {

  @Override
  public void actionPerformed(ActionEvent e) {

   for (int i = 1; i <= row; i++) {
    for (int j = 1; j <= col; j++) {
     if (e.getSource() == buttons[i][j]) {
      if (!buttons[i][j].getText().isEmpty()
        && buttonsFlag[i][j] == false) {
       buttons[i][j].setText("");
      } else {
       if (buttonsValue[i][j] == 0) {
        markZero(i, j);
       } else if (buttonsValue[i][j] == 10) {
        System.out.println("停止时间");
        stopGame();
       } else {
        markNumber(i, j);
       }
      }
     }

    }

   }

  }

 }

 // 设置地雷属性
 class FindMineMouseListener extends MouseAdapter {
  public void mouseClicked(MouseEvent e) {
   for (int i = 1; i <= row; i++) {
    for (int j = 1; j <= col; j++) {
     if (e.getSource() == buttons[i][j]
       && e.getButton() == MouseEvent.BUTTON3) {
      if (buttonsFlag[i][j] == false) {
       findMine(i, j);
      }

     }

    }

   }
  }
 }

 // 计时器
 class TimerActionListener implements ActionListener {

  @Override
  public void actionPerformed(ActionEvent e) {

   timeLength++;
   timeLabel.setText("游戏时间:" + new Integer(timeLength).toString()
     + "秒");

   // if (timeLength>=20) {
   // for (int i = 1; i <= row; i++) {
   // for (int j = 1; j <=col; j++) {
   // if (buttonsFlag[i][j]==false) {
   // if (buttonsValue[i][j]==0) {
   // buttons[i][j].setText("");
   // }else if(buttonsValue[i][j]==10){
   // buttons[i][j].setText("Q");
   // }else{
   // buttons[i][j].setText(new
   // Integer(buttonsValue[i][j]).toString());
   // }
   // }
   // buttons[i][j].setEnabled(false);
   // timer.stop();
   // gameStatus=0;
   // if (winGame) {
   // resutLabel.setText("恭喜你,你赢了!");
   //
   // }else{
   // resutLabel.setText("很可惜,时间到!");
   //
   // }
   // }
   //
   // }
   // }
  }

 }
    //添加监听器
 public void addListener() {
  for (int i = 1; i <= row; i++) {
   for (int j = 1; j <= col; j++) {
    buttons[i][j].addActionListener(new ButtonActionListener());
    buttons[i][j].addMouseListener(new FindMineMouseListener());

   }

  }
 }
   
 public void markNumber(int i, int j) {
  buttons[i][j].setText(new Integer(buttonsValue[i][j]).toString());
  buttons[i][j].setEnabled(false);
  buttonsFlag[i][j] = true;
 }
    //标记地雷
 public void markMine(int i, int j) {
  buttons[i][j].setForeground(Color.red);
  buttons[i][j].setText("Q");
  buttons[i][j].setEnabled(false);
  buttonsFlag[i][j] = true;

 }
    //标记空白区域
 public void markZero(int i, int j) {
  // 注意问题:当选择的是地雷时,不进行任何操作
  if (buttonsValue[i][j] == 10) {
   return;
  } else {
   buttons[i][j].setEnabled(false);
   if (buttonsFlag[i][j] == true) {
    return;
   } else {
    buttonsFlag[i][j] = true;
    if (buttonsValue[i][j] != 10 && buttonsValue[i][j] != 0) {
     markNumber(i, j);
    }
    if (buttonsValue[i][j] == 0) {
     buttons[i][j].setText("");
     for (int s = i - 1; s >= 0 && s <= row && s <= i + 1; s++)
      // 注意括号的问题
      for (int t = j - 1; t >= 0 && t <= col && t <= j + 1; t++) {
       markZero(s, t);
      }
    }

   }
  }

 }

 // 发现地雷处理
 public void findMine(int i, int j) {
  if(buttons[i][j].getText()=="Q"){
   buttons[i][j].setForeground(Color.yellow);
   buttons[i][j].setText("?");
  
 }else{
  buttons[i][j].setForeground(Color.red);
  buttons[i][j].setText("Q");
  if (buttonsValue[i][j] == 10) {
   mineRealCount--;
  }
  isWinner();
 }
}
 

 // 判断游戏是否结束
 public void stopGame() {
  for (int i = 1; i <= row; i++) {
   for (int j = 1; j <= col; j++) {

    if (buttonsFlag[i][j] == false) {
     if (buttonsValue[i][j] == 0) {
      buttons[i][j].setText("");
     } else if (buttonsValue[i][j] == 10) {
      buttons[i][j].setText("Q");
     } else {
      buttons[i][j].setText(new Integer(buttonsValue[i][j])
        .toString());
     }
    }

    buttons[i][j].setEnabled(false);

   }

  }
  gameStatus = 0;
  timer.stop();
  if (winGame) {
   resutLabel.setText("恭喜你,你赢了!");

  } else {
   resutLabel.setText("你踩到地雷了,很可惜!");
  }
 }

 // 判断是否游戏胜利
 public void isWinner() {
  if (mineRealCount == 0) {
   winGame = true;
   stopGame();
  }
 }

}

posted on 2015-09-11 10:41  锋客person  阅读(963)  评论(0编辑  收藏  举报