#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 10
#define L 10
//打印随机雷的位置,测试代码方便看雷
void sl_print(constint a[L])
{
int i=0;
printf("地雷的随机位置为:");
for(i=0;i<L;i++)
{
printf("%02d ",a[i]);
}
printf("\n");
}
//绘制扫雷棋盘函数
void sl_show(constchar a[][N])
{
int i=0,j=0;
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
printf("%c ",a[i][j]);
}
printf("\n");
}
}
int main()
{
int LEI[L]={0};
int m=0,n=0,tmp=0,x=0,y=0;;
int i=0,j=0,num=0;
char k=‘\0‘;
char GAME[N][N]={0};
//time_t t;
//srand((unsigned)time(&t));
printf("玩法说明:///选择格子用#,标记雷用!,数字表示格子周围地雷的数量///\n");
srand((unsigned)time(NULL));
//对二维数组进行初始化
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
GAME[i][j]=‘-‘;
}
}
//产生L个雷,并用数组记录它们在二维数组中的位置
for(i=0;i<L;i++)
{
//LEI[i]=rand()%N*10+rand()%N;
LEI[i]=rand()%100;
//查看产生的雷的位置是否有重复
if(i>0)
{
for(j=0;j<i;j++)
{
while(LEI[i]==LEI[j])
{
//LEI[i]=rand()%N*10+rand()%N;
LEI[i]=rand()%100;
}
}
}
}
sl_print(LEI);
printf("打印游戏初始状态:\n");
sl_show(GAME);
//游戏主循环
while(1)
{
printf("请输入格子的坐标及标注方式(例如1 3或者1 3回车):");
scanf("%d%d",&m,&n);
setbuf(stdin,NULL);
printf("请输入操作方式#或者!:");
scanf("%c",&k);
//对选的格子周围的地雷的计数器进行清0
tmp=0;
//您输入的字符,测试代码
printf("您输入的操作行为是:%d%d%c\n",m,n,k);
if(k==‘#‘)
{
for(i=0;i<L;i++)
{
if(LEI[i]==m*10+n)
{
//游戏失败
printf("\nGAME OVER!YOU LOST!\n\n");
//把最后的结果中地雷用*标识出来
for(j=0;j<L;j++)
{
m=LEI[j]/10%10;
n=LEI[j]%10;
GAME[m][n]=‘*‘;
}
printf("扫雷棋盘的实际情况是:\n");
sl_show(GAME);
sl_print(LEI);
return0;
}
}
}
//计算选择的格子周围有多少雷,棋盘中间的部分
if(m<=N-2 && m>=1 && n<=N-2
&& n>=1)
{
for(i=0;i<L;i++)
{
for(x=m-1;x<=m+1;x++)
{
for(y=n-1;y<=n+1;y++)
{
if(x==m && y==n)
{
continue;
}
if(LEI[i]==x*10+y)
{
tmp++;
}
}
}
}
//这里把单个数字转换为字符
GAME[m][n]=tmp+‘0‘;
//棋盘的四条边
}elseif(m==0 && n!=0
&& n!=N-1)
{
for(i=0;i<L;i++)
{
for(x=m;x<=m+1;x++)
{
for(y=n-1;y<=n+1;y++)
{
if(x==m && y==n)
{
continue;
}
if(LEI[i]==x*10+y)
{
tmp++;
}
}
}
}
GAME[m][n]=tmp+‘0‘;
}elseif(m==N-1 && n!=0
&& n!=N-1)
{
for(i=0;i<L;i++)
{
for(x=m-1;x<=m;x++)
{
for(y=n-1;y<=n+1;y++)
{
if(x==m && y==n)
{
continue;
}
if(LEI[i]==x*10+y)
{
tmp++;
}
}
}
}
GAME[m][n]=tmp+‘0‘;
}elseif(n==0 && m!=0
&& m!=N-1)
{
for(i=0;i<L;i++)
{
for(x=m-1;x<=m+1;x++)
{
for(y=n;y<=n+1;y++)
{
if(x==m && y==n)
{
continue;
}
if(LEI[i]==x*10+y)
{
tmp++;
}
}
}
}
GAME[m][n]=tmp+‘0‘;
}elseif(n==N-1 && m!=0
&& m!=N-1)
{
for(i=0;i<L;i++)
{
for(x=m-1;x<=m+1;x++)
{
for(y=n-1;y<=n;y++)
{
if(x==m && y==n)
{
continue;
}
if(LEI[i]==x*10+y)
{
tmp++;
}
}
}
}
GAME[m][n]=tmp+‘0‘;
//棋盘的四个角
}elseif(m==0 && n==0)
{
for(i=0;i<L;i++)
{
for(x=m;x<=m+1;x++)
{
for(y=n;y<=n+1;y++)
{
if(x==m && y==n)
{
continue;
}
if(LEI[i]==x*10+y)
{
tmp++;
}
}
}
}
GAME[m][n]=tmp+‘0‘;
}elseif(m==N-1 && n==0)
{
for(i=0;i<L;i++)
{
for(x=m-1;x<=m;x++)
{
for(y=n;y<=n+1;y++)
{
if(x==m && y==n)
{
continue;
}
if(LEI[i]==x*10+y)
{
tmp++;
}
}
}
}
GAME[m][n]=tmp+‘0‘;
}elseif(m==N-1 && n==N-1)
{
for(i=0;i<L;i++)
{
for(x=m-1;x<=m;x++)
{
for(y=n-1;y<=n;y++)
{
if(x==m && y==n)
{
continue;
}
if(LEI[i]==x*10+y)
{
tmp++;
}
}
}
}
GAME[m][n]=tmp+‘0‘;
}elseif(m==0 && n==N-1)
{
for(i=0;i<L;i++)
{
for(x=m;x<=m+1;x++)
{
for(y=n-1;y<=n;y++)
{
if(x==m && y==n)
{
continue;
}
if(LEI[i]==x*10+y)
{
tmp++;
}
}
}
}
GAME[m][n]=tmp+‘0‘;
}
//当无雷时则显示用户标识的#或者!
if(tmp==0)
{
GAME[m][n]=k;
//这下边写扩展代码
}
//如果用户标识雷的位置确实是雷则进行一次计算,当计算达到L时则胜利
if(k==‘!‘)
{
for(i=0;i<L;i++)
{
if(LEI[i]==m*10+y)
{
num++;
}
}
}
if(num==L)
{
printf("\nYOU WIN!\n\n");
return1;
}
sl_show(GAME);
}
}
版权声明:本文为博主原创文章,未经博主允许不得转载。