#include<stdio.h>
#include<windows.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>
void main()
{
void sj(int z[9]);
void csh1(int zy[11][11],int z[9],int fz1[11][11]);
void csh2(int zy[11][11],int fz2[10][10],int fz1[11][11]);
void sc(int zy[11][11],int fz2[10][10],int *p);
void zx(int fz1[11][11],int fz2[10][10],int x,int y);
void cs(int zy[11][11],int fz2[10][10],int fz1[11][11],int z[9]);
int k,x,y,w;
int zy[11][11]={0};//主要 用来储存扫雷地图
int fz1[11][11]={0};//用来判断地图上是否为零
int fz2[10][10]={0};//用来判断打印*还是地图
int z[9]={0};//储存随机数
sj(z);
printf("随机数产生成功\n");
csh1(zy,z,fz1);
printf("初始化一成功\n");
csh2(zy,fz2,fz1);
printf("初始化二成功\n");
sc(zy,fz2,&w);
while(1)
{
if(w==9)//判断是否通关
{
printf("恭喜游戏通关了\n");
break;
}
printf("输入坐标:");
scanf("%d",&k);//两位数字xy
x=k/10;
y=k%10;
if(zy[y][x]==9)
{
printf("踩雷了,游戏结束。");
exit(0);
}
zx(fz1,fz2,x,y);
system("cls");//刷屏
//cs(zy,fz2,fz1,z);//测试
sc(zy,fz2,&w);
}
}
void sj(int z[9])//注意去重
{
int i,j,k;
while(1)
{
k=0;//初始化k
srand(time(NULL));//种子
for(i=0;i<9;i++)
{
z[i]=rand()%100;//随机数
if(z[i]<=10)//随机数取11-99
k+=1;
}
for(i=0;i<10;i++)
for(j=i+1;j<10;j++)
if(z[i]==z[j])//判断是否重复
k+=1;
printf("%d\n",k);//测试用
if(!k)//如果数重复或者不在范围内则重新取
break;
}
}
void csh1(int zy[11][11],int z[9],int fz1[11][11])
{
int i,j,x,y;
for(i=0;i<11;i++)
for(j=0;j<11;j++)
fz1[i][j]=1;//赋初值
for(i=0;i<9;i++)
{
x=z[i]/10;
y=z[i]%10;
zy[y-1][x-1]+=1;//地雷周围数字
zy[y][x-1]+=1;
zy[y+1][x-1]+=1;
zy[y-1][x]+=1;
zy[y+1][x]+=1;
zy[y-1][x+1]+=1;
zy[y][x+1]+=1;
zy[y+1][x+1]+=1;
fz1[y-1][x-1]=0;//地图有东西的标志
fz1[y][x-1]=0;
fz1[y+1][x-1]=0;
fz1[y-1][x]=0;
fz1[y+1][x]=0;
fz1[y-1][x+1]=0;
fz1[y][x+1]=0;
fz1[y+1][x+1]=0;
fz1[y][x]=0;
}
for(i=0;i<9;i++)
{
x=z[i]/10;
y=z[i]%10;
zy[y][x]=9;//用来判断是否触雷
printf("%d ",z[i]);//测试用
}
}
void csh2(int zy[11][11],int fz2[10][10],int fz1[11][11])
{
int i;
for(i=0;i<10;i++)
{
zy[0][i]=i;//建坐标系
fz2[0][i]=1;//让坐标系显现
fz1[0][i]=0;//建围栏
fz1[10][i]=0;//建围栏
}
for(i=0;i<10;i++)//同上
{
zy[i][0]=i;
fz2[i][0]=1;
fz1[i][0]=0;
fz1[i][10]=0;
}
}
void sc(int zy[11][11],int fz2[10][10],int *p)//主输出函数
{
int i,j,k=0;
printf(" 扫 雷 游 戏\n");
for(i=0;i<10;i++)
{
for(j=0;j<10;j++)
{
if(fz2[i][j])//通过标记判断输出什么
printf("%d ",zy[i][j]);
else
{
printf("* ");
k+=1;//计数还剩几个点没排 当点剩九个时 游戏通关
}
}
printf("\n");
}
*p=k;//返回k值
}
void zx(int fz1[11][11],int fz2[10][10],int x,int y)//清空扫雷点周围0点 地图四周建有围栏
{
int i,j;
fz2[y][x]=1;//标记扫雷点
for(i=y,j=x;fz1[i][j];i++)//右下
{
for(j=x;fz1[i][j];j++)
fz2[i][j]=1;
j=x;
}
for(i=y,j=x;fz1[i][j];i--)//右上
{
for(j=x;fz1[i][j];j++)
fz2[i][j]=1;
j=x;
}
for(i=y,j=x;fz1[i][j];i++)//左下
{
for(j=x;fz1[i][j];j--)
fz2[i][j]=1;
j=x;
}
for(i=y,j=x;fz1[i][j];i--)//左上
{
for(j=x;fz1[i][j];j--)
fz2[i][j]=1;
j=x;
}
}
void cs(int zy[11][11],int fz2[10][10],int fz1[11][11],int z[9])
{
int i,j;
for(i=0;i<11;i++)
{
for(j=0;j<11;j++)
printf("%d ",zy[i][j]);//测试zy
printf("\n");
}
printf("\n");
for(i=0;i<10;i++)
{
for(j=0;j<10;j++)
printf("%d ",fz2[i][j]);//测试fz2
printf("\n");
}
printf("\n");
for(i=0;i<11;i++)
{
for(j=0;j<11;j++)
printf("%d ",fz1[i][j]);//测试fz1
printf("\n");
}
printf("\n");
for(i=0;i<9;i++)
printf("%d ",z[i]);//测试z
printf("\n");
}