`
celebration
  • 浏览: 33932 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

扫雷程序的实现

阅读更多

      春节在家没事干,亲戚朋友都在老家,整天都猫在家里。感觉有点写东西的冲动,于是找了本编程的书,把上面感觉有点意思而且值得写的东西随便写了些。后来想到了写个扫雷玩玩,扫雷的游戏我还是比较喜欢的,以前没事的时候经常玩。

      我选择了C++实现,不过我的界面不行,也懒得写。于是就简单的做了个内核性的东西,直接在cmd界面接收输入和打印输出。宏定义扫雷区域的大小(N*N)和地雷的数量(M),方便修改。其实可以做成根据选择的游戏难度来改变雷区的大小和地雷的数量,和微软带的扫雷程序一样,不过我懒得弄了。记录雷区状态(有雷,空白,数字)自然就选择了二维数组(0--空白 -1--地雷 正整数--周围雷的数量),如果雷区的大小是N的话,我的数组就是(N+2)*(N+2),然后将最外围的都赋值为0。

      首先是开局的时候初始化雷区的问题,我选择的先随即生成M(地雷个数)个不同的位置,将地雷状态数组的相应位置置成-1,表示这个位置有地雷。把所有的地雷都随即生成好以后,接下来的任务就是要把其他的位置安装地雷的情况进行赋值,如果某个位置周围没有地雷则直接赋值为0,否则就是周围8个位置的地雷数。由于表示雷区数组的大小比实际的雷区大,所以不用考虑边缘的情况,也在一定的程度上提高了效率,用空间复杂度换取了时间复杂度。这样就完成了雷区的初始化。

下一步的任务就是开始游戏了,玩家是通过输入坐标的值来进行游戏的。
    如果该位置有地雷(值是-1),则直接显示游戏结束,打印出雷区的全貌(地雷,数字和空白)。
    如果该地是大于0的整数,则直接显示该位置,游戏继续
    如果该位置是空白(值为0),表示该地区是空白区,即周围没有地雷,这个时候要做的就是把周围的非空白区都显示出来,本步骤最难的也就是这个过程了。
点到空白区的显示算法我是用递归实现的,也就是如果当前位置是空白区,则递归显示周围的8个位置(如果是边缘可能小于8,需要判断小不能超出范围)。递归的终结条件就是点到的位置不是空白区为止(即值大于0为止)。可能有人担心万一点到地雷了呢?这种情况是不可能发生的,原因我就不多说了,相信大家都能明白。

      最后一步就是判断游戏胜利的条件,其实这个实现上更容易。只要记录下所有显示的位置的数量,满足N*N-M即可。

      整个流程就是这样,思路还是非常简单的,可能调试起来稍微花点时间,但是用心调的话应该也会很快的。本来就是自己无聊写着玩的,写完后也没有整理,不过看到网上不少的新手求助扫雷程序的思路和代码。代码我就不贴了,没有整理没有优化太乱了,在这里就简单的说下思路吧。

注:     

      如果想做成和微软带的一样的扫雷其实也很简单,写好了界面后在每次点击鼠标左键的时候捕获相应的坐标,其他的思路是一样的。然后加个右键标示该位置是地雷,对某个数字位置按住左键再按右键的时候如果该位置周围的雷都已经标示出来的话,进行的操作就是显示该位置周围的其他未显示的位置。再加上记录时间,显示剩余地雷的数量,弄个重置游戏的按钮就好了。这样的话做出来的东西就和微软的扫雷差不多了,有时间有兴趣可以做着玩,不过我懒得弄了。

分享到:
评论
4 楼 celebration 2009-02-13  
fxsjy 写道

左右键同时按的功能做了没有?当初我也做了一个,就是这个功能还没实现了:http://microsoft.csdn.net/vs/dev_contest/Ms_rich_Detail.aspx?pointid=116

这个我没做,不过应该也比较简单,只要把周围还没有显示的格子都显示出来就可以了。
3 楼 celebration 2009-02-13  
姜太公 写道

楼主啊,我们真是有缘,我也写了一个。同样是没有界面,直接在cmd上输出,也是(width+2) * (height + 2)的数组。连0表示空白,-1表示雷都一样。握个手!不过我用的是Python,写起来很轻松。

呵呵,握个手!
2 楼 姜太公 2009-02-09  
楼主啊,我们真是有缘,我也写了一个。同样是没有界面,直接在cmd上输出,也是(width+2) * (height + 2)的数组。连0表示空白,-1表示雷都一样。握个手!

不过我用的是Python,写起来很轻松。
1 楼 fxsjy 2009-02-09  
左右键同时按的功能做了没有?当初我也做了一个,就是这个功能还没实现了:http://microsoft.csdn.net/vs/dev_contest/Ms_rich_Detail.aspx?pointid=116

相关推荐

Global site tag (gtag.js) - Google Analytics