初级界面是:横竖各九格,共十颗雷
游戏中如何产生地雷?
以初级扫雷作为讲解实例:
编程中采用的是二维数组来代表整个雷区,如A[9][9],横竖各九格也就是八十一格。初级是十颗雷。现在来看布雷的代码:
voidCMin eWnd::LayMines(UINTrow, UINT col) //布雷函数
{
//埋下随机种子
srand( (unsigned)time( NULL )) ; //调用该方法产生随机数的种子
UINT i, j; //定义两个UINT(由unsignedint派生)型变量
for(UINT index = 0; index//使用For循环来产生地雷
{ //其中index为已产生雷数,m_uMineNum为游戏设定雷数,初级是十颗,一般根据游戏难度来确定
//取随机数
i = rand() %m_uYNum;//地雷所在的行系数(使用产生的随机数对雷区大小进行取模运算,初级的是对9取模)
j = rand() %m_uXNum;//地雷所在的列系数(使用产生的随机数对雷区大小进行取模运算,初级的是对9取模)
if (i == row && j ==col)continue;//坐标(j,i)即为产生地雷的坐标,如果i、j等于最大行,最大列时则进行下一轮循环(这里限定最右下角的那格里不布雷,我不明白为什么,可能是游戏的规定?但我试了一下,发现在右下角的那格里面好像始终没有雷,当然是在我试玩的几次游戏中)
if(m_pMines[i][j].uAttrib!=ATTRIB_MINE)
{//如果在雷区数组m_pMines[9][9]中的元素m_pMines[i][j]的属性不是地雷,那么将其属性修改为地雷
m_pMines[i][j].uAttrib=ATTRIB_MINE;//修改属性为地雷
index++;//在已经产生的地雷数index上加一
}//循环结束,布雷数也刚好达到所设定的个数
}//通过该函数可完成布雷,实现游戏布雷的初始化
仔细看看代码想想,发现前面讲的有点问题,后来我所说的那个右下角不布雷的问题,被推翻了,才发现其实是我自己理解错了。
其实就这个也解释了,为什么对于玩家在第一次点击时,永远不会选到地雷,对于函数参数(UINTrow, UINTcol)其中的row和col是玩家点击的坐标位置,也就是该布雷函数已确定,不会在玩家第一次点击的位置布雷,所以该函数在程序中调用的位置应该是在玩家游戏开始第一次点击小格的时候调用!也就是玩家第一次点击结束,游戏布雷完成!这样可以避免玩家在第一次点击的时候就选中地雷。若在游戏中玩家选择游戏开始就已布好了地雷,这样很容易造成玩家在第一次选中地雷,从而削弱了玩家对游戏的好感度,降低了玩家对游戏的兴趣!
扫雷游戏的布雷讲解到此结束,对扫雷有兴趣的朋友可继续研究,后续问题再讨论!