扫雷游戏制作过程(C#描述):第八节、整体完善

这一节我们将介绍结束游戏的方法,以及一些整体方面的完善。首先考虑失败的情况,它会将所有的地雷都显示出来。我们新建一个GameLost函数:

8-1 GameLost在游戏结束的地方调用GameLost函数,因为我们上一节中讲述的游戏结束都是失败的情况:

8-2 GameLost

8-3 GameLost

我们发现游戏结束的时候,虽然所有的格子都打开了,但是并没有显示出地雷的图标,我们将地雷的图标调整为20*20,并且按照上一节的方法将它将入到Resources.resx文件中。同时修改PaintGame函数点开部分的代码如下:

8-4 PaintGame

 

此时,我们再次测试的时候,就会看到地雷的图标了:

8-5 阶段性结果

然而,我们发现有一个问题,当我们单击数字的时候,会把所有的地雷都显示出来,也就是游戏结束。我们修改左击的事件:

8-6 左键事件

这时候,刚才的问题就得到了修复。但是我们却又发现了一个问题——游戏结束的时候,还是可以继续单击雷区,打开区域。为此,我们增加一个变量检测游戏是否结束,如果结束,则任何按键都视为无效。首先定义一个变量:

8-7 GameOver

 

我们在游戏开始的时候对它进行初始化,在New Game菜单事件处理函数的末尾修改代码如下:

8-8 GameOver

将GameLost函数修改如下:

8-9 GameOver同时修改MouseUp事件,将开头代码修改如下:

8-10 GameOver

至此,这个问题已经得到了修复。我们可以运行查看结果。

但是,我们现在还有一个判断游戏胜利的函数没有写,我们在每次打开地雷区域的时候判断游戏者是否胜利,首先定义一个GameWin函数如下:

8-11 GameWin

8-12 GameWin

然后,在MouseUp最后调用该函数:

 

8-13 GameWin调用

 

此时,我们的游戏基本完成了,但是有时会有这样的问题,左右双击区域的时候,不会显示到数字边界上,我们在OpenMine的时候调用一下dfs函数即可,将OpenMine函数修改如下:

8-14 OpenMine

至此,我们的扫雷游戏基本完成了,接下来还需要处理的一个功能是音效,首先搜索音效资源:BombTick。然后按照之前的方法,将它们添加到Resources.resx文件中。

定义两个变量用来播放这两个音效,并且在构造函数中进行初始化,如下:

8-15 Sound

8-16 Sound

接下来分别在计时器的事件以及GameLost函数中添加如下代码:

8-17 Timer调用

8-18 GameLost调用

此外,我们还需要将音效的初始默认值设置为False,只需要将Setting文件中的默认值改为False即可。此外,我们还需要在GameLost的时候停止计时器:

8-19 GameLost修复

至此,我们的一个扫雷游戏就制作完成了,效果如下:

8-20 最终结果

但有时我们会发现雷区还没有被完全打开,就已经弹出了游戏结束的对话框,为此,我们只需要在MouseUp事件中将刷新和判断游戏胜利的语句换一下次序即可:

8-21 优化

 

测试的时候,我们发现,单击Rank对话框中的Reset按钮,虽然数据库恢复了默认值,但是显示的值却没有马上恢复默认值,为此,双击Rank窗口中的Reset按钮,修改它的事件如下:

8-22 优化

至此,一个较为完善的扫雷游戏就完成了,我将它托管在了GitHub上:Minesweeper

7 条评论扫雷游戏制作过程(C#描述):第八节、整体完善

  1. 大神膜拜~~~~

    Ps:

    GameWin里 if(pState[i ,j] == 0 || (pState[i, j] == 2 || pState[i, j] == 3)存在BUG.仅剩一个格子时点开不管对错都会算胜利.

    改成if (pState[i, j] == 2 && pMine[i, j] == -1)

     

发表评论