扫雷游戏设计-Java

其实扫雷游戏的实现并不是想象中的那么困难,我在这谈谈自己的方法,虽然不算很好的Idear:

1.定义一个10*10的String数组。

2.定义数组的值:共三个:" "(空格),"雷",第三个是数字,即周围的雷的数目,如"3",表示它的周围8个方块里有3个雷。

3.随机生成雷的位置,如要生成10个雷,则生成10个下标[i][j],注意位置不能重复了,下面是代码:

     for(int i=0;i<numLei;i++)
     {
         leiX=a.nextInt(max);
         leiY=a.nextInt(max);
         if(lei[leiX][leiY].equals("雷"))
               i--;
         else
               lei[leiX][leiY]="雷";

      }

4.初始化除雷外的其它值,其实也就是计算不是雷的格子周围雷的数目,方法也不算难,即遍历数组,如果不是雷则算它的周围是不是雷

      (i - 1, y - 1)(i      , y - 1)(i + 1, y - 1)

      (i - 1,      y)                  (i + 1,      y)

      (i - 1, y + 1)(i - 1, y - 1)(i + 1, y + 1)

      代码如下:

      for(int i=0;i<lei.length;i++)
         for(int j=0;j<lei[i].length;j++)
         {
          if(!lei[i][j].equals("雷"))
          {
           for(int r=-1;r<=1;r++)
      for(int c=-1;c<=1;c++)
      {
       if(i+r>=0&&i+r<max&&j+c>=0&&j+c<max)
       {
        if(lei[i+r][j+c].equals("雷"))
         leiNum++;
       }
        
      }
           if(leiNum!=0)
         lei[i][j]=""+leiNum;
           leiNum=0;
          }
          
         }

      如果算出来的雷数量为0,则给赋值为" "一个空格。

5.点击事件,这个应该是整个游戏稍复杂的吧,我这里用10*10 Button表示界面,一开始Lable的Text都为""。

      A。点击按钮,程序可以得知该数组位置对应的值是什么:

            "雷"则游戏结束

            "3"(即雷数目)则对应Button的Lable = "3"

            " "则Button的Lable = " ",注意,我们点击按键的时候,如果按钮为数字和" "的话,那我们就不用处理这个点击事件,因为格子已经打开了。

6.处理连续打开,即如果玩家点击的格是" ",即表示周围没雷,则这个应自动打开它周围的格子。

而如果它周围的某个A格的周围也没雷,也要自动打开A格子周围的格子。玩过扫雷的都知道这个动作的,我这里用了递归方法,代码如下:

      public void open(int i,int j)
 {
  for(int r=-1;r<=1;r++)
   for(int c=-1;c<=1;c++)
   {
    if(i+r>=0&&i+r<max&&j+c>=0&&j+c<max&&b[i+r][j+c].getLabel().equals(" "))
    {
     b[i+r][j+c].setBackground(Color.white);
     b[i+r][j+c].setLabel(lei[i+r][j+c]);
     if(b[i+r][j+c].getLabel().equals(""))
     {
      open(i+r,j+c);
     }
    }
   }
 }

最后,希望我这篇破文章对Java编程有兴趣的小伙子有些许的帮助吧,下面是我的原代码:有些乱,因为那时候我也是初学呢:

 

ContractedBlock.gif ExpandedBlockStart.gif 扫雷代码:
  1package game.sl;
  2import java.awt.*;
  3import java.util.Random;
  4import java.awt.event.*;
  5import javax.swing.JOptionPane;
  6public class MyShaoLei extends Frame implements ActionListener,MouseListener
  7ExpandedBlockStart.gifContractedBlock.gif{
  8 
  9 public static void main(String[] args)
 10ExpandedSubBlockStart.gifContractedSubBlock.gif {
 11ExpandedSubBlockStart.gifContractedSubBlock.gif  String[] values = "简单""一般""高级" };
 12  String value = (String) JOptionPane.showInputDialog(null
 13  "请选择难度""难度选择",JOptionPane.INFORMATION_MESSAGE, null,
 14  values, values[0]);
 15  MyShaoLei msl1=new MyShaoLei(value);
 16 }

 17 int max;
 18 int numLei;
 19 int min;
 20 Button[][] b;
 21 String[][] lei;
 22 Random a=new Random();
 23 int numLei1=numLei,count,leiX,leiY,leiNum;//剩余雷,步数,雷的坐标x,雷坐标y,周围雷数
 24 Button b1,b2,b3;
 25 TextField tf1,tf2;
 26 Panel p,p1;
 27 Label l1,l2,l3,l4;
 28 Image imghq ;
 29 public MyShaoLei(String value)
 30ExpandedSubBlockStart.gifContractedSubBlock.gif {
 31  
 32  if(value.equals("简单"))
 33ExpandedSubBlockStart.gifContractedSubBlock.gif  {
 34   max=9;
 35   numLei=10;
 36   this.setSize(300,350);
 37  }

 38  else if(value.equals("一般"))
 39ExpandedSubBlockStart.gifContractedSubBlock.gif  {
 40   max=16;
 41   numLei=40;
 42   this.setSize(400,470);
 43  }

 44  else if(value.equals("高级"))
 45ExpandedSubBlockStart.gifContractedSubBlock.gif  {
 46   max=22;
 47   numLei=99;
 48   this.setSize(500,570);
 49  }

 50  this.addWindowListener(new WindowAdapter()
 51ExpandedSubBlockStart.gifContractedSubBlock.gif    {
 52     public void windowClosing(WindowEvent e)
 53ExpandedSubBlockStart.gifContractedSubBlock.gif     {
 54      dispose();//释放资源
 55      System.exit(0);
 56     }

 57    }
);
 58  this.max=max;
 59  this.numLei=numLei;
 60  b=new Button[max][max];
 61  lei=new String[max][max];
 62  this.setLayout(new BorderLayout(20,20));//行,列,行间,列间
 63  p=new Panel();
 64  p.setLayout(new GridLayout(max,max,0,0));
 65  for(int i=0;i<b.length;i++)
 66         for(int j=0;j<b[i].length;j++)
 67ExpandedSubBlockStart.gifContractedSubBlock.gif         {
 68          b[i][j]=new Button();
 69          b[i][j].addActionListener(this);
 70          b[i][j].addMouseListener(this);
 71          p.add(b[i][j]);
 72         }

 73  p1=new Panel();
 74  p1.setLayout(new GridLayout(1,9,0,0));
 75  tf1=new TextField(numLei);
 76  tf2=new TextField("2");
 77  b1=new Button("简单");
 78  b1.addActionListener(this);
 79  b2=new Button("一般");
 80  b2.addActionListener(this);
 81  b3=new Button("困难");
 82  b3.addActionListener(this);
 83  l1=new Label();
 84  l2=new Label();
 85  l3=new Label();
 86  l4=new Label();
 87  p1.add(tf1);
 88  p1.add(l1);
 89  p1.add(b1);
 90  p1.add(l2);
 91  p1.add(b2);
 92  p1.add(l3);
 93  p1.add(b3);
 94  p1.add(l4);
 95  p1.add(tf2);
 96  add(p,BorderLayout.CENTER);
 97  add(p1,BorderLayout.SOUTH);
 98   
 99  this.setVisible(true);
100  
101   Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();//获取屏幕大小
102         int w = getSize().width;
103         int h = getSize().height;
104         int x = (dim.width-w)/2;
105         int y = (dim.height-h)/2;
106         setLocation(x,y);
107  
108        begin();
109        
110 }

111 public void begin()
112ExpandedSubBlockStart.gifContractedSubBlock.gif {
113  this.tf2.setText("0");
114  for(int i=0;i<b.length;i++)
115         for(int j=0;j<b[i].length;j++)
116ExpandedSubBlockStart.gifContractedSubBlock.gif         {
117          b[i][j].setLabel(" ");
118          b[i][j].setBackground(Color.lightGray);
119          lei[i][j]=new String("");
120         }

121  for(int i=0;i<numLei;i++)
122ExpandedSubBlockStart.gifContractedSubBlock.gif  {
123   leiX=a.nextInt(max);
124   leiY=a.nextInt(max);
125   if(lei[leiX][leiY].equals(""))
126    i--;
127   else
128    lei[leiX][leiY]="";
129  }

130        for(int i=0;i<lei.length;i++)
131         for(int j=0;j<lei[i].length;j++)
132ExpandedSubBlockStart.gifContractedSubBlock.gif         {
133          if(!lei[i][j].equals(""))
134ExpandedSubBlockStart.gifContractedSubBlock.gif          {
135           for(int r=-1;r<=1;r++)
136      for(int c=-1;c<=1;c++)
137ExpandedSubBlockStart.gifContractedSubBlock.gif      {
138       if(i+r>=0&&i+r<max&&j+c>=0&&j+c<max)
139ExpandedSubBlockStart.gifContractedSubBlock.gif       {
140        if(lei[i+r][j+c].equals(""))
141         leiNum++;
142       }

143        
144      }

145           if(leiNum!=0)
146         lei[i][j]=""+leiNum;
147           leiNum=0;
148          }

149          
150         }

151 }

152 public void death()
153ExpandedSubBlockStart.gifContractedSubBlock.gif {
154  for(int i=0;i<max;i++)
155   for(int j=0;j<max;j++)
156ExpandedSubBlockStart.gifContractedSubBlock.gif   {
157    b[i][j].setLabel(lei[i][j]);
158    if(!lei[i][j].equals(""))
159     b[i][j].setBackground(Color.white);
160   }

161  if(JOptionPane.showConfirmDialog(null,"是否重新开始?""请选择", JOptionPane.YES_NO_OPTION)==0)
162ExpandedSubBlockStart.gifContractedSubBlock.gif  {
163   begin();
164  }

165  else
166   System.exit(0);
167 }

168 public void win()
169ExpandedSubBlockStart.gifContractedSubBlock.gif {
170  for(int i=0;i<max;i++)
171   for(int j=0;j<max;j++)
172ExpandedSubBlockStart.gifContractedSubBlock.gif   {
173    if(b[i][j].getLabel().equals(" "))
174     min++;
175   }

176  if(min==numLei)
177ExpandedSubBlockStart.gifContractedSubBlock.gif  {
178   if(JOptionPane.showConfirmDialog(null,"请选择""是否重新开始?", JOptionPane.YES_NO_OPTION)==0)
179ExpandedSubBlockStart.gifContractedSubBlock.gif   {
180    begin();
181   }

182   else
183    System.exit(0);
184  }

185  else
186   min=0;
187 }

188 public void open(int i,int j)
189ExpandedSubBlockStart.gifContractedSubBlock.gif {
190  for(int r=-1;r<=1;r++)
191   for(int c=-1;c<=1;c++)
192ExpandedSubBlockStart.gifContractedSubBlock.gif   {
193    if(i+r>=0&&i+r<max&&j+c>=0&&j+c<max&&b[i+r][j+c].getLabel().equals(" "))
194ExpandedSubBlockStart.gifContractedSubBlock.gif    {
195     b[i+r][j+c].setBackground(Color.white);
196     b[i+r][j+c].setLabel(lei[i+r][j+c]);
197     if(b[i+r][j+c].getLabel().equals(""))
198ExpandedSubBlockStart.gifContractedSubBlock.gif     {
199      open(i+r,j+c);
200     }

201    }

202   }

203 }

204 public void actionPerformed(ActionEvent e)
205ExpandedSubBlockStart.gifContractedSubBlock.gif {
206  for(int i=0;i<max;i++)
207   for(int j=0;j<max;j++)
208    if(e.getSource()==b[i][j])
209ExpandedSubBlockStart.gifContractedSubBlock.gif    {
210     if(b[i][j].getLabel().equals(" "))
211      tf2.setText(""+(++count));
212      if(lei[i][j].equals(""))
213ExpandedSubBlockStart.gifContractedSubBlock.gif      {
214       death();
215      }

216      else if(lei[i][j].equals(""))
217ExpandedSubBlockStart.gifContractedSubBlock.gif      {
218       System.out.println("周围无雷!");
219       open(i,j);
220      }

221      else
222ExpandedSubBlockStart.gifContractedSubBlock.gif      {
223       b[i][j].setLabel(lei[i][j]);
224       b[i][j].setBackground(Color.white);
225      }

226      win();
227    }

228 }

229ExpandedSubBlockStart.gifContractedSubBlock.gif public void mousePressed(MouseEvent e) {}  
230ExpandedSubBlockStart.gifContractedSubBlock.gif public void mouseReleased(MouseEvent e) {}  
231ExpandedSubBlockStart.gifContractedSubBlock.gif public void mouseEntered(MouseEvent e) {}  
232ExpandedSubBlockStart.gifContractedSubBlock.gif public void mouseExited(MouseEvent e) {}  
233 public void mouseClicked(MouseEvent e) 
234ExpandedSubBlockStart.gifContractedSubBlock.gif {    
235  switch(e.getModifiers()) 
236ExpandedSubBlockStart.gifContractedSubBlock.gif  {   
237   case InputEvent.BUTTON1_MASK: 
238ExpandedSubBlockStart.gifContractedSubBlock.gif   {   
239    //左键
240    break;        
241   }
      
242   case InputEvent.BUTTON2_MASK: 
243ExpandedSubBlockStart.gifContractedSubBlock.gif   {   
244    //中键            
245    break;        
246   }
      
247   case InputEvent.BUTTON3_MASK: 
248ExpandedSubBlockStart.gifContractedSubBlock.gif   {   
249    if(((Button)e.getSource()).getLabel()==(" "))
250ExpandedSubBlockStart.gifContractedSubBlock.gif    {
251     ((Button)e.getSource()).setLabel("!");
252     ((Button)e.getSource()).setBackground(Color.red);
253     numLei1--;
254     tf1.setText(""+numLei1);
255    }

256    else if(((Button)e.getSource()).getLabel()==("!"))
257ExpandedSubBlockStart.gifContractedSubBlock.gif    {
258     ((Button)e.getSource()).setLabel("?");
259     ((Button)e.getSource()).setBackground(Color.yellow);
260     numLei1++;
261     tf1.setText(""+numLei1);
262    }

263    else if(((Button)e.getSource()).getLabel()==("?"))
264ExpandedSubBlockStart.gifContractedSubBlock.gif    {
265     ((Button)e.getSource()).setLabel(" ");
266     ((Button)e.getSource()).setBackground(Color.lightGray);
267    }

268    //((Button)e.getSource()).setBackground(Color.white);
269    break;        
270   }
     
271  }

272 }

273}

274

 

转载于:https://www.cnblogs.com/cshF3220544/archive/2009/05/30/1492024.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
         游戏界面可以分为三个模块:菜单栏,游戏数据显示区域以及雷区。     (1)菜单栏:      菜单栏包括游戏难度的选择和排行榜的查询以及游戏帮助。     (2)游戏数据显示区域:      游戏数据显示区域包括地雷计数区、计时区和重新开始按钮。     (3)雷区:      雷区就是玩家的游戏区域,当玩家在游戏过程中用鼠标点击某一模块,系统会自动作出相应的响应,这就是游戏中的鼠标事件。            简单玩法介绍:         当玩家点开第一个格子时雷区开始布雷同时计时开始。然后会在该格子上显示周围8个格子的雷数(如果没有雷则自动点开周围的格子),     玩家就需要通过这些数字来判断雷的位置,将是雷的格子标记为小红旗。若玩家认为已标记的格子时错误的,可以再次右击该格子来取消标记。     当某一格子被标记时,对于该格子的单击操作是无效的(防止玩家误点击导致游戏失败)。如果玩家将某一格周围8个格子中的雷标记了出来,     双击该格子会自动将周围的格子点击一遍,这样可以简化玩家的操作。当玩家将全部的地雷标记出来并且其他的格子点开时,游戏结束。     但是如果玩家不小心点到了地雷就会游戏失败,系统自动显示出所有的地雷。如果玩家标识的地雷数量超过了该难度下规定的雷数,     计数区会以负数显示超出的雷数并且游戏不会结束。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值