这儿有个“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
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)