方块总动员消图算法(Objective-c)
之前贴过一个连连看两图连通的检测算法,今天再贴一个方块总动员消图算法,坐标系如下图:

方块总动员玩法很简单,点到同类型方块的十字交叉点便可消除,这里我用Objective-c实现了一个,由于之前连连看,我没有把游戏的初始化代码贴出来,其实这两者初始化有点类似我就在这里加上,代码如下:
//检测到触摸的精灵(精灵状态为BLANK_STATE)-(void) touchSprite:(int)tag{ CCLOG(@"tag:%i value:%i",tag,m_map[tag]); [self scan:tag]; [self checkT];}-(void) scan:(int) tag{ int x=tag/m_nCol;//获取触摸行 int y=tag%m_nCol;//获取触摸列 int i=0; //上 for (i=x+1; i<m_nRow; i++) { if (m_map[i*m_nCol+y]!=BLANK_STATE) { //找到上点 pathArr[p_up]=m_map[i*m_nCol+y];//图片类别 position[p_up]=i*m_nCol+y;//在m_map中的坐标 break; } } //没有找着上点 if (i==m_nRow) { pathArr[p_up]=BLANK_STATE; position[p_up]=BLANK_STATE; } //下 for (i=x-1; i>=0; i--) { if (m_map[i*m_nCol+y]!=BLANK_STATE) { //找到下点 pathArr[p_down]=m_map[i*m_nCol+y]; position[p_down]=i*m_nCol+y; break; } } //没有找着下点 if (i==-1) { pathArr[p_down]=BLANK_STATE; position[p_down]=BLANK_STATE; } //左 for (i=y-1; i>=0; i--) { if (m_map[x*m_nCol+i]!=BLANK_STATE) { //找到左点 pathArr[p_left]=m_map[x*m_nCol+i]; position[p_left]=x*m_nCol+i; break; } } //没有找着左点 if (i==-1) { pathArr[p_left]=BLANK_STATE; position[p_left]=BLANK_STATE; } //右 for (i=y+1; i<m_nCol; i++) { if (m_map[x*m_nCol+i]!=BLANK_STATE) { //找到右点 pathArr[p_right]=m_map[x*m_nCol+i]; position[p_right]=x*m_nCol+i; break; } } //没有找着右点 if (i==m_nCol) { pathArr[p_right]=BLANK_STATE; position[p_right]=BLANK_STATE; } /* for (i=0; i<4; i++) { CCLOG(@"pathArr[%i]:%i",i,pathArr[i]); CCLOG(@"position[%i]:%i",i,position[i]); } */}-(void) checkT{ int i; int j; for (i=0; i<4; i++) { queneT[q_count]=0; if (pathArr[i]==BLANK_STATE) { //跳过空白或者已经被移除 continue; } else { for (j=i+1; j<4; j++) { if (pathArr[i]==pathArr[j]) { queneT[q_count]++; queneT[queneT[q_count]]=position[j]; pathArr[j]=BLANK_STATE; } } if (queneT[q_count]>0) { //移除 queneT[q_count]++; queneT[queneT[q_count]]=position[i]; pathArr[i]=BLANK_STATE; //移除 [self toHidePiece]; } } }}//隐藏消去的精灵-(void) toHidePiece{ //int j=queneT[q_count]; for (int i=1; i<=queneT[q_count]; i++) { Piece *p1=(Piece*)[self getChildByTag:queneT[i]]; //隐藏图片 [p1 setVisible:NO]; p1.Status=0; m_map[queneT[i]]=BLANK_STATE; } queneT[q_count]=0;}以上代码肯定有不足之处,欢迎拍砖交流!