C语言:连连看

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<time.h>
#include<math.h>
int aa[8][8]={0},b[6]={0};
void Produce()//随机产生
{
int i,j,h=1;
srand(time(NULL));
for(i=1;i<6;i++)
for(j=1;j<7;j++)
{
aa[i][j]=1+rand()%6;
b[aa[i][j]-1]++;
}
for(i=0,j=1;i<6&&j<7;i++,j++)
{
if(b[i]%2!=0)
aa[6][j]=i+1;
else
aa[6][j]=7;
}
}
void Show()//
{
int i,j,m;
system("cls");
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)//输出图
{
if(aa[i][j]==0)printf("");
if(aa[i][j]==1)printf("¤");
if(aa[i][j]==2)printf("");
if(aa[i][j]==3)printf("");
if(aa[i][j]==4)printf("");
if(aa[i][j]==5)printf("Θ");
if(aa[i][j]==6)printf("Ф");
if(aa[i][j]==7)printf("");
if(j==7)
{
printf("");
}
}
for(m=0;m<8;m++)//输出坐标
{
if(aa[i][m]==0)
printf("");
if(aa[i][m]!=0)
printf("<%d,%d>",i,m);
if(m==7)
printf("\n");
}
}
}
void Fun(int a,int b,int a1,int b1)
{
int arow[2],aline[2],brow[2],bline[2];
int start=0,end=0,m;
int i,j,n;
for(i=0;i<2;i++)
{
arow[i]=a;
brow[i]=a1;
aline[i]=b;
bline[i]=b1;
}
////////////////////////////与 a 所在行有关的列
for(i=a+1;i<10;i++)
{
if(aa[i][b]==0)
arow[1]=i;
else
break;
}
for(i=a-1;i>=0;i--)
{
if(aa[i][b]==0)
arow[0]=i;
else
break;
}
////////////////////////////与 a1 所在行有关的列
for(i=a1+1;i<10;i++)
{
if(aa[i][b1]==0)
brow[1]=i;
else
break;
}
for(i=a1-1;i>=0;i--)
{
if(aa[i][b1]==0)
brow[0]=i;
else
break;
}
////////////////////////////与 b 所在行有关的行
for(i=b+1;i<10;i++)
{
if(aa[a][i]==0)
aline[1]=i;
else
break;
}
for(i=b-1;i>=0;i--)
{
if(aa[a][i]==0)
aline[0]=i;
else
break;
}
////////////////////////////与 b1 所在行有关的行
for(i=b1+1;i<10;i++)
{
if(aa[a1][i]==0)
bline[1]=i;
else
break;
}
for(i=b1-1;i>=0;i--)
{
if(aa[a1][i]==0)
bline[0]=i;
else
break;
}

if(brow[0]>=arow[0])
start=brow[0];
else
start=arow[0];
if(brow[1]<=arow[1])
end=brow[1];
else
end=arow[1];

for(;start<=end;start++)
{
if(b<b1)
{
j=b;
i=b1;
}
else
{
j=b1;
i=b;
}
for(n=0;j<i;j++)
{
if(aa[start][j]==0)
n++;
else
break;
}
if((n==b-b1)&&(n>0))
aa[a][b]=aa[a1][b1]=0;
if((n==b1-b)&&(n>0))
aa[a][b]=aa[a1][b1]=0;
}
if(aline[0]>=bline[0])
start=aline[0];
else
start=bline[0];
if(aline[1]<bline[1])
end=aline[1];
else
end=bline[1];

for(i=start;i<=end;i++)
{
for(j=a,n=0;j<a1;j++)
{
if(aa[j][i]==0)
n++;
else
break;
}
if(n==a1-a&&n>0)
{
aa[a][b]=aa[a1][b1]=0;
break;
}
}
if(a==a1)//一条线(横坐标相同)
for(i=b;i<b1;i++)
if(abs(b-b1)==1||aa[a][i]==0)
aa[a][b]=aa[a1][b1]=0;
else
if(b==b1)//一条线(纵坐标相同)
for(i=a;i<a1;i++)
if(abs(a-a1)==1||aa[i][b]==0)
aa[a][b]=aa[a1][b1]=0;
}
void Play()//输入坐标
{
int a,b,a1,b1;
puts("\n输入坐标 格式:1 2,1 3");
scanf("%d %d,%d %d",&a,&b,&a1,&b1);
if(aa[a][b]==aa[a1][b1])
{
if(a<=a1)
Fun(a,b,a1,b1);
else
Fun(a1,b1,a,b);
}
}
void ReForm()//重排
{
int k,p,q,p2,q2,t;
srand(time(NULL));
k=40;
while(k--)//k控制随机的程度
{
p=rand()%(8-1)+1;
q=rand()%(8-1)+1;
p2=rand()%(8-1)+1;
q2=rand()%(8-1)+1;
if(q==8-1||q2==8-1||p==8-1||p2==8-1)
continue;
t=aa[p][q];
aa[p][q]=aa[p2][q2];
aa[p2][q2]=t;
}
}
int Exit() //游戏完成退出
{
int i,j;
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
if(aa[i][j]!=0)
return 1;
}
puts("You win !!!");
return 0;
}
void Menu()
{
char a;
Show();
puts("选项:");
puts(" a 输入坐标");
puts(" b 重新排列");
puts(" c 重新开始");
puts(" d 退 出");
a=getch();
switch(a)
{
case 'a'://输入坐标
Play();
break;
case 'b'://重排
ReForm();
break;
case 'c'://重新开始
Produce();
Show();
break;
case 'd'://退出
exit(1);
break;
}
}
void main()
{
Produce();
Show();
do
{
Menu();
}
while(Exit());
}

 

posted @ 2011-12-03 20:08  rui_gao  阅读(490)  评论(0编辑  收藏  举报