扫雷游戏制作学习过程

时间:2022-05-05
本文章向大家介绍扫雷游戏制作学习过程,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

1. 扫雷游戏的构思:   设计为初级,中级,高级三个级别。

     因此不妨设置为如下规格: 9x9 16x15和30x16 (行,列)规格不同地雷的数量也不同,分别为 10,40 ,99

2.在这个过程遇到了按钮大小调整调用这些函数:

1 btn.setBounds(x,y,width,height);//设置大小并定位
2 或者
3 btn.setSize(width,height);//设置大小
4 btn.setLocation(x,y);//定位
5 
6 父容器的layout要设置为null】

/*1。按钮之间的设置问题,如何解决?
  调用函数:   
   
    public void setMargin(Insets m)设置按钮边框和标签之间的空白。将该空白设置为 null 会造成按钮使用默认空白。按钮的默认 Border 对象将使用该值来创建适当的空白。不过,如果在按钮上设置非默认边框,则由 Border 对象负责创建适当的空白(否则此属性将被忽略)。
参数:

m - 边框和标签之间的间隔

   制作到这默认框架已经搭建好了,并附上劣质代码来加以显示:

   代码如下:

竹类:

1 package Scan_boobs;
2 
3 public class Main {
4   static public void main(String args[] )
5   {
6       new window_scan();
7   }
8 }

   框架类:

  1 /*扫雷默认为9x9的方格
  2  * */
  3 package Scan_boobs;
  4 import java.awt.*;
  5 import javax.swing.*;
  6 
  7 import java.awt.BorderLayout;
  8 import java.awt.FlowLayout ;
  9 import java.awt.Container ;
 10 import java.awt.Font;
 11 import java.awt.Insets;
 12 import java.awt.event.ActionEvent;
 13 import java.awt.event.ActionListener;
 14 
 15 import javax.swing.JPanel ;
 16 public class window_scan extends JFrame implements ActionListener 
 17 { 
 18     
 19    private static final long serialVersionUID = 1L;  
 20    private final int row =9;
 21    private final int cow =9;
 22    JFrame wind ;      
 23    JMenuBar myMenubar;         //菜单条
 24    JMenu    Menu [];           //菜单
 25    JMenuItem [] Submenu ;      //子菜单
 26    JButton  mybutton;          //开始按钮
 27    JButton [] grid_button ;    //扫雷里面的按钮
 28    Container  mycontainer;
 29     /*
 30      * 添加到容器中的组件放在一个列表中。列表的顺序
 31      * 将定义组件在容器内的正向堆栈顺序。如果将组件
 32      * 添加到容器中时未指定索引,则该索引将被添加到列表尾部
 33      * (此后它位于堆栈顺序的底部)。 
 34      * */
 35     JPanel jpanel,jpanel1,jpanel2,jpamel3;   /*JPanel 是一般轻量级容器。*/
 36    /*
 37     * 设置三个等级,初级,中级,高级 
 38     */
 39    window_scan()
 40    {     
 41           setTitle("扫雷");
 42           setVisible(true);     //设置窗口是否可见
 43           setResizable(false);   //大小不可更改
 44           setBounds(400,100,400,500);   //初始的位置(400,100),大小(400,500)
 45           setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   
 46                //初始  
 47            mycontainer=getContentPane();  //这个获取目前的 
 48            init();
 49    }
 50    void init() {
 51          
 52          Submenu  = new JMenuItem [3];
 53          Submenu[0]=new JMenuItem("初级");
 54          Submenu[1]=new JMenuItem("中级");
 55          Submenu[2]=new JMenuItem("高级");
 56          Menu = new JMenu [2];
 57          Menu[0]= new JMenu("设置");
 58          for(int i=0;i<3;i++)
 59          {
 60            Submenu[i].addActionListener(this);   //监听
 61            Menu[0].add(Submenu[i]);
 62          }
 63          mybutton=new JButton("开始");  //开始按钮
 64          mybutton.addActionListener(this); 
 65          Menu[1]= new JMenu("帮助");
 66          Menu[1].addActionListener(this);
 67          myMenubar =new JMenuBar();  
 68          //setJMenuBar(myMenubar);    //设置此窗体的菜单栏
 69            jpanel= new JPanel(); 
 70              jpanel.add(myMenubar);
 71           myMenubar.add(Menu[0]);
 72           myMenubar.add(Menu[1]);
 73           jpanel1 = new JPanel();
 74           jpanel1.setLayout(new BorderLayout());  //设置布局      
 75           jpanel1.add(jpanel,BorderLayout.NORTH);
 76           jpanel1.add(mybutton,BorderLayout.CENTER);
 77           //设置雷区域
 78           jpanel2 = new  JPanel();
 79           jpanel2.setLayout(new GridLayout(row,cow,0,0)); //网格布局
 80           grid_button = new  JButton [row*cow];
 81           for(int i=0; i<row*cow ; i++)
 82           {
 83             grid_button[i] = new JButton("");
 84             grid_button[i].setMargin(new Insets(0, 0, 0, 0));  
 85             /*
 86              *象是容器边界的表示形式。它指定容器必须在
 87              *其各个边缘留出的空间。这个空间可以是边界、
 88              *空白空间或标题。 
 89              * */
 90             grid_button[i].setFont(new Font(null,Font.BOLD,25));//设置此容器的字体
 91             grid_button[i].addActionListener(this);  //行为监视容器
 92             grid_button[i].addMouseListener(new MyMouseEvent());
 93              jpanel2.add(grid_button[i]);
 94           }
 95           mycontainer.add(jpanel1,BorderLayout.NORTH);
 96           mycontainer.add(jpanel2,BorderLayout.CENTER);
 97           
 98    }
 99 @Override
100 public void actionPerformed(ActionEvent e) {
101     // TODO Auto-generated method stub
102     
103 }
104 }
105  

  消息映射类:

 代码:

 1 package Scan_boobs;
 2 
 3 import java.awt.event.MouseEvent;
 4 import java.awt.event.MouseListener;
 5 
 6 public class MyMouseEvent implements MouseListener {
 7 
 8     @Override
 9     public void mouseClicked(MouseEvent e) {
10         // TODO Auto-generated method stub
11 
12     }
13 
14     @Override
15     public void mouseEntered(MouseEvent e) {
16         // TODO Auto-generated method stub
17 
18     }
19 
20     @Override
21     public void mouseExited(MouseEvent e) {
22         // TODO Auto-generated method stub
23 
24     }
25 
26     @Override
27     public void mousePressed(MouseEvent e) {
28         // TODO Auto-generated method stub
29 
30     }
31 
32     @Override
33     public void mouseReleased(MouseEvent e) {
34         // TODO Auto-generated method stub
35 
36     }
37 
38 }

下面开始导入算法部分:

  (1)算法一: 布雷的思路:

    (2 )算法二: 挖雷的思路: 

       设置为5中状态:  0,1,2,3,4;  

  抽象出来就是,打开一个格子,如果里边的数字是0(周围没有雷)的话,就打开周围的8个格子,并继续搜索打开的8个格子中是否有0,如果有就重复...直到打开一片为0的区域(如果存在的话)。
学习知识点:
注意一点:  java中 1无法等同与true   
Math.random():产生一个[0,1)之间的随机数。

暂且做到这个地方:
代码:
1 package Scan_boobs;
2 
3 public class Main 
4 {
5   static public void main(String args[] )
6   {
7       new window_scan();
8   }
9 }
  1 /*扫雷默认为9x9的方格
  2  * */
  3 package Scan_boobs;
  4 import java.awt.*;
  5 import javax.swing.*;
  6 
  7 import java.awt.BorderLayout;
  8 import java.awt.FlowLayout ;
  9 import java.awt.Container ;
 10 import java.awt.Font;
 11 import java.awt.Insets;
 12 import java.awt.event.ActionEvent;
 13 import java.awt.event.ActionListener;
 14 import javax.swing.JPanel ;
 15 public class window_scan extends JFrame implements ActionListener 
 16 { 
 17     
 18    private static final long serialVersionUID = 1L;  
 19    public static  int row =9;
 20    public static int cow =9;
 21    JFrame wind ;      
 22    JMenuBar myMenubar;         //菜单条
 23    JMenu    Menu [];           //菜单
 24    JMenuItem [] Submenu ;      //子菜单
 25    JButton  mybutton;          //开始按钮
 26    public static JButton [] grid_button ;    //扫雷里面的按钮
 27    Container  mycontainer;
 28    public static int [][] array;        //相应格子的状态
 29    public static int [] boombs;         //炸弹的位置
 30    public static int  boombs_number ;   //炸弹的数量
 31   
 32    /*
 33      * 添加到容器中的组件放在一个列表中。列表的顺序
 34      * 将定义组件在容器内的正向堆栈顺序。如果将组件
 35      * 添加到容器中时未指定索引,则该索引将被添加到列表尾部
 36      * (此后它位于堆栈顺序的底部)。 
 37      * */
 38    
 39     JPanel jpanel,jpanel1,jpanel2,jpamel3;   /*JPanel 是一般轻量级容器。*/
 40   
 41     /*
 42     * 设置三个等级,初级,中级,高级 
 43     */
 44     
 45    window_scan()
 46    {     
 47           setTitle("扫雷");
 48           setVisible(true);     //设置窗口是否可见
 49           setResizable(false);   //大小不可更改
 50           setBounds(400,100,400,500);   //初始的位置(400,100),大小(400,500)
 51           setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   
 52                //初始  
 53            mycontainer=getContentPane();  //这个获取目前的 
 54            wind_init();
 55    }
 56    
 57    void wind_init() {
 58          
 59          Submenu  = new JMenuItem [3];
 60          Submenu[0]=new JMenuItem("初级");
 61          Submenu[1]=new JMenuItem("中级");
 62          Submenu[2]=new JMenuItem("高级");
 63          Menu = new JMenu [2];
 64          Menu[0]= new JMenu("设置");
 65          for(int i=0;i<3;i++)
 66          {
 67            Submenu[i].addActionListener(this);   //监听
 68            Menu[0].add(Submenu[i]);
 69          }
 70          mybutton=new JButton("开始");  //开始按钮
 71          mybutton.addActionListener(this); 
 72          Menu[1]= new JMenu("帮助");
 73          Menu[1].addActionListener(this);
 74          myMenubar =new JMenuBar();  
 75          //setJMenuBar(myMenubar);    //设置此窗体的菜单栏
 76            jpanel= new JPanel(); 
 77              jpanel.add(myMenubar);
 78           myMenubar.add(Menu[0]);
 79           myMenubar.add(Menu[1]);
 80           jpanel1 = new JPanel();
 81           jpanel1.setLayout(new BorderLayout());  //设置布局      
 82           jpanel1.add(jpanel,BorderLayout.NORTH);
 83           jpanel1.add(mybutton,BorderLayout.CENTER);
 84            grid_button(9,9,0);  //初始炸弹设置为〇 
 85           mycontainer.add(jpanel1,BorderLayout.NORTH);
 86    }
 87 
 88 @Override
 89    public void actionPerformed(ActionEvent e) {
 90      // TODO Auto-generated method stub
 91        if(e.getActionCommand()=="初级")
 92        {
 93          row=cow=9;
 94          array = new int [row][cow] ;    //设置数组大小
 95          //撤销原先的按钮分布使其失效
 96          this.remove(jpanel2); 
 97           grid_button(row,cow,10);
 98           this.pack();
 99           //初始化状态
100         this.init(row,cow);
101        }
102        else if(e.getActionCommand()=="中级")
103        {
104          row=16;
105          cow=15;
106          array =new int [row][cow];
107          this.remove(jpanel2);
108          grid_button(row,cow,40);
109          this.pack();
110          //初始化状态
111          this.init(row,cow);
112          }
113        else if(e.getActionCommand()=="高级")
114        {
115          row=30;
116          cow=16;
117          array=new int [row+2][cow+2];
118          this.remove(jpanel2);
119          grid_button(row,cow,40);
120          this.pack();
121          //初始化状态
122          this.init(row,cow);
123        }
124        if(e.getSource()==mybutton)  //点击了开始按钮
125        {
126            
127            
128            this.init(row,cow);
129           //设置炸弹随机安放---->这里需要考虑的是产生不同数字
130            
131              boolean [] check_position= new boolean [row*cow+3];
132            for(int i=0; i<boombs_number; i++)
133           {
134              while(true)
135              {
136                int temp_val=(int)(Math.random()*(row*cow));      //[0,1]*(row*cow);
137               if(check_position[temp_val]==false)
138               {  
139                   check_position[temp_val]=true;
140                   boombs[i]=temp_val;
141                   break;
142               }
143              }
144           }
145            //安装炸弹,哇咔咔,果然想想都很有趣...........
146             //首先转化为x,y的坐标
147             int x,y;
148            for(int i=0;i<boombs_number; i++){
149                 x=boombs[i]/row;
150                 y=boombs[i]%row;
151                 array[x][y]=50;    //将这个定义为炸弹的状态
152                }
153 //           for(int i=0;i<row+2;i++){
154 //               for(int j=0;j<cow+2;j++){
155 //                   if(i==0||j==0||i==row+1||j==cow+1){
156 //                        array[i][j]=0;     
157 //                   }
158 //               }
159 //           }
160            
161      //参考别人的代码,实在是有点想不到这个算法怎么弄,思密达
162            for(int i=1;i<=row;i++)
163            {
164              for(int j=1;j<=cow;j++)
165             {
166             if(array[i][j]!=50)
167             {
168                 for(int l=j-1;l<=j+1;l++)
169                 {
170                  if(array[i-1][l]==50)  array[i][j]++;
171                  if(array[i+1][l]==50)  array[i][j]++;
172                 }
173                 if(array[i][j-1]==50)     array[i][j]++;
174                 if(array[i][j+1]==50)  array[i][j]++;        
175            } 
176                   }
177             }        
178          }
179        for(int i=0;i<cow*row;i++){
180              if(grid_button[i].getText()!="★")
181              {
182                int x=i/cow+1;
183                int y=i%cow+1;
184                if(e.getSource()==grid_button[i]&&array[x][y]==100){
185                   grid_button[i].setText("★");
186                   grid_button[i].setEnabled(false);
187                   array[x][y]=10;
188                   for(int k=0;k<cow*row;k++){
189                          int m1=k/cow+1;
190                            int n1=k%cow+1;
191                          if(array[m1][n1]!=10&&grid_button[k].getText()=="★"){
192                              grid_button[k].setText("*o*");
193                          }
194                      }
195                   for(int j=0;j<cow*row;j++){
196                        int m=j/cow+1;
197                        int n=j%cow+1;
198                        if(array[m][n]==100){
199                          grid_button[j].setText("★");
200                          grid_button[j].setEnabled(false);                       
201                      }
202                      grid_button[j].setEnabled(false);
203                      array[m][n]=10;
204                   }        
205               }
206            else if(e.getSource()==grid_button[i]){
207                    if(array[x][y]==0){
208                         wa_lei(array,grid_button,e,i,x,y);
209                         array[x][y]=10;
210                         grid_button[i].setEnabled(false); 
211                    }
212                     if(array[x][y]!=0&&array[x][y]!=10){
213                          grid_button[i].setText(array[x][y]+"");
214                          grid_button[i].setEnabled(false);
215                          array[x][y]=10;
216                     }
217             }
218         }else if(grid_button[i].getText()=="★"){
219         }
220       }
221 }
222   /*************布置按钮方法**************************/
223 public void grid_button(int row ,int cow ,int boombs_number)
224 {
225     //设置雷区域
226       jpanel2 = new  JPanel();
227       jpanel2.setLayout(new GridLayout(row,cow,0,0)); //网格布局
228       grid_button = new  JButton [row*cow];
229       boombs =new int [boombs_number];
230       for(int i=0; i<row*cow ; i++)
231       {
232         grid_button[i] = new JButton("    ");    //有点空格将按钮弄大些  
233         grid_button[i].setMargin(new Insets(0, 0, 0, 0));  
234         /*
235          *象是容器边界的表示形式。它指定容器必须在
236          *其各个边缘留出的空间。这个空间可以是边界、
237          *空白空间或标题。 
238          * */
239         grid_button[i].setFont(new Font(null,Font.BOLD,25));//设置此容器的字体
240         grid_button[i].addActionListener(this);  //行为监视容器
241         grid_button[i].addMouseListener(new MyMouseEvent()); 
242        //        grid_button[i].setText("");
243       //        grid_button[i].setEnabled(true);
244         jpanel2.add(grid_button[i]);     
245       }
246        mycontainer.add(jpanel2,BorderLayout.CENTER);
247 }
248     /***************初始化状态****************/
249    public void init(int row,int cow)
250    {
251        for(int i=0;i<row+2;i++){
252         for(int j=0;j<cow+2;j++){
253                 array[i][j]=0;
254          }
255         }
256        for(int i=0;i<cow*row;i++){
257           grid_button[i].setText("");
258              grid_button[i].setEnabled(true);
259        }   
260    }
261    public void wa_lei(int[][] a,JButton[] btns,ActionEvent e,int i,int x,int y){
262         int p=1;
263            if(a[x][y]==0){
264                  a[x][y]=10;
265               btns[i].setEnabled(false);    //33 
266              for(int l=y-1;l<=y+1;l++){
267                   int m=x-1-1;
268                      int n=l-1;
269                      p=1;
270                      System.out.println(a[1][2]);
271                      if(n>-1&&n<cow&&m>-1&&m<row)
272                      {
273                           for(int q=0;q<row&&p==1;q++){//cow-->row;
274                                if(((n+cow*q)>=(m*cow))&&((n+cow*q)<(m+1)*cow)){
275                                     if(a[x-1][l]!=0&&a[x-1][l]!=10){
276                                          btns[n+cow*q].setText(a[x-1][l]+"");
277                                          a[x-1][l]=10;
278                                          btns[n+cow*q].setEnabled(false);
279                                     }
280                                     else if(a[x-1][l]==0){
281                                          //a[x-1][l]=10;
282                                          btns[n+cow*q].setEnabled(false);
283                                          wa_lei(a,btns,e,n+cow*q,x-1,l); ////55////
284                                          a[x-1][l]=10;
285                                          btns[n+cow*q].setEnabled(false);
286                                     }
287                                     p=0;
288                                 
289                               }
290                          }
291                      }
292                      p=1;
293                      m=x;
294                      if(n>-1&&n<cow&&m>-1&&m<cow)
295                      {
296                   for(int q=0;q<row&&p==1;q++){
297                          if(((n+cow*q)>=(m*cow))&&((n+cow*q)<(m+1)*cow)){
298                              if(a[x+1][l]!=0&&a[x+1][l]!=10){
299                                  btns[n+cow*q].setText(a[x+1][l]+"");
300                                  a[x+1][l]=10;
301                                  btns[n+cow*q].setEnabled(false);
302                             }
303                             else if(a[x+1][l]==0){
304 
305                                  wa_lei(a,btns,e,n+cow*q,x+1,l);///55////                        
306                                 a[x+1][l]=10;
307                                 btns[n+cow*q].setEnabled(false);
308                             }
309                              p=0;
310                          }
311                      }
312                       
313                    }
314               }
315               int m=x-1;
316                 int n=y-1-1;
317                 p=1;
318              if(n>-1&&n<cow&&m>-1&&m<cow)
319                 {
320                 for(int q=0;q<row&&p==1;q++){
321                          if(((n+cow*q)>=(m*cow))&&((n+cow*q)<(m+1)*cow)){
322                              if(a[x][y-1]!=0&&a[x][y-1]!=10){
323                                  btns[n+cow*q].setText(a[x][y-1]+"");
324                                  a[x][y-1]=10;
325                                  btns[n+cow*q].setEnabled(false);
326                             }
327                             else if(a[x][y-1]==0){
328 
329                         
330                                  wa_lei(a,btns,e,n+cow*q,x,y-1);
331                                  
332                              a[x][y-1]=10;
333                                 btns[n+cow*q].setEnabled(false);
334                             }
335                              p=0;
336                          }
337                    }
338                 }
339                 p=1;
340                 m=x-1;
341                 n=y+1-1;
342              if(n>-1&&n<cow&&m>-1&&m<cow)
343                {
344                 for(int q=0;q<row&&p==1;q++){
345                          if(((n+cow*q)>=(m*cow))&&((n+cow*q)<(m+1)*cow)){
346                              if(a[x][y+1]!=0&&a[x][y+1]!=10){
347                                  btns[n+cow*q].setText(a[x][y+1]+"");
348                                  a[x][y+1]=10;
349                                  btns[n+cow*q].setEnabled(false);
350                             }
351                             else if(a[x][y+1]==0){
352                                  wa_lei(a,btns,e,n+cow*q,x,y+1);                                                     
353                                   a[x][y+1]=10;
354                                  btns[n+cow*q].setEnabled(false);
355                             }
356                              p=0;
357                          }
358                   }
359          }
360         }
361 
362    }
363 
364 }
 1 package Scan_boobs;
 2 
 3 import java.awt.event.MouseEvent;
 4 import java.awt.event.MouseListener;
 5 
 6 public class MyMouseEvent implements MouseListener {
 7     @Override
 8     public void mouseClicked(MouseEvent e) {
 9         // TODO Auto-generated method stub
10         for(int i=0;i<window_scan.cow*window_scan.row;i++){
11                int x1=i/window_scan.cow+1;
12                int y1=i%window_scan.cow+1;
13             if(e.getSource()==window_scan.grid_button[i]&&window_scan.grid_button[i].getText()!="★"&&window_scan.array[x1][y1]!=10)
14             {
15                if(e.getButton()==MouseEvent.BUTTON3){
16                    window_scan.grid_button[i].setText("★");
17                    window_scan.boombs_number--;
18                   if(window_scan.boombs_number==0){
19                       int flag=0;
20                       for(int j=0;j<window_scan.cow*window_scan.row;j++){
21                            int x=j/window_scan.cow;
22                            int y=j%window_scan.cow;
23                           if(window_scan.array[x][y]==100&&window_scan.grid_button[j].getText()=="★"){
24                               flag++;
25                           }
26                       }
27                       }
28                   }
29                }
30             
31         else 
32             if(e.getSource()==window_scan.grid_button[i]&&window_scan.grid_button[i].getText()=="★"&&window_scan.array[x1][y1]!=-1){
33                 if(e.getButton()==MouseEvent.BUTTON3){
34                     window_scan.grid_button[i].setText("");
35                     window_scan.boombs_number++;                                         
36                   window_scan.grid_button[i].setEnabled(true);
37                 }
38             }
39         }
40     
41     }
42 
43     @Override
44     public void mouseEntered(MouseEvent e) {
45         // TODO Auto-generated method stub
46 
47     }
48 
49     @Override
50     public void mouseExited(MouseEvent e) {
51         // TODO Auto-generated method stub
52 
53     }
54 
55     @Override
56     public void mousePressed(MouseEvent e) {
57         // TODO Auto-generated method stub
58 
59     }
60 
61     @Override
62     public void mouseReleased(MouseEvent e) {
63         // TODO Auto-generated method stub
64 
65     }
66 
67 }