刚写的,新鲜出炉:
#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 表示 ,可以弄一个链表,方便删除, 生成地图时随机一个数,到链表里取出,然后在从连表里删除。
判断的话 你可以将 地图在加大一格(不显示),然后用类似寻路算法来做。
我没实践过,你可以试试。