本文是一个初学者对于扫雷实现的想法,希望能有一定的借鉴意义,下面我将分步阐述。
一、已实现的功能
(1)游戏基本逻辑
(2) 添加了背景音乐、点击音效、踩雷音效和胜利音效
(3)游戏结束时可以选择退出或重开
(4)实现了“防止第一步触雷”的功能
(5)实现了”一点一大片“的功能
二、各功能实现的基本介绍
头文件和函数的声明
除了各部分函数的声明外,我们在此定义了ROW和COL的值,这规定了扫雷的界面大小;同时,我们在此引入了三个全局变量,它们会在将来某些功能的实现中发挥作用。
单元格的设置
以上为实现扫雷单元格设置所需的代码
在主函数中,我们还需以上两行代码:第一行用于生成随机数以实现随机埋雷;第二行则是设置了各单元格的初始值
在代码中,我们规定值为”-1“的格子为炸弹格,值为“0~8”的格子为数字格
图片的导入
在主函数中,我们先将图片资源导入进来。
在函数中,我们根据不同的值在不同的单元格中输出不同的图片。
1. 值为-1——*炸弹图像*
1. 值为0~8——*数字图像*
1. 值为9~18——*遮盖格图像*
1. 值为19~28——*插旗格图像*
单元格的覆盖(加密)
通过对所有单元格的值**+10**,来实现对所有单元格的覆盖
鼠标信息的处理
对于鼠标信息的处理,我们首先要确定鼠标点击到哪一格,这时可以用鼠标点击的坐标除去格子的长宽来确定所点格的坐标。
接下来,对于鼠标左键的点击,我们令被点击到的该格的值**-10**,以此实现该格的解密;而对于已经插旗的格子,左键点击将不会有任何效果。这时,还记得我们先前引入的全局变量step嘛,在这里,我们每次鼠标左键点击后,会使step的值自增一次,以记录我们的步数。而当步数为1的时候,若我们点到了炸弹,则会重新埋雷和加载地图,直到该格不为炸弹,再执行打开该格的操作。
而对于鼠标右键的点击,会使该格的值+10,代表插旗,再次右键点击相同的格子会取消该操作。
游戏胜负的判定
在开头,我们引入了全局布尔变量gamewin和gameover,当满足游戏胜利或游戏失败的条件时,我们令这些变量的值为true,以此来执行游戏结束的结算。
一点一大片功能的实现
在这里我们通过函数的递归,不断遍历值为0的格子的相邻8格,实现该功能。
主函数的内容
在主函数中,我们首先依照需求用initgraph函数绘制一个窗口,接着我们导入图像和音频以备接下来的使用。
然后,我们将上述各函数在主函数中引用。其中,当gamewin和gameover中任一变量值为true时,我们通过弹出窗口,询问玩家是否选择重新开始游戏,若否,则会退出该程序。
三、游戏的整体设计
创意部分
游戏进程的展示
根据现有的插旗数显示剩余炸弹数和不同的表情包,以展现游戏进程
背景音乐和点击音效
以上为设置播放音效的函数背景音乐的重复播放函数写在主函数中,并会在游戏结算时终止播放