#include<stdio.h>
 #include<time.h>
 #include<stdlib.h>
 #include<windows.h>
 #include<conio.h>
 #include<string.h>
 #define SIZE 10
 #define N 35
 char mine[12][12]={{0}};
 int step=65;
 char second[2][4];



 void gotoxy(int x,int y)//坐标函数
{
     COORD pos ;
     pos.X = x ; 
     pos.Y = y ;
     SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE) , pos) ;
 }


 void color(int a)//颜色函数
{
     HANDLE hConsole = GetStdHandle((STD_OUTPUT_HANDLE)) ; 
     SetConsoleTextAttribute(hConsole,a) ;
 }

 void file_in()
 {
     FILE *fp ;
     if( (fp = fopen("D:\\最佳时间.txt" , "a+")) == NULL)
     {
         printf("文件打开失败") ;
         exit(0) ;
     }
     if( (fgets(second[0], 5, fp) ) == NULL)
     {
         second[0][0] = '9' ;
         second[0][1] = '9' ;
         second[0][2] = '9' ;
         second[0][3] = '9' ;
     }
     fclose(fp) ;
 }

 void file_out()
 {
     FILE *fp;
     if( (fp=fopen("D:\\最佳时间.txt","w"))==NULL)
     {
         printf("文件打开失败");
         exit(0);
     }
     fputs(second[1],fp);
     fclose(fp);

 }
     



 void init_mine()//初始化
{
     int count,x,y;
     srand((unsigned)time(NULL));
     for(count=0;count<N; )//设置雷区
    {
         x=rand()%10+1;
         y=rand()%10+1;
         if(!mine[y][x])
         {
             mine[y][x]=1;
             count++;
         }
     }
     gotoxy(3,0);
     for(x=1;x<=SIZE;x++)//设置行标号
    {
         color(13);
         printf("%d ",x);
     }
     for(x=1;x<=SIZE;x++)//设置列标号
    {
         gotoxy(0,x);
         printf("%d ",x);
     }
     for(y=1;y<=SIZE;y++)//初始化雷区
    {
         gotoxy(2,y);
         for(x=1;x<=SIZE;x++)
         {
             color(11);
             printf("□");
         }
     }
     
     gotoxy(45,0);//设置文字提示
    color(12);
     printf("Saolei");
     gotoxy(36,3);
     color(12);
     printf("The best time :");
     printf("%c%c%c%c second",second[0][0],second[0][1],second[0][2],second[0][3]);
     gotoxy(36,6);
     printf("The time used :0   second");
     gotoxy(36,9);
     printf("Reminding steps:65 steps");
     color(14);
     gotoxy(0,11);
     printf(" Input the position ( x , y )\n\n");
     color(11);
     printf("      Notice :when x=0 and y=0,the game is over!!!!");
     color(14);
 }

 void show_mine(int x,int y)
 {
     int num;
     if(mine[y][x])//踩雷了
    {
         color(11);
         gotoxy(x*2,y);
         printf("●");
         gotoxy(22,10);
         for(y=1;y<11;y++)
             for(x=1;x<11;x++)
             {
                 gotoxy(x*2,y);
                 if(mine[y][x])
                     printf("●");
                 else
                 {   
                     num=mine[y+1][x]+mine[y+1][x+1]+mine[y+1][x-1]+mine[y][x+1]+mine[y][x-1]+mine[y-1][x]+mine[y-1][x+1]+mine[y-1][x-1];
                     printf("%d ",num);
                 }
             }
         printf("踩中雷区阵亡,请再接再厉!!!");
         exit(0);
     }
     else//未踩雷
    {
         num=mine[y+1][x]+mine[y+1][x+1]+mine[y+1][x-1]+mine[y][x+1]+mine[y][x-1]+mine[y-1][x]+mine[y-1][x+1]+mine[y-1][x-1];
         gotoxy(x*2,y);
         printf("%d ",num);
         gotoxy(53,9);
         printf("%d",--step);
     }

 }



 main()
 {
     int t=time(NULL);
     char x,y,x1,y1;
     x1 = 'c';

     second[0][4]='\0';           //初始化数组
    second[1][4]='\0';           //初始化数组
    file_in();                   //载入“最佳时间.txt”
    
     init_mine();                 ////初始化游戏界面,埋雷,初始化显示等
    gotoxy(23,11);              //移动光标到坐标23,21
     for(x=0,y=0;x1 !=0||y1 !=0;)
     {
         Sleep(1000);           //延时
        if(kbhit())//输入坐标
        {
             gotoxy(23,11);
             scanf("%d",&x1);
             gotoxy(27,11);
             scanf("%d",&y1);
             gotoxy(23,11);
             printf("(x , y )    ");
         }
         gotoxy(52,6);//设置所用时间
        printf("%d",time(NULL)-t);
         if(x1 >0 && x1 <11 && y1>0 && y1<11&&( x!=x1 || y!=y1))
         {
             y=y1;
             x=x1;
             show_mine(x,y);                          //检测有没有踩雷,如果踩雷显示雷,如果没有,显示周围雷的个数
        }
         
         if(!step)
         {
             gotoxy(10,5);
             printf("真棒!!您赢了!!");
             second[1][0]=(time(NULL)-t)/1000+48;
             second[1][1]=(time(NULL)-t)/100%10+48;
             second[1][2]=(time(NULL)-t)/10%10+48;
             second[1][3]=(time(NULL)-t)%10+48;
         if(strcmp(second[0],second[1])>0)             //检查有没有打破纪录
            {
                 printf("并且成功打破记录");
                 file_out();
             }
         exit(0);
         }
     }
 exit(0);
 }