连扮配连看游戏中,需要实现方案图块的链接判断,即两个方块是否可以通过一定的路径相连。
在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
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)