连连看游戏怎么实现图片由用户自己选择

连连看游戏怎么实现图片由用户自己选择,第1张

这儿有个“DIY连连看”

以下是说明信息:

'连连看'游戏想必许多人都玩过了,这是用Delphi写的一款模仿该游戏的免费程序。

有“练习”和“正式通关”两种难度模式,有鼠标和键盘两种 *** 作方式,自带有动听音乐。

除了有“连连看”常见的“提示”、“打散”功能,还具有快捷键隐藏窗口功能!

更有如其名的许多自定义功能,可轻松打造属于自己的连连看游戏!

键盘按键自定义:可像玩模拟器那样自定义“方向”、“选择”、“取消”按键

时间设置自定义:可设置“游戏时间触发频率”、“配错、提示、打散的扣减时间”

背景音乐自定义:除自带的几首动听.mid音乐,还可自已编辑添加音乐播放列表(支持mp3、mid、wav格式)

游戏选局设置: 可随意选关,且可设置“顺序通关”或“固定该局”

还有本游戏的最大特色,可用自己的小图片略加编辑,实现轻松添加局数,可添加至200多局

以上设置都即时生效,综合各种DIY功能,打造一款属于自己的游戏!

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

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

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

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

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

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

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

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

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

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

刚写的,新鲜出炉:

#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://outofmemory.cn/bake/11860547.html

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

发表评论

登录后才能评论

评论列表(0条)

保存