谁能帮忙写一个c语言连连看游戏,要4x4的,功能最简单的就可以!但是要实现连连看应该有的功能

Python014

谁能帮忙写一个c语言连连看游戏,要4x4的,功能最简单的就可以!但是要实现连连看应该有的功能,第1张

刚写的,新鲜出炉:

#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

}

这里有VC2008的SDK连连看,我哥们这几天刚写的。。。

不过已经从最早的符合你的要求复杂到使用贴图,加了声音了。

而且支持自定义地图了。。。

实在懒得改回你要的那种程度了。。。

总体来说不是很麻烦。。。

太麻烦了,要调用Windows API 。估计一天都不一定能搞定。

用MFC .net 估计都没人帮你做。

生成地图你可以将 每种图片的数量保存好 比如 苹果用 1表示 西瓜用2 表示 ,可以弄一个链表,方便删除, 生成地图时随机一个数,到链表里取出,然后在从连表里删除。

判断的话 你可以将 地图在加大一格(不显示),然后用类似寻路算法来做。

我没实践过,你可以试试。