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

本文介绍使用Cocos2dx 2.2.3版本开发扫雷游戏的过程,包括实现不同难度等级、重新开始功能、显示剩余雷数等,并详细解释了核心功能的实现方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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












评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值