Cocos2dx------详细介绍如何编写扫雷这个游戏含源码(一)

前端之家收集整理的这篇文章主要介绍了Cocos2dx------详细介绍如何编写扫雷这个游戏含源码(一)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

本人用的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; }

猜你在找的Cocos2d-x相关文章