龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > C/C++开发 >

简单扫雷游戏

时间:2009-12-22 15:42来源:未知 作者:admin 点击:
分享到:
鼠标右键的功能没写进去,这个程序主要是练下鼠标操作的,其中显示空白区域还用了个第归,写得比较简单.望大家多多指教. #include #include #include #define LEFTPRESS 0xff01 #define LEFTCLICK 0xff10 #

鼠标右键的功能没写进去,这个程序主要是练下鼠标操作的,其中显示空白区域还用了个第归,写得比较简单.望大家多多指教.

#include

  #include

  #include

  #define LEFTPRESS 0xff01

  #define LEFTCLICK 0xff10

  #define LEFTDRAG 0xff19

  #define MOUSEMOVE 0xff08

  int num[10][10];/*范围*/

  int p[10][10];/*统计雷的数组*/

  int loop;/*重新来的标志*/

  int again=0;/*是否重来的变量*/

  int scorenum;/*一开始统计有几个雷*/

  char score[3];/*输出一共有几个地雷*/

  int Keystate;

  int MouseExist;

  int MouseButton;

  int MouseX;

  int MouseY;

  /*鼠标光标外形定义*/

  typedef strUCt

   {

   unsigned int shape[32];

   char hotx;

   char hoty;

   }SHAPE;

/*箭头型*/

  SHAPE ARROW={

   {

   0x3fff,0x1fff,0x0fff,0x07ff,

   0x03ff,0x01ff,0x00ff,0x007f,

   0x003f,0x00ff,0x01ff,0x10ff,

   0x30ff,0xf87f,0xf87f,0xfc3f,

   0x0000,0x7c00,0x6000,0x7000,

   0x7800,0x7c00,0x7e00,0x7f00,

   0x7f80,0x7e00,0x7c00,0x4600,

   0x0600,0x0300,0x0300,0x0180

   },

   0,0,

   };

/*鼠标光标显示*/

  void MouseOn()

   {

   _AX=0x01;

   geninterrupt(0x33);

   }

/*鼠标光标掩示*/

  void MouseOff()/*鼠标光标隐藏*/

   {

   _AX=0x02;

   geninterrupt(0x33);

   }

  void MouseSetXY(int x,int y)/*设置当前位置*/

   {

   _CX=x;

   _DX=y;

   _AX=0x04;

   geninterrupt(0x33);

   }

  int LeftPress()/*左键按下*/

   {

   _AX=0x03;

   geninterrupt(0x33);

   return(_BX&1);

   }

  void MouseGetXY()/*得到当前位置*/

   {

   _AX=0x03;

   geninterrupt(0x33);

   MouseX=_CX;

   MouseY=_DX;

   }

   begain()/*游戏开始画面*/

  {

   int i,j;

   loop: cleardevice();

   MouseOn();

   MouseSetXY(180,30);

   MouseX=180;

   MouseY=30;

   scorenum=0;

   setfillstyle(SOLID_FILL,7);

   bar(190,60,390,290);

   setfillstyle(SOLID_FILL,8);

   for(i=100;i<300;i+=20)/*画格子*/

   for(j=200;j<400;j+=20)

   bar(j-8,i+8,j+8,i-8);

   setcolor(7);

   setfillstyle(SOLID_FILL,YELLOW);/*画脸*/

   fillellipse(290,75,10,10);

   setcolor(YELLOW);

   setfillstyle(SOLID_FILL,0);

   fillellipse(285,75,2,2);

   fillellipse(295,75,2,2);

   setcolor(0);

   bar(287,80,293,81);

   randomize();

   for(i=0;i<10;i++)

   for(j=0;j<10;j++)

   {

   num[i][j]=random(7)+10;/*用10代表地雷算了*/

   if(num[i][j]==10)

   scorenum++;

   }

   sprintf(score,"%d",scorenum);

   setcolor(1);

   settextstyle(0,0,2);

   outtextxy(210,70,score);

   scorenum=100-scorenum;/*为了后面判定胜利*/

  }

  gameove()/*游戏结束画面*/

  {

   int i,j;

   setcolor(0);

   for(i=0;i<10;i++)

   for(j=0;j<10;j++)

   if(num[i][j]==10)/*是地雷的就显示出来*/

   {

   setfillstyle(SOLID_FILL,RED);

   bar(200+j*20-8,100+i*20-8,200+j*20+8,100+i*20+8);

   setfillstyle(SOLID_FILL,0);

   fillellipse(200+j*20,100+i*20,7,7);

   }

  }

  int tongji(int i,int j)/*计算有几个雷*/

  {

   int x=0;/*10代表地雷*/

   if(i==0&&j==0)

   {

   if(num[0][1]==10)

   x++;

   if(num[1][0]==10)

   x++;

   if(num[1][1]==10)

   x++;

   }

   else if(i==0&&j==9)

   {

   if(num[0][8]==10)

   x++;

   if(num[1][9]==10)

   x++;

   if(num[1][8]==10)

   x++;

   }

   else if(i==9&&j==0)

   {

   if(num[8][0]==10)

   x++;

   if(num[9][1]==10)

   x++;

   if(num[8][1]==10)

   x++;

   }

   else if(i==9&&j==9)

   {

   if(num[9][8]==10)

   x++;

   if(num[8][9]==10)

   x++;

   if(num[8][8]==10)

   x++;

   }

   else if(j==0)

   {

   if(num[i][j+1]==10)

   x++;

   if(num[i+1][j]==10)

   x++;

   if(num[i-1][j]==10)

   x++;

   if(num[i-1][j+1]==10)

   x++;

   if(num[i+1][j+1]==10)

   x++;

   }

   else if(j==9)

   {

   if(num[i][j-1]==10)

   x++;

   if(num[i+1][j]==10)

   x++;

   if(num[i-1][j]==10)

   x++;

   if(num[i-1][j-1]==10)

   x++;

   if(num[i+1][j-1]==10)

   x++;

   }

   else if(i==0)

   {

   if(num[i+1][j]==10)

   x++;

   if(num[i][j-1]==10)

   x++;

   if(num[i][j+1]==10)

   x++;

   if(num[i+1][j-1]==10)

   x++;

   if(num[i+1][j+1]==10)

   x++;

   }

   else if(i==9)

   {

   if(num[i-1][j]==10)

   x++;

   if(num[i][j-1]==10)

   x++;

   if(num[i][j+1]==10)

   x++;

   if(num[i-1][j-1]==10)

   x++;

   if(num[i-1][j+1]==10)

   x++;

   }

   else

   {

   if(num[i-1][j]==10)

   x++;

   if(num[i-1][j+1]==10)

   x++;

   if(num[i][j+1]==10)

   x++;

   if(num[i+1][j+1]==10)

   x++;

   if(num[i+1][j]==10)

   x++;

   if(num[i+1][j-1]==10)

   x++;

   if(num[i][j-1]==10)

   x++;

   if(num[i-1][j-1]==10)

   x++;

   }

   return(x);

  }

  funcheck(int i,int j)/*开始找无雷*/

  {

   scorenum--;

   if(p[i][j]==0&&num[i][j]!=10)

   {

   setfillstyle(SOLID_FILL,7);/*显示无雷区*/

   bar(200+j*20-7,100+i*20-7,200+j*20+7,100+i*20+7);

   num[i][j]=-1;

   }

   else if(p[i][j]!=0)

   {

   sprintf(score,"%d",p[i][j]);/*输出雷数*/

   setcolor(RED);

   outtextxy(195+j*20,95+i*20,score);

   num[i][j]=-1;

   return ;

   }

   if(i!=0&&num[i-1][j]!=-1&&num[i-1][j]!=10)/*第归开始*/

   funcheck(i-1,j);

   if(i!=0&&j!=9&&num[i-1][j+1]!=-1&&num[i-1][j+1]!=10)

   funcheck(i-1,j+1);

   if(j!=9&&num[i][j+1]!=-1&&num[i][j+1]!=10)

   funcheck(i,j+1);

   if(j!=9&&i!=9&&num[i+1][j+1]!=-1&&num[i+1][j+1]!=10)

   funcheck(i+1,j+1);

   if(i!=9&&num[i+1][j]!=-1&&num[i+1][j]!=10)

   funcheck(i+1,j);

   if(i!=9&&j!=0&&num[i+1][j-1]!=-1&&num[i+1][j-1]!=10)

   funcheck(i+1,j-1);

   if(j!=0&&num[i][j-1]!=-1&&num[i][j-1]!=10)

   funcheck(i,j-1);

   if(i!=0&&j!=0&&num[i-1][j-1]!=-1&&num[i-1][j-1]!=10)

   funcheck(i-1,j-1);

  }

  

[1] [2]

精彩图集

赞助商链接