欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

基于C語言實現(xiàn)的掃雷游戲代碼

 更新時間:2014年08月01日 10:27:21   投稿:shichen2014  
這篇文章主要介紹了基于C語言實現(xiàn)的掃雷游戲代碼,對于學(xué)習(xí)游戲開發(fā)的朋友有一定的借鑒價值,需要的朋友可以參考下

本文詳細(xì)講述了基于C語言實現(xiàn)的掃雷游戲代碼,代碼中備有比較詳細(xì)的注釋,便于讀者閱讀和理解。希望對學(xué)習(xí)游戲開發(fā)的朋友能有一點借鑒價值。

完整的實例代碼如下:

/*
模擬掃雷游戲 
*/
#include <graphics.h>
#include <math.h>
#include <stdio.h>
#include <dos.h>
#include <stdlib.h>
#include <conio.h>
#include <alloc.h>

union REGS regs;
int size=15;/*用于表示每個方塊的大小(正方形的邊長)*/
int pix,piy=50;/*pix,piy是矩陣的偏移量*/
char b[2]="1";/*用于顯示方格周圍的雷的個數(shù)*/
int pan[30][16];/*用于記錄盤面的情況:0:沒有、9:有雷、1~8:周圍雷的個數(shù)*/
int pan1[30][16];/*pan1[][]紀(jì)錄當(dāng)前的挖雷情況,0:沒有操作、1:打開了、2:標(biāo)記了*/
int tt;/*紀(jì)錄時間參數(shù)*/
int Eflags;/*用于標(biāo)記鼠標(biāo)按鈕的有效性,0:有效,1:無效,2:這是鼠標(biāo)的任意鍵等于重新開始*/

int Msinit();
void Draw(int x,int y,int sizex,int sizey);
void Facedraw(int x,int y,int sizel,int k);
void Dead(int sizel,int x,int y);
void Setmouse(int xmax,int ymax,int x,int y);
int Msread(int *xp,int *yp,int *bup,struct time t1,int k);
void Draw1(int x,int y);
int Open(int x,int y);
float Random();
void Have(int sum,int x,int y,int xx,int yy);
void Help();
void Coread();
void Ddraw2(int x,int y);


/*下面是主函數(shù)*/
main()
{
 int mode=VGAHI,devices=VGA;/*圖形模式初始化的變量*/
 char ams;         /*鼠標(biāo)操作中的標(biāo)志變量*/
 int xms,yms,bms;      /*鼠標(biāo)的狀態(tài)變量*/
 int i,j,k,k1=0;      /*i,j,k是循環(huán)變量*/
 int x=9,y=9,flags=0;    /*x,y矩陣的大小*/
 int sum=10;        /*sum 盤面的雷的總數(shù)目,是個x,y的函數(shù)*/
 int x1=0,y1=0;       /*用于記錄光標(biāo)當(dāng)前的位置*/
 int x11=0,y11=0;      /*暫時保存鼠標(biāo)位置的值*/
 int sizel=10;       /*臉的大小*/
 int cflags=1;   /*這是菜單操作標(biāo)志變量,沒有彈出1,彈出0*/
 struct time t1={0,0,0,0}; /*時間結(jié)構(gòu)體,頭文件已定義*/
 int co[3];   /*暫時紀(jì)錄歷史紀(jì)錄*/
 void far *Map;   /*用于保存鼠標(biāo)圖片*/
 char name[3][20];   /*名字字符串,用于記錄名字*/
 FILE * p;   /*文件指針用于文件操作*/

 Msinit();               /*鼠標(biāo)初始化*/
 /*registerbgidriver(EGAVGA_driver);*/
 initgraph(&devices,&mode,"C:\\tc");   /*圖形模式初始化*/

/*為圖片指針分配內(nèi)存*/
if((Map=farmalloc(imagesize(0,0,20,20)))==NULL)/*圖片的大小是20*20*/
 {
 printf("Memory ererr!\n");
 printf("Press any key to out!\n");
 exit(1);
 }

 /*用于檢驗文件是否完整*/
 while((p = fopen("score.dat", "r")) == NULL) /*如果不能打開就新建一個*/
  {
 if((p = fopen("score.dat", "w")) == NULL)/*如果不能新建就提示錯誤并推出*/
 {
  printf("The file cannot open!\n");
  printf("Presss any key to exit!\n");
  getch();
    exit(1);
 }
 /*寫入初始內(nèi)容*/
 fprintf(p,"%d %d %d,%s\n%s\n%s\n",999,999,999,"xiajia","xiajia","xiajia");
 fclose(p); 
 }
 /*暫時讀出歷史紀(jì)錄。并用co[3]紀(jì)錄*/
 fscanf(p,"%d %d %d,",&co[0],&co[1],&co[2]);
 for(i=0;i<3;i++)
 fscanf(p,"%s\n",name[i]);
 fclose(p);

 Setmouse(1,1,615,460); /*設(shè)置鼠標(biāo)的活動范圍*/
 pix=250-x*size/2; /*計算地雷按鈕矩陣的左邊*/

bss:  b[0]='1';    /*游戲開始和重來的切入點*/
    flags=0; /*測試中這個變量好像沒有作用,但是為了邏輯的完整性暫時保留*/
    k=0;
 Eflags=0;
 tt=0;
 cleardevice();/*清屏*/
 setbkcolor(LIGHTCYAN);
    for(i=0;i<30;i++)    /*盤面初始化*/
    for(j=0;j<16;j++)
    {
 pan[i][j]=0;
     pan1[i][j]=0;
 }

 for(;;) /*用于生成雷的盤面情況*/
  {
 i=(int)(x*Random());
   j=(int)(y*Random());
   if(pan[i][j]==0)
     {
  pan[i][j]=9;
  k=k+1;
     }
   if(k==sum) break;
  } 

for(i=0;i<x;i++)/*用于統(tǒng)計各點的周邊情況*/
for(j=0;j<y;j++)
 {
 if(pan[i][j]==0)/*只有沒有雷的才需要處理*/
  {
   if(i-1>=0 && j-1>=0 && pan[i-1][j-1]==9) pan[i][j]++;
  if(j-1>=0 && pan[i][j-1]==9)   pan[i][j]++;
  if(i+1<x && j-1>=0 && pan[i+1][j-1]==9) pan[i][j]++;
  if(i-1>=0 && pan[i-1][j]==9)   pan[i][j]++;
  if(i+1<x && pan[i+1][j]==9)   pan[i][j]++;
  if(i-1>=0 && j+1<y && pan[i-1][j+1]==9) pan[i][j]++;
  if(j+1<y && pan[i][j+1]==9)   pan[i][j]++;
  if(i+1<x && j+1<y && pan[i+1][j+1]==9)  pan[i][j]++;
 }
 }

 if(sum==10)/*畫底座*/
 {
 Draw(170,1,162,200);
 setcolor(1);
 outtextxy(175,5,"Game( )");
 setcolor(4);
 outtextxy(175,5,"   G");
 }/*小*/
 else
 if(sum==40)
 {
  Draw(115,1,272,307);
  setcolor(1);
  outtextxy(120,5,"Game(G)");
  setcolor(4);
  outtextxy(120,5,"   G");
 }/*中*/
   else
   if(sum==99)
  {
   Draw(40,1,470,307);
   setcolor(1);
   outtextxy(45,5,"Game(G)");
   setcolor(4);
   outtextxy(45,5,"   G");
  }/*大*/

 setcolor(1);/*顯示提示信息*/
 outtextxy(100,350," : Help.");
 setcolor(4);
 outtextxy(100,350,"H");
 setcolor(1);
 outtextxy(200,350," /  : exit.");
 setcolor(4);
 outtextxy(200,350,"Q");
 outtextxy(220,350,"ESC");
 setcolor(1);
 outtextxy(330,350," : cores.");
 setcolor(4);
 outtextxy(330,350,"R");

 Facedraw(250,30,sizel,2);/*顯示控制按鈕,臉型*/

 for(i=0;i<x;i++)/*這一段用于描繪盤面*/
 for(j=0;j<y;j++)
 {
 Draw(i*size+pix,j*size+piy,size,size);
 }

 Have(sum,pix+20,30,x,y);/*各項的初始顯示*/
 k=0;
 setfillstyle(1, 0);
 bar(460-pix,25,490-pix,40);
 setcolor(4);
 outtextxy(465-pix,30,"000");

/*下面這一段用于接收用戶的控制,并做出反應(yīng)*/
 for(;;)
 {
 ams=Msread(&xms,&yms,&bms,t1,k);/*讀取鼠標(biāo)狀態(tài)*/

  /*下面一段用于保存并記錄鼠標(biāo)圖片*/
 if(flags!=0)
 {
  putimage(x11,y11,Map,COPY_PUT);
 }
 x11=xms;
 y11=yms;
 flags=1;

 /*這里插入菜單操作*/
 if((xms>=pix-10 && xms<=pix+26 && yms>=2 && yms<=14 && bms==1) || ams=='g' || ams=='G')/*點中菜單的判斷*/
 {
  Draw(pix-10,14,100,88); /*畫菜單*/
  cflags=0;
  setcolor(1);/*下面顯示菜單項*/
  outtextxy(pix-4,19,"Restar(R)");
  setcolor(4);
  outtextxy(pix-4,19,"    R");
  setcolor(1);/*下面顯示菜單項*/
  outtextxy(pix-4,30,"Easy(E)");
  setcolor(4);
  outtextxy(pix-4,30,"   E");
  setcolor(1);/*下面顯示菜單項*/
  outtextxy(pix-4,41,"Nomall(N)");
  setcolor(4);
  outtextxy(pix-4,41,"    N");
  setcolor(1);/*下面顯示菜單項*/
  outtextxy(pix-4,52,"Hard(H)");
  setcolor(4);
  outtextxy(pix-4,52,"   H");
  setcolor(1);/*下面顯示菜單項*/
  outtextxy(pix-4,63,"Corse(C)");
  setcolor(4);
  outtextxy(pix-4,63,"   C");
  setcolor(1);/*下面顯示菜單項*/
  outtextxy(pix-4,74,"Help(L)");
  setcolor(4);
  outtextxy(pix-4,74,"   L");
  setcolor(1);/*下面顯示菜單項*/
  outtextxy(pix-4,85,"Quit(Q)");
  setcolor(4);
  outtextxy(pix-4,85,"   Q");
  bms=0;
 }/*完成菜單的描繪*/

 /*這里是為了完全實現(xiàn)鼠標(biāo)控制才加入的內(nèi)容*/
 if(Eflags==2 && (bms!=0 || ams!=-1))
 {
   goto bss;
  }

 /*下面實現(xiàn)菜單的功能,每一項響應(yīng)一個菜單項*/
 if(cflags==0)
 {
  if((xms>=pix-6 && xms<=pix+85 && yms>=17 && yms<=28 && bms==1)|| (ams=='r' || ams=='R'))/*下面依次響應(yīng)菜單中各項*/
  {
  cflags=1;
  goto bss;
  }
  else
  if((xms>=pix-6 && xms<=pix+85 && yms>=28 && yms<=39 && bms==1) || ams=='e' || ams=='E')
  {
   cflags=1;
   x=9;
   y=9;
   sum=10;
   pix=250-x*size/2;
   goto bss;
  }
  else
   if((xms>=pix-6 && xms<=pix+85 && yms>=39 && yms<=50 && bms==1) || ams=='n' || ams=='N')
   {
   cflags=1;
   x=16;
   y=16;
   sum=40;
   pix=250-x*size/2;
   goto bss;
   }
   else
    if((xms>=pix-6 && xms<=pix+85 && yms>=50 && yms<=61 && bms==1) || ams=='h' || ams=='H')
   {
    cflags=1;
    x=30;
    y=16;
    sum=99;
    pix=250-x*size/2+25;
    goto bss;
   }
   else
    if((xms>=pix-6 && xms<=pix+85 && yms>=61 && yms<=72 && bms==1) || ams=='c' || ams=='C')
    {
    cflags=1;
    Coread();
    }
    else
     if((xms>=pix-6 && xms<=pix+85 && yms>=72 && yms<=83 && bms==1) || ams=='l' || ams=='L')
    {
    cflags=1;
    Help();
    }
    else
     if((xms>=pix-6 && xms<=pix+85 && yms>=83 && yms<=94 && bms==1) || ams=='q' || ams=='Q' || ams==27)
    {
     cflags=1;
     fclose(p);
     closegraph();
     farfree(Map);
     exit(1);
    }
    else
     if(bms!=0)
     {
     cflags=1;
     goto bss;
     }
 }/*結(jié)束菜單功能的實現(xiàn)*/
 /*在笑臉按鈕處單擊時重新開始*/
  if(cflags!=0 && xms >=250-sizel-2 && yms >= 30-sizel-2 && xms<=250+sizel+2 && yms<=30+sizel+2 && bms==1 )
 {
  goto bss;
 }
 
  if(Eflags==0 && cflags!=0 && xms-pix>=0 && yms-piy >=0 && xms<pix+x*size && yms<piy+y*size )/*111判斷*/
 {
  x1=(int)((xms-pix)/size);/*計算鼠標(biāo)目前的按鈕位置*/
  y1=(int)((yms-piy)/size);

  if(ams==-1 && bms==1 && pan1[x1][y1]==0)/*單擊鼠標(biāo)左鍵*/
  {
  if(k==0)/*k這里判斷是否是第一次按下.0:不計時,1:開始計時*/
  {
   gettime(&t1);
   k=1;
  }
  if(pan[x1][y1]!=9)
  {
   Draw1(x1,y1);
   Open(x,y);
  }
  else
  {
   Dead(sizel,x,y);
   k=0;
  }
  }

  if(ams==-1 && bms==2 && pan1[x1][y1]==0)/*單擊鼠標(biāo)右鍵*/
  {
  delay(100);
  setcolor(10);
  circle(x1*size+pix+7,y1*size+piy+7,4);
  pan1[x1][y1]=2;
  Have(sum,pix+20,30,x,y);
  }
  else
   if(ams==-1 && bms==2 && pan1[x1][y1]==2)/*單擊鼠標(biāo)右鍵*/
  {
   delay(100);
   Draw(x1*size+pix,y1*size+piy,size,size);
   pan1[x1][y1]=0;
   Have(sum,pix+20,30,x,y);
  }/*相當(dāng)于鼠標(biāo)右擊*/

 if(ams==-1 && bms==3 && pan1[x1][y1]==1)
  {/*相當(dāng)于鼠標(biāo)雙擊,有效性判斷*/
  i=0;
  if(x1-1>=0 && y1-1>=0 && pan1[x1-1][y1-1]==2) i++;
  if(y1-1>=0 && pan1[x1][y1-1]==2)i++;
  if(x1+1<x && y1-1>=0 && pan1[x1+1][y1-1]==2) i++;
  if(x1-1>=0 && pan1[x1-1][y1]==2) i++;
  if(x1+1<x && pan1[x1+1][y1]==2) i++;
  if(x1-1>=0 && y1+1<y && pan1[x1-1][y1+1]==2) i++;
  if(y1+1<y && pan1[x1][y1+1]==2) i++;
  if(x1+1<x && y1+1<y && pan1[x1+1][y1+1]==2) i++;
  if(i==pan[x1][y1])   /*有效*/
    {
   if(x1-1>=0 && y1-1>=0 && pan1[x1-1][y1-1]!=2) 
   {
   if(pan[x1-1][y1-1]!=9) 
    Draw1(x1-1,y1-1);
   else 
    {
    Dead(sizel,x,y); 
     k=0;
    }
   }
   if(y1-1>=0 && pan1[x1][y1-1]!=2)
   {
   if(pan[x1][y1-1]!=9)
    Draw1(x1,y1-1);
   else 
    {
    Dead(sizel,x,y);
    k=0;
    }
   }
   if(x1+1<x && y1-1>=0 && pan1[x1+1][y1-1]!=2) 
   {
   if(pan[x1+1][y1-1]!=9) 
    Draw1(x1+1,y1-1);
   else 
    {
    Dead(sizel,x,y);
    k=0;
    }
   }
   if(x1-1>=0 && pan1[x1-1][y1]!=2) 
   {
   if(pan[x1-1][y1]!=9) 
    Draw1(x1-1,y1);
   else 
    {
     Dead(sizel,x,y);
     k=0;
    }
   }
   if(x1+1<x && pan1[x1+1][y1]!=2) 
   {
   if(pan[x1+1][y1]!=9) 
    Draw1(x1+1,y1);
   else 
    {
    Dead(sizel,x,y);
    k=0;
    }
   }
   if(x1-1>=0 && y1+1<y && pan1[x1-1][y1+1]!=2) 
   {
   if(pan[x1-1][y1+1]!=9)
    Draw1(x1-1,y1+1);
   else 
    {
    Dead(sizel,x,y);
    k=0;
    }
   }
   if(y1+1<y && pan1[x1][y1+1]!=2)
   {
   if(pan[x1][y1+1]!=9) 
    Draw1(x1,y1+1);
   else 
    {
    Dead(sizel,x,y);
    k=0;
    }
   }
   if(x1+1<x && y1+1<y &&pan1[x1+1][y1+1]!=2) 
   {
   if(pan[x1+1][y1+1]!=9) 
    Draw1(x1+1,y1+1);
   else 
    {
    Dead(sizel,x,y);
    k=0;
    }
   }
   Open(x,y);
     }
     }

  /*勝利條件*/
 k1=0;
 for(i=0;i<x;i++)
 for(j=0;j<y;j++)
  if(pan1[i][j]!=1) k1++;

 if(k1==sum)
  {
  for(i=0;i<x;i++)
  for(j=0;j<y;j++)
  if(pan1[i][j]==0) 
   {
   setcolor(10);circle(i*size+pix+7,j*size+piy+7,4);
   }

  Facedraw(250,30,sizel,3);
    
  if(x==9 && tt<co[0]) {j=0;co[0]=tt;i=0;}
  if(x==16 && tt<co[1]) {j=1;co[1]=tt;i=0;}
  if(x==30 && tt<co[2]) {j=2;co[2]=tt;i=0;}

  if(i==0)
  {
   Draw(10,10,300,55);
   setcolor(4);
   outtextxy(20,15,"You break the corse!");
   outtextxy(20,25,"Please input your name(0 - 19):");
   setfillstyle(1, 14);
   bar(20,35,200,50);
   for(i=0;i<19;i++)
   {
   name[j][i]=getch();
   if(name[j][i]==8) i=i-2;
   if(name[j][i]==13) {name[j][i]='\0';break;}
   name[j][i+1]='\0';
   setfillstyle(1, 14);
   bar(20,35,200,50);
   setcolor(1);
   outtextxy(20,40,name[j]);
   }

   if((p = fopen("score.dat", "w")) == NULL)
   {
   printf("The file cannot open!\n");
   exit(1);
   }
   fprintf(p,"%d %d %d,",co[0],co[1],co[2]);
   for(i=0;i<3;i++)
   fprintf(p,"%s\n",name[i]);
   fclose(p);
   Coread();
  }
  getch();
  goto bss;
   }
 }/*結(jié)束111的判斷*/

 /*下面是一些快捷功能鍵的定義*/
   if(ams=='q'||ams=='Q'|| ams==27 ) {fclose(p);closegraph();farfree(Map);exit(1);}  /*退出主程序的唯一出口*/
  if(ams=='c'||ams=='C') goto bss;  /*重來*/
  if(ams=='h'||ams=='H') {Help();k=0;} /*幫助文檔*/
  if(ams=='r'||ams=='R') {Coread();k=0;} /*察看成績*/

 getimage(xms,yms,xms+20,yms+20,Map);
 Ddraw2(xms,yms);
 delay(10);
   }/*結(jié)束鼠標(biāo)循環(huán)讀取的死循環(huán)*/
}
/*++++++++主函數(shù)結(jié)束++++++++*/

/*這個函數(shù)用于實現(xiàn)鼠標(biāo)的初始化*/
int Msinit()
{
 int recored;
 regs.x.ax=0;
 int86 (0x33, & regs, & regs);
 recored=regs.x.ax;
 if(recored==0)
  {
 printf("Mouse not found or Mouse driver not installed.\n");
   return 0;
 }
 else
  return recored;
}

/*下面這個子程序是完成描繪一個按鈕*/
void Draw(int x,int y,int sizex,int sizey)/* x, y為左上角坐標(biāo)sizex,sizey為長和寬*/
{
 int sizx=sizex-1;
 int sizy=sizey-1;
 setcolor(15);/*這里最好用白色*/
 line(x,y,x+sizx-1,y);
 line(x,y+1,x+sizx-2,y+1);
 line(x,y,x,y+sizy-1);
 line(x+1,y,x+1,y+sizy-2);
 setcolor(8);/*這里最好用深灰色*/
 line(x+1,y+sizy,x+sizx,y+sizy);
 line(x+2,y+sizy-1,x+sizx,y+sizy-1);
 line(x+sizx-1,y+1,x+sizx-1,y+sizy);
 line(x+sizx,y+2,x+sizx,y+sizy);
 setcolor(7);/*這里最好用灰色*/
 putpixel(x,y+sizy,3);
 putpixel(x+1,y+sizy-1,3);
 putpixel(x+sizx,y,3);
 putpixel(x+sizx-1,y+1,3);
 setfillstyle(1, 7);/*這里最好用灰色,設(shè)置填充模式*/
 bar(x+2,y+2,x+sizx-2,y+sizy-2);
}

/*下面是一些畫圖程序*/
/*形參x,y笑臉的中心坐標(biāo),sizel臉的大小(半徑),
k為要描述的臉型,1:哭、2:平常、3:笑*/
void Facedraw(int x,int y,int sizel,int k)
 {Draw(x-sizel-3,y-sizel-3,2*(sizel+4),2*(sizel+4));/*畫一個按鈕*/
 setcolor(14);
 setfillstyle(1, 14);
 pieslice(x, y, 0, 360, sizel);/*畫一個黃色的圓面*/
 setfillstyle(1, 0);
 setcolor(0);
 if(k==1)/*失敗*/
 {
 line(x-sizel*7/20,y-sizel*7/20,x-sizel*3/20,y-sizel*3/20);/*畫兩個差表示眼睛*/
  line(x-sizel*7/20,y-sizel*3/20,x-sizel*3/20,y-sizel*7/20);
  line(x+sizel*3/20,y-sizel*7/20,x+sizel*7/20,y-sizel*3/20);
  line(x+sizel*3/20,y-sizel*3/20,x+sizel*7/20,y-sizel*7/20);
  arc(x,y+sizel,20,160, sizel/2);
 }
 if(k==2)/*平常*/
  {
 bar(x-sizel*7/20,y-sizel*7/20,x-sizel*3/20,y-sizel*3/20);
  bar(x+sizel*3/20,y-sizel*7/20,x+sizel*7/20,y-sizel*3/20);
  arc(x,y,200,340, sizel*3/4);
  }
 if(k==3)/*成功*/
  {
 bar(x-sizel/2,y-sizel/2,x-sizel*3/20,y-sizel*3/20);
  bar(x+sizel*3/20,y-sizel/2,x+sizel/2,y-sizel*3/20);
  line(x-sizel*3/20,y-sizel/2,x+sizel*3/20,y-sizel/2);
  line(x-sizel/2,y-sizel*5/20,x-sizel,y);
  line(x+sizel/2,y-sizel*5/20,x+sizel,y);
  arc(x,y,200,340, sizel*3/4); /*嘴巴*/
  }
}

/*死亡后的處理程序*/
/*x,y要判斷的點的坐標(biāo),sizel為臉的大小*/
void Dead(int sizel,int x,int y)
{
 int i,j;/*循環(huán)變量*/
 setcolor(4);
 for(i=0;i<x;i++)
 for(j=0;j<y;j++)
 if(pan[i][j]==9)
 {
 circle(i*size+pix+7,j*size+piy+7,4);
 }/*用紅色的圓圈標(biāo)記有雷的方塊*/
 Facedraw(250,30,sizel,1);
 Eflags=1;
}

/*下面的函數(shù)用于實現(xiàn)設(shè)置鼠標(biāo)的移動范圍*/
/*xmax,ymax為左上角的坐標(biāo)x,y矩陣的大小*/
void Setmouse(int xmax,int ymax,int x,int y)
{
 int left,right,top,buttom;/*這四個變量用于確定移動的左上角和右下角*/
 left=xmax;
 right=x;
 top=ymax;
 buttom=y;
 regs.x.ax=7;
 regs.x.cx=left;
 regs.x.dx=right;
 int86(0x33,& regs,& regs);
 regs.x.ax=8;
 regs.x.cx=top;
 regs.x.dx=buttom;
 int86(0x33,& regs,& regs);
}

/*下面這個函數(shù)用于實現(xiàn)鼠標(biāo)的讀取*/
/*xp,yp,bup分別為鼠標(biāo)的位置和按鍵情況,t1,k是時間現(xiàn)實參數(shù),t1為開始時間,k為開始標(biāo)記*/
int Msread(int *xp,int *yp,int *bup,struct time t1,int k)
{
 int x0=*xp,y0=*yp,bu0=*bup;
 int xnew,ynew,ch;
 int tt1=0;/*用于記錄時間差*/
 struct time t2;
 char ttt[4]="000";
 do
 {
 if(kbhit()) return getch();
   regs.x.ax=3;
   int86(0x33,& regs,& regs);
   xnew=regs.x.cx;
   ynew=regs.x.dx;
   *bup=regs.x.bx;
 /*下面用于顯示時間*/
 if(k==1)/*如果已經(jīng)開始就計算時間差*/
    {
  gettime(&t2);
    tt1=(t2.ti_hour- t1.ti_hour)*3600 + (t2.ti_min- t1.ti_min)*60 + t2.ti_sec - t1.ti_sec;/*有待改進*/
    if(tt1<=999 && tt!=tt1)/*當(dāng)時間差有改變時,才顯示*/
  {
  tt=tt1;
   ttt[0]=(tt-tt%100)/100+48;
  ttt[1]=(tt%100-tt%10)/10 +48;
  ttt[2]=tt%10+48;
  setfillstyle(1, 0);
  bar(460-pix,25,490-pix,40);
  setcolor(4);
  outtextxy(465-pix,30,ttt);
  }
    }
  }
 while(xnew==x0&&ynew==y0&&*bup==bu0);
 *xp=xnew;
 *yp=ynew;
 return -1;/*鍵盤無輸入時返回-1,其次返回鍵盤值*/
}

void Draw1(int x,int y)/*這個函數(shù)用于在x,y的位置描繪開后的情況*/
{
 setfillstyle(1, 7);
 bar(x*size+pix,y*size+piy,x*size+size+pix-1,y*size+size+piy-1);
 
 /*在四個角上畫上點標(biāo)記*/
 /*putpixel(x*size+pix,y*size+piy,8);
 putpixel(x*size+size+pix-1,y*size+size+piy-1,8);
 putpixel(x*size+pix,y*size+size+piy-1,8);
 putpixel(x*size+size+pix-1,y*size+piy,8);*/

 setcolor(8);
 setlinestyle(1, 0, 1);
 rectangle(x*size+pix,y*size+piy,x*size+size+pix-1,y*size+size+piy-1);
 setlinestyle(0, 0, 1);

 if(pan[x][y]!=0)/*沒有雷的話不做顯示*/
  {
 b[0]=pan[x][y]+48;
    if(pan[x][y]!=7)/*防止字的顏色和背景顏色相同*/
 setcolor(pan[x][y]);
 else setcolor(9);
 outtextxy (x*size+pix+3,y*size+piy+3,b);
  }
 pan1[x][y]=1;/*在pan1[][]中標(biāo)記這一點的挖雷情況*/
}

/*自開函數(shù)*/
int Open(int x,int y)/*函數(shù)中引入pan2[][]的目的是為了增加自開的效率,但是還是有不足之處*/
{
 int i,j,k;
 int pan2[30][16]={0};/*pan2[][],臨時紀(jì)錄盤面的自開情況,0沒有自開過,1:已經(jīng)自開過(30 這里有危險的技術(shù)性問題!!!)*/
 for(;;)
 {
 k=0;/*是一個標(biāo)記變量*/
 for(i=0;i<x;i++)
 for(j=0;j<y;j++)
   {
  if (pan[i][j]==0 && pan1[i][j]==1 && pan2[i][j]==0)/*如果滿足下面條件,沒有雷,已經(jīng)打開,沒有自開過就繼續(xù)*/
  {
  pan2[i][j]=1;/*標(biāo)記自開過*/
   k=k+1;
  /*開周圍的點*/
  if(i-1>=0 && j-1>=0 && pan1[i-1][j-1]==0) Draw1(i-1,j-1); /*左上方*/
  if(j-1>=0 && pan1[i][j-1]==0) Draw1(i,j-1);    /*上方*/
  if(i+1<x && j-1>=0 && pan1[i+1][j-1]==0) Draw1(i+1,j-1); /*右上方*/
  if(i-1>=0 && pan1[i-1][j]==0) Draw1(i-1,j);     /*左方*/
  if(i+1<x && pan1[i+1][j]==0) Draw1(i+1,j);       /*右方*/
  if(i-1>=0 && j+1<y && pan1[i-1][j+1]==0) Draw1(i-1,j+1); /*左下方*/
  if(j+1<y && pan1[i][j+1]==0) Draw1(i,j+1);       /*下方*/
  if(i+1<x && j+1<y && pan1[i+1][j+1]==0) Draw1(i+1,j+1);  /*右下方*/
  }
    }
 if(k==0) return 0;/*沒有新的自開點時退出*/
 }
}

float Random()/*隨即數(shù)生成函數(shù),加入了時間變量目的在于加強它的隨機性*/
{float aa;
 int i,j;
 struct time t;
 gettime(&t);
 i=t.ti_min+t.ti_hour+t.ti_sec+t.ti_hund;
 for(j=0;j<i;j++)
 rand();
 aa=rand()/32767.0;
 return aa;/*返回產(chǎn)生的隨機數(shù)(0-1)*/
}

/*下面是一個顯示剩余雷數(shù)目的函數(shù)*/
void Have(int sum,int x,int y,int xx,int yy)/*游戲中雷的總數(shù)目不能多余99顆,sum 為雷的總數(shù)目,x,y為顯示的地點*/
{
 int i,j,k=0;
 char a[3]="1";
 for(i=0;i<xx;i++)
 for(j=0;j<yy;j++)
  {if (pan1[i][j]==2) k++;}/*統(tǒng)計一共標(biāo)記了多少*/
 k=sum-k;/*剩下了多少*/
 if(k<0) k=0;
 a[0]=(k-(k%10))/10+48;/*字符轉(zhuǎn)換*/
 a[1]=k%10+48;
 setfillstyle(1, 0);
 bar(x-5,y-5,x+20,y+10);/*在原點涂黑*/
 setcolor(4);
 outtextxy(x,y,a);/*顯示數(shù)目*/
}

/*下面是幫助函數(shù)*/
void Help()
{
 Draw(40,1,560,160);
 setcolor(1);
 outtextxy(300,10,"Help");
 setcolor(4);
 outtextxy(50,30,"Welcome to play this game. The mouse is supplied.");
 outtextxy(50,40,"Please press left button of the mouse where there is no boom.");
 outtextxy(50,50,"If you think there is a boom please press right button.");
 outtextxy(50,60,"You can choose the size of the game with press the right buttons.");
 outtextxy(50,70,"'Big' means 99 booms,'Normal' means 40 booms,'Small' means 10 booms.");
 outtextxy(50,80,"You can press the laugh-face-button or press C to play again.");
 outtextxy(50,90,"When you fail or success you can press any key to play again. ");
 outtextxy(50,100,"Whenever you want to quit this game please press Q. ");
 outtextxy(50,110,"If you find out all booms then you are winning. ");
 setcolor(9);
 outtextxy(50,140,"Press any key to play again.");
 Eflags=2;
}

void Coread()/*這個函數(shù)用于讀取紀(jì)錄并顯示*/
{ 
 int co[3],i;
 char name[3][20];
 char cco[3][4];
 FILE * p;
 for(i=0;i<3;i++)
    cco[i][3]='\0';

 if((p = fopen("score.dat", "rb")) == NULL)
   {
 printf("The file cannot open!\n");
    exit(1);
 }

 fscanf(p,"%d %d %d,",&co[0],&co[1],&co[2]);
 for(i=0;i<3;i++)
   fscanf(p,"%s\n",name[i]);
 fclose(p);
 Draw(10,20,320,90);
 setcolor(1);
 outtextxy(140,30,"HighCore");
 setcolor(2);
 outtextxy(20,50,"Easy");
 outtextxy(20,60,"Normal");
 outtextxy(20,70,"Hard");

 for(i=0;i<3;i++)
 {
 cco[i][0]=(co[i]-co[i]%100)/100+48;
  cco[i][1]=(co[i]%100-co[i]%10)/10 +48;
  cco[i][2]=co[i]%10+48;
 }

 setcolor(3);
 outtextxy(100,50,cco[0]);
 outtextxy(100,60,cco[1]);
 outtextxy(100,70,cco[2]);

 setcolor(5);
 outtextxy(150,50,name[0]);
 outtextxy(150,60,name[1]);
 outtextxy(150,70,name[2]); 

 setcolor(9);
 outtextxy(30,85,"Press any key to play again.");
 Eflags=2;
}

/*這個函數(shù)用來畫鼠標(biāo)光標(biāo),x,y,為左上角坐標(biāo),大小為20*20*/
void Ddraw2(int x,int y)
{
 /*這個地方暫時使用簡易光標(biāo),程序成熟以后使用復(fù)雜的*/
 setcolor(1);
 line(x,y,x,y+18);
 line(x+1,y,x+1,y+18);
 line(x,y,x+12,y+12);
 line(x+1,y,x+13,y+12);
 line(x,y+18,x+4,y+14);
 line(x,y+17,x+4,y+13);
 line(x+4,y+14,x+6,y+20);
 line(x+4,y+13,x+6,y+19);
 line(x+6,y+20,x+10,y+18);
 line(x+6,y+19,x+10,y+17);
 line(x+10,y+18,x+8,y+12);
 line(x+10,y+17,x+8,y+11);
 line(x+8,y+12,x+12,y+12);
 line(x+8,y+11,x+12,y+11);
}

至此程序完成,直接編譯運行即可!

相關(guān)文章

  • 深入探究C++編程中的資源泄漏問題以及排查方法

    深入探究C++編程中的資源泄漏問題以及排查方法

    在C++程序開發(fā)維護過程中,時常會遇到資源泄漏問題,比如GDI對象泄漏、進程線程句柄泄漏以及內(nèi)存泄漏問題,今天我們就來深入探討一下這幾類資源泄漏以及排查這些泄露的辦法,需要的朋友可以參考下
    2023-10-10
  • 深入理解C語言 static、extern與指針函數(shù)

    深入理解C語言 static、extern與指針函數(shù)

    這篇文章主要介紹了C語言 static、extern與指針函數(shù),有需要的朋友可以參考一下
    2013-12-12
  • c++中處理相關(guān)數(shù)學(xué)函數(shù)

    c++中處理相關(guān)數(shù)學(xué)函數(shù)

    數(shù)學(xué)庫函數(shù)聲明在 math.h 中,主要有:
    2013-04-04
  • C++?requires關(guān)鍵字簡單介紹

    C++?requires關(guān)鍵字簡單介紹

    requires?是?C++20?中引入的一個新關(guān)鍵字,用于在函數(shù)模板或類模板中聲明所需的一組語義要求,它可以用來限制模板參數(shù),類似于?typename?和?class?關(guān)鍵字,這篇文章主要介紹了C++?requires關(guān)鍵字簡介,需要的朋友可以參考下
    2023-05-05
  • VS2022新建項目時沒有ASP.NET Web應(yīng)用程序(.NET Framework)

    VS2022新建項目時沒有ASP.NET Web應(yīng)用程序(.NET Framework)

    本文主要介紹了VS2022新建項目時沒有ASP.NET Web應(yīng)用程序的解決,文中通過圖文介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-10-10
  • C++利用eigen庫實現(xiàn)求歐拉角

    C++利用eigen庫實現(xiàn)求歐拉角

    這篇文章主要為大家詳細(xì)介紹了C++如何利用eigen庫自帶的matrix.eulerAngles()函數(shù)實現(xiàn)求歐拉角,文中的示例代碼講解詳細(xì),有需要的小伙伴可以參考下
    2023-11-11
  • C++利用鏈表寫一個簡單的棧實例詳解

    C++利用鏈表寫一個簡單的棧實例詳解

    這篇文章主要介紹了C++利用鏈表寫一個簡單的棧實例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • C++中的數(shù)組引用和指針引用

    C++中的數(shù)組引用和指針引用

    這篇文章主要介紹了C++中的數(shù)組引用和指針引用詳細(xì)的相關(guān)資料,需要的朋友可以參考下面文章內(nèi)容
    2021-09-09
  • C++實現(xiàn)LeetCode(78.子集合)

    C++實現(xiàn)LeetCode(78.子集合)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(78.子集合),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • 在C++中反射調(diào)用.NET的方法(二)

    在C++中反射調(diào)用.NET的方法(二)

    反射調(diào)用返回復(fù)雜對象的.NET方法怎么實現(xiàn)呢?今天小編通過本文給大家分享在C++中反射調(diào)用.NET的方法(二),需要的朋友參考下
    2017-02-02

最新評論