程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> C語言基礎知識 >> 簡單掃雷游戲

簡單掃雷游戲

編輯:C語言基礎知識
鼠標右鍵的功能沒寫進去,這個程序主要是練下鼠標操作的,其中顯示空白區域還用了個第歸,寫得比較簡單.望大家多多指教. #include <graphics.h>
  #include <stdlib.h>
  #include <dos.h>
  #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] 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved