本人用的Cocos2dx 2.2.3版本
第一步 明确 编写的思路
扫雷需要实现的功能
1.有3种难度
初级9*9,10个雷
中级16*16,40个雷
高级30*16,99个雷
2.有个按钮点击可以重新开始游戏
3.有个文本显示剩余的雷数
4.可以放红旗和问号,由于电脑里的扫雷是通过右键设置红旗的,但是我这游戏最后移植到手机,手机上只有触摸,没有所谓的右键,所以我这里就设置了一个画笔,
画笔 有 正常 红旗 问号 3种
5.核心功能,在一个N*M的棋盘上的随机位置放入指定数量的雷,在每个非雷位置上显示周围格子里的雷数,然后在上面覆盖一层,使点击上层的时候,显示下层的内容,点击到的是空白的区域的时候显示该格子周围全部空白的区域。
6.游戏输赢的判定。
我这里暂时就写了这些功能,额外的可以加关卡,分数,声音等功能。
第二步 开始编写代码
我这里就额外的添加了VisibleRect类(用这个类设置坐标的时候方便很多),其余的代码都是在HelloWorldScene类里编写
VisibleRect类 下载地址 http://yunpan.cn/cQ6mn5LBtSxYX (提取码:6384)
先选定屏幕的分辨率
我这里根据资源图片来
把屏幕设为了960*576
eglView->setFrameSize(960,576);
添加主背景
CCSprite *bg=CCSprite::create("bg.png");
bg->setPosition(VisibleRect::center());
this->addChild(bg);
由于游戏有3种难度,所以初始化场景的时候,要用一个参数区分是什么难度
我这里设置了一个int lv;
场景的初始化代码
void HelloWorld::gameinit(int lv)
{
switch (lv)
{
case 1:
{
width=9;//棋盘的宽度
height=9;//棋盘的高度
mine_Number=10;//地雷数
break;
}
case 2:
{
width=16;
height=16;
mine_Number=40;
break;
}
case 3:
{
width=30;
height=16;
mine_Number=99;
break;
}
default:
break;
}
temp_mine_Number=mine_Number;//设置一个值 使等于地雷数,右上角的文本里显示的就是这个值
for (int i=1;i<=height;i++)
{
for (int j=1;j<=width;j++)
{
//maze[0][i][j]等于1表示 第i行,第j列的格子显示的是1,周围有1个雷,我这里左下角的格子为第一行,第一列
//maze[0][i][j]等于2表示 第i行,第j列的格子显示的是2,周围有2个雷,我这里左下角的格子为第一行,第一列
// 。。。。。。。
//maze[0][i][j]等于9表示 还没按的图片
//10 地雷
//11 红旗
//12 问号
//0 按了后空白的格子
maze[0][i][j]=9;//使上一层都是还没按的状态 3维数组第一个参数 0表示还没按的那一层(还没按,红旗,问号层),1表示下一层(1-8数字,地雷,空白层)
maze[1][i][j]=0;
}
}
int temp=mine_Number;//这段代码 使棋盘里temp个格子设为地雷
for (;temp>=1;)
{
lie=rand()%width+1;
hang=rand()%height+1;
if (maze[1][hang][lie]!=10)
{
maze[1][hang][lie]=10;
temp--;
}
}
spLayer=CCLayer::create(); //棋盘层,格子都是添加在这个层上
spLayer->setContentSize(CCSize(width*32,height*32));
//spLayer是CCLayer类的对象,默认ignoreAnchorPointForPosition为true,要把这个值设为false,这样对其设置锚点才是有效的
spLayer->ignoreAnchorPointForPosition(false);
spLayer->setAnchorPoint(ccp(0.5,0.5));
spLayer->setPosition(VisibleRect::center()+ccp(0,-(576-16*32)/2));
this->addChild(spLayer);
for (int i=1;i<=height;i++)
{
for (int j=1;j<=width;j++)
{
if (maze[1][i][j]!=10)
{
maze[1][i][j]=getValue(i,j);//获取每个非雷格子的值
}
sp[i][j]=CCSprite::create(CCString::createWithFormat("%d.png",maze[0][i][j])->m_sString.c_str());//根据maze[0][i][j]的值绘制每个格子
sp[i][j]->setPosition(ccp(j*32-16,i*32-16));
spLayer->addChild(sp[i][j]);
}
}
}
getValue函数代码 这个函数就是通过参数i,j判断第i行,第j列这个格子的四周有几个maze[1][a][b]值等于10,也就是地雷的格子有几个
int HelloWorld::getValue(int i,int j) { int count=0; int a,b; ///////左上 a=i+1; b=j-1; if (a>=1&&a<=height&&b>=1&&b<=width) { if (maze[1][a][b]==10) { count+=1; } } ///////正上 a=i+1; b=j; if (a>=1&&a<=height&&b>=1&&b<=width) { if (maze[1][a][b]==10) { count+=1; } } ///////右上 a=i+1; b=j+1; if (a>=1&&a<=height&&b>=1&&b<=width) { if (maze[1][a][b]==10) { count+=1; } } ///////正右 a=i; b=j+1; if (a>=1&&a<=height&&b>=1&&b<=width) { if (maze[1][a][b]==10) { count+=1; } } ///////右下 a=i-1; b=j+1; if (a>=1&&a<=height&&b>=1&&b<=width) { if (maze[1][a][b]==10) { count+=1; } } ///////正下 a=i-1; b=j; if (a>=1&&a<=height&&b>=1&&b<=width) { if (maze[1][a][b]==10) { count+=1; } } ///////左下 a=i-1; b=j-1; if (a>=1&&a<=height&&b>=1&&b<=width) { if (maze[1][a][b]==10) { count+=1; } } ///////正左 a=i; b=j-1; if (a>=1&&a<=height&&b>=1&&b<=width) { if (maze[1][a][b]==10) { count+=1; } } return count; }
原文链接:https://www.f2er.com/cocos2dx/342501.html