最近连续两天(想的让人头昏脑涨,吐的感觉也有,想到睡觉也有。。。。。。就这样,终于突破了);(可能还有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;
}
}
}
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);
}
}
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