a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 編程 > C > 正文

基于C語言實現的掃雷游戲代碼

2020-01-26 15:26:07
字體:
來源:轉載
供稿:網友

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

完整的實例代碼如下:

/*模擬掃雷游戲 */#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";/*用于顯示方格周圍的雷的個數*/int pan[30][16];/*用于記錄盤面的情況:0:沒有、9:有雷、1~8:周圍雷的個數*/int pan1[30][16];/*pan1[][]紀錄當前的挖雷情況,0:沒有操作、1:打開了、2:標記了*/int tt;/*紀錄時間參數*/int Eflags;/*用于標記鼠標按鈕的有效性,0:有效,1:無效,2:這是鼠標的任意鍵等于重新開始*/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);/*下面是主函數*/main(){ int mode=VGAHI,devices=VGA;/*圖形模式初始化的變量*/ char ams;         /*鼠標操作中的標志變量*/ int xms,yms,bms;      /*鼠標的狀態變量*/ int i,j,k,k1=0;      /*i,j,k是循環變量*/ int x=9,y=9,flags=0;    /*x,y矩陣的大小*/ int sum=10;        /*sum 盤面的雷的總數目,是個x,y的函數*/ int x1=0,y1=0;       /*用于記錄光標當前的位置*/ int x11=0,y11=0;      /*暫時保存鼠標位置的值*/ int sizel=10;       /*臉的大小*/ int cflags=1;   /*這是菜單操作標志變量,沒有彈出1,彈出0*/ struct time t1={0,0,0,0}; /*時間結構體,頭文件已定義*/ int co[3];   /*暫時紀錄歷史紀錄*/ void far *Map;   /*用于保存鼠標圖片*/ char name[3][20];   /*名字字符串,用于記錄名字*/ FILE * p;   /*文件指針用于文件操作*/ Msinit();               /*鼠標初始化*/ /*registerbgidriver(EGAVGA_driver);*/ initgraph(&devices,&mode,"C://tc");   /*圖形模式初始化*//*為圖片指針分配內存*/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); } /*寫入初始內容*/ fprintf(p,"%d %d %d,%s/n%s/n%s/n",999,999,999,"xiajia","xiajia","xiajia"); fclose(p);  } /*暫時讀出歷史紀錄。并用co[3]紀錄*/ 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); /*設置鼠標的活動范圍*/ 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++)/*用于統計各點的周邊情況*/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");/*下面這一段用于接收用戶的控制,并做出反應*/ for(;;) { ams=Msread(&xms,&yms,&bms,t1,k);/*讀取鼠標狀態*/  /*下面一段用于保存并記錄鼠標圖片*/ 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; }/*完成菜單的描繪*/ /*這里是為了完全實現鼠標控制才加入的內容*/ if(Eflags==2 && (bms!=0 || ams!=-1)) {   goto bss;  } /*下面實現菜單的功能,每一項響應一個菜單項*/ if(cflags==0) {  if((xms>=pix-6 && xms<=pix+85 && yms>=17 && yms<=28 && bms==1)|| (ams=='r' || ams=='R'))/*下面依次響應菜單中各項*/  {  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;     } }/*結束菜單功能的實現*/ /*在笑臉按鈕處單擊時重新開始*/  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);/*計算鼠標目前的按鈕位置*/  y1=(int)((yms-piy)/size);  if(ams==-1 && bms==1 && pan1[x1][y1]==0)/*單擊鼠標左鍵*/  {  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)/*單擊鼠標右鍵*/  {  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)/*單擊鼠標右鍵*/  {   delay(100);   Draw(x1*size+pix,y1*size+piy,size,size);   pan1[x1][y1]=0;   Have(sum,pix+20,30,x,y);  }/*相當于鼠標右擊*/ if(ams==-1 && bms==3 && pan1[x1][y1]==1)  {/*相當于鼠標雙擊,有效性判斷*/  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;   } }/*結束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);   }/*結束鼠標循環讀取的死循環*/}/*++++++++主函數結束++++++++*//*這個函數用于實現鼠標的初始化*/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為左上角坐標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);/*這里最好用灰色,設置填充模式*/ bar(x+2,y+2,x+sizx-2,y+sizy-2);}/*下面是一些畫圖程序*//*形參x,y笑臉的中心坐標,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要判斷的點的坐標,sizel為臉的大小*/void Dead(int sizel,int x,int y){ int i,j;/*循環變量*/ 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); }/*用紅色的圓圈標記有雷的方塊*/ Facedraw(250,30,sizel,1); Eflags=1;}/*下面的函數用于實現設置鼠標的移動范圍*//*xmax,ymax為左上角的坐標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);}/*下面這個函數用于實現鼠標的讀取*//*xp,yp,bup分別為鼠標的位置和按鍵情況,t1,k是時間現實參數,t1為開始時間,k為開始標記*/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)/*如果已經開始就計算時間差*/    {  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)/*當時間差有改變時,才顯示*/  {  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)/*這個函數用于在x,y的位置描繪開后的情況*/{ setfillstyle(1, 7); bar(x*size+pix,y*size+piy,x*size+size+pix-1,y*size+size+piy-1);  /*在四個角上畫上點標記*/ /*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[][]中標記這一點的挖雷情況*/}/*自開函數*/int Open(int x,int y)/*函數中引入pan2[][]的目的是為了增加自開的效率,但是還是有不足之處*/{ int i,j,k; int pan2[30][16]={0};/*pan2[][],臨時紀錄盤面的自開情況,0沒有自開過,1:已經自開過(30 這里有危險的技術性問題!!!)*/ for(;;) { k=0;/*是一個標記變量*/ 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)/*如果滿足下面條件,沒有雷,已經打開,沒有自開過就繼續*/  {  pan2[i][j]=1;/*標記自開過*/   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()/*隨即數生成函數,加入了時間變量目的在于加強它的隨機性*/{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;/*返回產生的隨機數(0-1)*/}/*下面是一個顯示剩余雷數目的函數*/void Have(int sum,int x,int y,int xx,int yy)/*游戲中雷的總數目不能多余99顆,sum 為雷的總數目,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++;}/*統計一共標記了多少*/ k=sum-k;/*剩下了多少*/ if(k<0) k=0; a[0]=(k-(k%10))/10+48;/*字符轉換*/ a[1]=k%10+48; setfillstyle(1, 0); bar(x-5,y-5,x+20,y+10);/*在原點涂黑*/ setcolor(4); outtextxy(x,y,a);/*顯示數目*/}/*下面是幫助函數*/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()/*這個函數用于讀取紀錄并顯示*/{  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;}/*這個函數用來畫鼠標光標,x,y,為左上角坐標,大小為20*20*/void Ddraw2(int x,int y){ /*這個地方暫時使用簡易光標,程序成熟以后使用復雜的*/ 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);}

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 免费一级欧美在线观看视频 | 免费黄色毛片视频 | 午夜私人影院 | 国产一区999| av影片在线播放 | 欧美日韩免费一区 | 国产精品国产a级 | 欧美日韩一区二区三区不卡视频 | 欧美精品在线免费观看 | 粉嫩高清一区二区三区精品视频 | 精品一区二区三区免费视频 | 成人aaaa| 免费成人av | 精品国产髙清在线看国产毛片 | 青青草久草 | 日韩精品av一区二区三区 | 久久69国产一区二区蜜臀 | 91精品国产综合久久久久久漫画 | 亚洲一区在线视频 | 国产精品1页 | 欧美影视一区二区 | 午夜精品久久久久久久男人的天堂 | 99国内精品久久久久久久 | 午夜精品久久久久99蜜 | 欧美一区二区三区在线观看视频 | 亚洲精品中文字幕乱码无线 | 精品久久国产 | h视频免费在线 | 一区二区三区在线 | 美女一区二区三区四区 | 国产精品视频久久 | 午夜午夜精品一区二区三区文 | 欧美成人黄色小说 | 精品一区二区三区在线视频 | 在线观看日韩av | 手机看片福利一区 | 黄色一级片视频播放 | 人人射人人 | 18视频免费网址在线观看 | 在线一区二区三区 | 中文字幕亚洲一区二区三区 |