⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 184.c

📁 C++游戏开发书籍的实例非常适合初学但又又想往游戏开发方面发展的人学习哦
💻 C
📖 第 1 页 / 共 2 页
字号:
/*
模拟扫雷游戏  
*/
#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;
        }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -