用c语言做连连看其中方案图块的链接判断,具体如何实现?

用c语言做连连看其中方案图块的链接判断,具体如何实现?,第1张

连扮配连看游戏中,需要实现方案图块的链接判断,即两个方块是否可以通过一定的路径相连。

在C语言中,可以使用二维数组表示连连看游戏界面,每个数组元素表示一个方块。为了方便判断方块之间的链接关系,可以给每个方块添加一个编号或者标记。

在实现方块链接判断时,可以采用广度优先搜索(BFS)算法。具体实现过程如下:

首先选中两个方块,假设它们的编号分别为a和b。

以方块a为起点,使用BFS算法搜索所有与a相连的方块,并将其标记为已访问。

如果在上一步中发现了方块b,则表示a和b可以通过一定的路径相连。

如果没有找到方块b,就选取一个与a相连的未访问方块,重复上述步骤,直到找到方块b或者搜索完所有与a相连的方块。

在具体实现中,可以使用一个队列来存储待访问的方块,用一个数组来记录每个方块是否已经访问过,以避免重复访问。

需要注意的是,在搜索相邻方块时,需要判断两个方块之间是否有障碍物,即是否存在无法通过的路径。可以通过检查路径上的所有方块,是否都是空闲状态,来判断是否存在障碍物。

另外,在实现连连看厅枝指游戏时,还需要考虑方块搭郑消除的逻辑、分数计算等问题。

第一个:

bool isClear(int row1,int col1,int row2,int col2)

{

int row,col

for(row=1row<=ROWrow++)

if( check_point(row,col1) &&check_point(row,col2) )

if( check_col(col1,row1,row) &&check_row(row,col1,col2)

&&check_col(col2,row2,row) )

return true

for( col=1col<COLcol++)

if( check_point(row1,col) &&check_point(row2,col) )

if( check_row(row1,col1,col) &&check_col(col,row1,row2)

&&check_row(row2,col2,col) )

return true

return false

}

第二个型尘弯:回溯算法

bool ClearAll()

{

int row1,col1,row2,col2

for( row1=1row1<ROWrow1++)

for( col1=1col1<COLcol1++)

if( A[row1][co1]!=0 )

for( row2=row1row2<ROWrow2++)

for( col2=1col2<COLcol2++)

if(row2>row1 || col2>col1)

if( A[row2][col2]==A[row1][col1]

&&isClear(row1,col1,row2,col2) )

{

SaveWay()

Delete(row1,col1,row2,col2)

if( ClearAll() )

return true

else

Load()

}

return false

}

第三兄行个:卜闷改写下Delete/Load函数就可以了,我就不贴出来了

=================================================

含有很多简单的函数没写,不懂再问我吧

刚写的,新鲜出炉:

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#include <time.h>

#define MAPSIZE 4

#define MAXLINESIZE 60

//typedef enum{false,true} bool

typedef struct{

    int x,y

}Point

const char pictureTable[]={" ABCEDFGHI"}

bool judgeLine(char **MP,Point *start,Point *end){

int i

if(start->x==end->x){

if(start->y > end->y){

for(i = start->y - 1  i > end->y  i--)

if(MP[start->x][i]!=0) 

return false

return true

}

else{

for(i = start->y + 1  i < end->y  i++)

if(MP[start->x][i]!=0)

return false

return true

}

}

else if(start->y==end->y){

if(start->x > end->x ){

for(i = start->x - 1  i > end->x  i--)

if(MP[i][start->y]!=0) 

return false

return true

}

else{

for(i = start->x + 1  i < end->x  i++)

if(MP[i][start->y]!=0) 

return false

return true

}

}

return false

}

bool judgeTwoLines(char **MP,Point *start,Point *end,Point 冲猜洞*mid){

    Point p1,p2

    mid->x=-1

    mid->y=-1

    if(judgeLine(MP,start,end)==true) return true

    p1.x=start->x

    p1.y=end->y

    p2.x=end->x

    p2.y=start->y

    mid->x=p1.x

    mid->y=p1.y

    if(MP[p1.x][p1.y]==0 && judgeLine(MP,start,&p1) && judgeLine(MP,end,&p1)) return true

    mid->x=p2.x

    mid->y=p2.y

    if(MP[p2.x][p2.y]==0 && judgeLine(MP,start,&p2) && judgeLine(MP,end,&p2)) 散枯return true

    return false

}

bool judgeTreeLines(char **MP,Point *start,Point *end,Point *mid1,Point *mid2,int n){

    int i

    mid1->x=-1mid1->y=-1

    mid2->x=-1mid2->y=-1

    if(judgeTwoLines(MP,start,end,mid1)) return true

    for( i=start->x - 1i>=0i--){

     if(MP[i][start->y]!=0) 兆铅break

     mid1->x=i

     mid1->y=start->y

     if(judgeTwoLines(MP,mid1,end,mid2)) return true

    }

    for( i=start->x + 1i<=n+1i++){

     if(MP[i][start->y]!=0) break

     mid1->x=i

     mid1->y=start->y

     if(judgeTwoLines(MP,mid1,end,mid2)) return true

    }

    for( i=start->y - 1i>=0i--){

     if(MP[start->x][i]!=0) break

     mid1->x=start->x

     mid1->y=i

     if(judgeTwoLines(MP,mid1,end,mid2)) return true

    }

    for( i=start->y + 1i<=n+1i++){

     if(MP[start->x][i]!=0) break

     mid1->x=start->x

     mid1->y=i

     if(judgeTwoLines(MP,mid1,end,mid2)) return true

    }

    return false

}

void ptMap(char **MP,int n){

    int space=(MAXLINESIZE-n*2)/2

    int i,j

    for(i=0i<(MAXLINESIZE-10)/2i++)

     printf(" ")

    printf("《连连看》\n")

    for(i=2i<spacei++) printf(" ")

    printf("x\n")

    for(i=1i<=ni++){

     for(j=2j<spacej++)

     printf(" ")

     printf("%d ",i)

     for(j=1j<=nj++)

     printf("%c ",pictureTable[MP[i][j]])

     printf("\n")

    }

    for(i=0i<spacei++)

     printf("*")

    for(i=0i<ni++)

     printf("%d*",i+1)

for(i=1i<spacei++)

     printf("*")

    printf("\n")

}

char **createMap(int n){

    char **ret

    int i

    ret=(char**)malloc(sizeof(char*)*(n+2))

    for(i=0i<n+2i++)

     ret[i]=(char*)malloc(sizeof(char)*(n+2))

    return ret

}

void ranMap(char **MP,int n){

    int *all=(int*)malloc(sizeof(int)*n*n)

    int i,tmpi,tmp

    for(i=0i<n*ni++)

     all[i]=i/4+1

    for(i=0i<n*ni++){

     tmpi=rand()%(n*n-i)

     tmp=all[tmpi]

     all[tmpi]=all[n*n-i-1]

     all[n*n-i-1]=tmp

    }

    for(i=0i<n+2i++){

     MP[0][i]=0

     MP[n+1][i]=0

     MP[i][0]=0

     MP[i][n+1]=0

    }

    tmpi=0

    for(i=1i<=ni++)

     for(tmp=1tmp<=ntmp++)

     MP[i][tmp]=all[tmpi++]

}

void deletePoints(char **MP,Point *p1,Point *p2){

    MP[p1->x][p1->y]=0

    MP[p2->x][p2->y]=0

}

int playTurns(int n){

int rest=n*n

char **mp=createMap(n),c

ranMap(mp,n)

Point mid1,mid2,pt1,pt2

while(1){

ptMap(mp,n)

printf("请输入消去的坐标1(x1 y1):\n")

scanf("%d%d",&pt1.x,&pt1.y)

printf("请输入消去的坐标2(x2 y2):\n")

scanf("%d%d",&pt2.x,&pt2.y)

if((pt1.x==pt2.x && pt1.y==pt2.y) || (pt1.x<1 || pt1.x>n || pt2.x < 1 || pt2.x > n || pt1.y<1 || pt1.y>n || pt2.y < 1 || pt2.y > n)){

printf("无法消除这两图案,请再次检查。")

}

    else if(mp[pt1.x][pt1.y]!=0 && mp[pt1.x][pt1.y]==mp[pt2.x][pt2.y] && judgeTreeLines(mp,&pt1,&pt2,&mid1,&mid2,n)){

     if(mid1.x==-1){

     printf("Direct\n")

     }

     else if(mid2.x==-1){

     printf("TwoLines :(%d,%d)\n",mid1.x,mid1.y)

     }

     else{

     printf("TreeLines:(%d,%d)(%d,%d)\n",mid1.x,mid1.y,mid2.x,mid2.y)

     }

     deletePoints(mp,&pt1,&pt2)

     printf("消去成功!\n")

     rest-=2

     if(rest==0){

     printf("恭喜!你已消去所有图案!\n")

     break

     }

    }

    else{

     printf("无法消除这两图案,请再次检查。")

    }

    printf("继续游戏(N/n不继续)?")

    scanf(" %c",&c)

    if(c=='N' || c=='n') break

}

printf("是否重新开局(Y/y继续)?")

scanf(" %c",&c)

if(c=='y' || c=='Y') return 1

return 0

}

int main(){

    srand(time(0))

    while(playTurns(4))

    return 0

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/yw/12363077.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存