java扫雷算法 思想篇

 1:建立一个雷区可以用一个一个的JButton按钮放在棋盘状的一个JFrame里或者JDialog里,当然JButton太难看了可以的话可以监听鼠标,盘子上可以放上自己制作的几张小图片。

  2:我们在雷区上随机地放上雷,可以用二维数组,用Math.Random()随即生成下标两个,在相应的数组里布上雷。

  3:注册监听。

  4:点击以后按下列的方式遍历数组:

  没有雷且被点击后就会慢慢的波及到类区如:

  0   1   2   3 4 5 6 7 8    9

  0 @ @ @ @ @ @ @ @ @ @

  1 @ @ @ & @ @ @ @ @ @

  2 @ @ @ @ @ @ $ @ @ @

  3 @ $ @ @ @ @ @ @ @ @

  假设点击了[0,6]位置:应该变成

  0   1   2   3   4  5    6    7       8       9

  0 @ @ @ @ 1    ~     ~     ~        ~      ~

  1 @ @ @ &   1    1    1    1        ~      ~

  2 @ @ @ @ @ @   $    1        ~       ~

  3 @ $ @ @ @ @     @ 1       ~     ~

  在这里我把上图解释一下

  【0,5】   【0,6】 【0,7】

  【1,5】    【1,6】 【1,7】

  点击了【0,6】位置以后由于以06为基点向四周扩散一直到雷区的边沿!由于05,07,15,16,17都没有雷哪么就又以这5个几点向它们的四周扩散!以其中的任何一个为中心八个方向如果有雷的话就在这个地方标出它周围的雷数来提醒玩家!

  如到了:04位置:

  @(0.3) @(0.4) @(0.5)

  $(1.3)   @(1.4)   @(1.5)

  只有其 :西南位置有一个雷哪么【0,4】位置标注以其为中心 其北,南,西,东,东北,东南,西北,西南,方向一共有1个雷;

  【0,3】的八个方位只有其南方有一个雷哪么第一次扩展到此位置的下一个不能再展了!总而言之:

  @ @ @

  @ 【】@

  @ @ @

  以【】为中心找其周围的雷数,简化一下就是不断的画正方形!可要小心哦!不要把数字标在地雷上了,只是雷区的“边沿”特别注意:“边沿”二字就是提醒玩家“你现在处的位置朝八个方向走下一步有几个地雷在等着你去踏!”

  下面是网上的一个例子 ,以上是我的理解罢了!希望对你有帮助!

  如雷区:

  11   12   13   14   15   16   17   18

  21   22   23   24   25   26   27   28

  31   32   33   34   35   36   37   38

  41   42   43   44   45   46   47   48

  51   52   53   54   55   56   57   58

  我要知道a[34]周围有几个雷,就只有去检测

  a[23],a[24],a[25]

  a[33],           a[35]

  a[43],a[44],a[45]

  这8个雷区是否放上了雷,仔细观察它们成在数学关系。

  抽象出来就是:a[i,j]的雷的个数就是由

  a[i-1,j-1],a[i-1,j],a[i-1,j+1]

  a[ i ,j-1],    a[ i ,j+1]

  a[i+1,j-1],a[i+1,j],a[i+1,j+1]

  (如果超出边界再加以判断)

  这样的8个雷区决定的。

  扫雷程序还会自动展开已确定没有雷的雷区。如果a[3,4]周围雷数为1,a[2,3]已被标示为地雷,那么a[24],a[25],a[33],a[35],a[43],a[44],a[45]将被展开,一直波及到不可确定的雷区。这也是实现的关键。我们可以把数组的元素设定为一个类对象,它们所属的类设定这样的一个事件:在被展开时,检查周围的雷数是否与周围标示出来的雷数相等,如果相等则展开周围未标示的雷区。这样新的雷区展开又触发这个事件,就这样递归下去,一直蔓延到不可展开的雷区。

  相信在了解以上两个要点后,把雷区这个类编写完全(如添加是否有雷标记,是否展开标记,周围雷数等,双击,左右单击的鼠标事件等),实现扫雷程序应是十分单的一件事。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值