cocos2d-x苦思冥想连连看


      那天被问到,连连看设计,大脑一片空白:而我口里只会说着大二写过,现在想想,那个时候写(只能是练练打字的速度而已,其原理根本不明白怎么回事),

最近连续两天(想的让人头昏脑涨,吐的感觉也有,想到睡觉也有。。。。。。就这样,终于突破了);(可能还有bug

    1、 首先你要明白,连连看的共有多少个元素把,5*5? 你觉得能全部消除?no;我这里是 8*8 ,数组的大小是a[10][10] 刚开始我是弄的一维数组,一维数组弄了一段时间麻烦,放弃,原因是边界不好控制(一维数组必须行)

最终是二维数组:首先要随机生成先把a[1][1]----------a[8][8]的元素全部生成好:什么a[0][0]..a[0][2]....a[9][2]].a[9][9]..只要与0和9相关联的下标,数组中的值都默认为0;

其他都不为0:

int (*p)[10]=a;
    int i=-1;
    while (++i<32)
    {
        //随机生成数值[1,6]
        int digit=arc4random()%6+1;
        int j=-1;
        while (++j<2)
        {
            int row_=arc4random()%8+1;
            
            int col_=arc4random()%8+1;
            //默认设置为0说明此处位置没有被设置,则占用这个位置
           // if (a[row_][col_] ==0)
            if (*(*(p+row_)+col_) == 0)
            {
               *(*(p+row_)+col_)=digit;
            }else{
                //这里存在数字,重新找其他地方没有被设置的
                --j;
            }
        }
    }
2、添加到层中:

for (int i=1; i<=8; ++i)
    {
        for (int j=1; j<=8; ++j)
        {
            CCString *string=CCString::createWithFormat("rocket_%i.png",a[i][j]);
        
            CCMenuItemSprite *sp=CCMenuItemSprite::create(CCSprite::createWithSpriteFrameName(string->getCString()),CCSprite::createWithSpriteFrameName(string->getCString()),this,menu_selector(HelloWorld::setSelectedImage));
            
             CCMenu *menu=CCMenu::create(sp,NULL);
            menu->setScale(0.5);
            menu->setAnchorPoint(CCPointZero);
            /*
             在手机上看到应该是这样的坐标
             a[1][1],a[1][2]......a[1][8]
             a[2][1]..............a[2][8]
              ...
             a[8][1]..............a[8][8]
             */
            menu->setPosition(CCPointMake(j*32+100, 288-i*32));
          this->addChild(menu,1);
        }
    }


3、判断用户点击的图片是否符合要求:

void HelloWorld::setSelectedImage(CCNode *sender)
{
    
    //获取父亲节点的位置,
    CCPoint location=sender->getParent()->getPosition();
     
    iterator_1=list_back.begin();
    //1、防止用户重复的按某个键,(不管你重复点击多少次我只当一次处理ok),不加入到链表中,则直接换回
    //2、当点击两个键(这里两个键肯定不相同,相同已经删除了,或者不符合删除要求)之后,用户不能再次点击其中之一,直接换回
     int i=-1;
    while (++i
   
   
    
    getPositionX(),node->getPositionY());
//         CCLog("location.x:%f,location.y:%f",location.x ,location.y);
        //这里主要判断是否连续点击同一个图片,即同一个位置则无效点击,直接换回
        if (location.equals(node->getPosition()))
        {
            CCLog("无效点击[setSelectedImage(CCNode *sender)]");
            return ;
        }
    }
    CCSprite *sp=CCSprite::create("jump_1.png");
    sp->setPosition(location);
    this->addChild(sp,0);
    list_node.push_back(sender);
    list_back.push_back(sp);
    //如果链表中的个数为2,那么对其进行判断是否连接
    if (list_back.size() ==2)
    {
        //主要是用来判断两个索引在数组中的值是否相等
        isEqual();
    }
    if (list_back.size() >2)
    {
        CCNode *sp=list_back.front();
        //删除第一个背景图片
        sp->removeFromParent();
        //弹出节点链表第第一
        list_back.pop_front();
        //弹出节点链表中第一个
        list_node.pop_front();
        
        //此时,两个链表中含都分别含有两个元素
        isEqual();
        
    }
  //  CCLog("selectedImage~|||||||||||>>>>>>>>>>>>:%f,%f",location.x,location.y);
   
}
void  HelloWorld::isEqual()
{
    iterator_2=list_back.begin();
    
    iterator_1=list_node.begin();
    //判断两个图片是否为同一类型的图片
    //首先获取被点击图片的下标位置,在判断两个值是否相等,相等则进行删除
    CCNode *node_1=*iterator_1;
    CCNode *node_2=*++iterator_1;
    //首先获取当前第一个菜单的位置
    CCPoint location_1=node_1->getParent()->getPosition();
    //获取当前第二个菜单的位置
    CCPoint location_2=node_2->getParent()->getPosition();
    
//    //找出第一个点在数组中的下标 8代表的是8*8的连连看,
//    int index_1=8*(location_1.x-100)/32+(location_1.y-32)/32;
//    //
//    int index_2=8*(location_2.x-100)/32+(location_2.y-32)/32;
    //重量级主要是判断两个图片是否为同一种;
  
//    int row2=(location_2.x-100)/32;
//    int col2=location_2.y/32;
    int row1=fabs(location_1.y-288)/32;
    int col1=(location_1.x-100)/32;
    int row2=fabs(location_2.y-288)/32;
    int col2=(location_2.x-100)/32;
    if (a[row1][col1] == a[row2][col2])
    {
        //CCLog("a[index_1] == a[index_2] 删除");
        //判断是够满足消除的条件
        if (check(row1,col1,row2,col2))
        {
            removeNode(node_1,node_2,*iterator_2++,*iterator_2);
        }
    }
}

   
   

4、重量级代码:

 如果只有这条线路能够通;我的理解为i =2这条竖线扫描成功!

//水平方向是判断,是否畅通,const r主要是限制在水平方向上不变,列可以变
bool HelloWorld::isHorizon(int c1,int c2,int const r)
{
   //将两个数字进行交换
    if (c1>c2)
    {
        c1^=c2^=c1^=c2;
    }
    for (int i=c1+1; i
   
   
    
    r2)
    {
        // r1= r1+r2,r2= r1-r2, r1= r1-r2;
        r1^=r2^=r1^=r2;
    }
    for (int i=r1+1; i
    
    
   
   

源代码下载:http://download.csdn.net/detail/aimsgmiss/7205623


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值