这是大一的时候写的,代码质量不是很高,仅供学习。关于扫雷怎么玩,代码思想,网上很多,要我写也写不出来他们那么好的,所有这方面的百度下

   源码地址http://pan.baidu.com/share/link?shareid=1925887460&uk=2065228996

#include<windows.h>
#include<stdlib.h>
#include"resource.h"
int XUNIT = GetSystemMetrics(SM_CXICON);
int YUNIT = GetSystemMetrics(SM_CYICON);
    int NUM  = 80;
        int CXNUM   =       20;
        int CYNUM   =       20;
        int Dead = 0 ;
        //只能设置成全局变量
        static  int minestate[100][100], mineflag[100][100] ;
        HDC     hdc, hdcmem3;/*hdcmem1,hdcmem2, hdcmem4;*/
        int x,y;
        int cxmine , cymine;
        static int      cySource3, cxSource3;// cxSource1,cxSource2,cxSource3,cxSource4,
        //  cySource1,cySource2,cySource3,cySource4;
        int     width = CXNUM*XUNIT;
        int     hight = CYNUM*(YUNIT) + +13+GetSystemMetrics(SM_CYBORDER);
LRESULT CALLBACK MineProc (HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   PSTR szCmdLine,
                   int iCmdShow)
{
    static TCHAR szMineName [] = TEXT ("mineswap");
    HWND        hwnd;
    MSG     msg;
                                     
                                     
    WNDCLASS        wc;
    wc.cbClsExtra       =   0;
    wc.cbWndExtra       =   0;
    wc.hbrBackground        =   (HBRUSH)GetStockObject (GRAY_BRUSH);
    wc.hCursor      =   LoadCursor (NULL, IDC_ARROW);
    wc.hIcon        =   LoadIcon (hInstance, MAKEINTRESOURCE(10));
    wc.hInstance        =   hInstance;
    wc.lpfnWndProc      =   MineProc;
    wc.lpszClassName        =   szMineName ;
    wc.lpszMenuName     =   szMineName;
                                     
    wc.style        =   CS_HREDRAW | CS_VREDRAW;
                                     
//  RegisterClass(&wc);
  if (!RegisterClass (&wc))
     {
          MessageBox (NULL, TEXT ("Program requires Windows NT!"),
                      szMineName, MB_ICONERROR) ;
          return 0  ;
     }
                                         
    hwnd =  CreateWindow(szMineName,
        TEXT("MINESWAP"),
        WS_OVERLAPPED |
        WS_DLGFRAME | WS_SYSMENU  | WS_MINIMIZEBOX,
        CW_USEDEFAULT,CW_USEDEFAULT,
        width, hight,
        //XUNIT*CXNUM,YUNIT*(CYNUM + 1)+13+GetSystemMetrics(SM_CYBORDER),
        NULL,NULL,hInstance,NULL);
                                         
        ShowWindow(hwnd,iCmdShow);
        UpdateWindow(hwnd);
        while(GetMessage(&msg,NULL,0,0))
        {
            TranslateMessage (&msg);
            DispatchMessage (&msg);
        }
        return msg.wParam;
}
                                         
int IsInMineArea(int row,int col)//查看有没超出范围
{
    return (row >= 0 && row < CXNUM && col >= 0 && col < CYNUM);
}
int GetAroundNum(int row, int col)//得到周围个数,
{
    int i, j;
    int around = 0;
    int minRow = ( row == 0 ) ? 0 : row  - 1;
    int maxRow = row + 2;
    int minCol = ( col == 0 ) ? 0 : col - 1 ;
    int maxCol = col + 2;
    for (i = minRow; i < maxRow; i++)
    {
        for (j = minCol; j < maxCol; j++)
        {
            if (minestate[i][j] == 5) around++;
        }
    }
    return around;
}
void ExpandMines(int row, int col)//扫描,如果是已经被按下且雷数为0,显示它周围的八个格,c参见程序一
{
    int i, j;
    int minRow = (row == 0) ? 0 : row - 1;
    int maxRow = row + 2;
    int minCol = (col ==  0) ? 0 : col - 1;
    int maxCol = col + 2;
    int around = GetAroundNum(row, col);
    if (mineflag[row][col] == 1)   //标志是1才赋值
    {
    minestate[row][col] = 15 - around;
    }
    //对周围一个雷都没有的空白区域
    if (around == 0)
    { 
        for (i = minRow; i < maxRow; i++)
        {
            for (j = minCol; j < maxCol; j++)
            {//对于周围可以拓展的区域进行的规拓展  
                                             
                if ((!(i == row && j == col) )&& (minestate[i][j] == 0) && mineflag[x][y] == 1)
                {                 
                        if (!IsInMineArea (i, j) )continue;
                    ExpandMines(i, j);
                                                 
                } 
            }
        }
    }
}     
LRESULT CALLBACK MineProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
        PAINTSTRUCT     ps;
        HINSTANCE   hInstance;
        static HBITMAP  hBm3;   //hBm1,hBm2,hBm3,hBm4;
        BITMAP  bitmap3;//  bimap1,bitmap2,bitmap3,bitmap4;
        //若设置此函数的全局变量,没个WM_结束后不会值改变,其实是局部变量
        //因为该函数其实就是下面的变形
        /*
        int fun ()
        {
        int a, b , c;
        int num ;
        switch()
          {
                                         
          }
          return NUM ;
        }
        */
            int j;    
            HMENU   hmenu ;
        static int Select = ID_FIRST;
        switch(message)
        {
                                         
        case    WM_CREATE:    
        hInstance       =       ((LPCREATESTRUCT)lParam)->hInstance;
                                         
        //hBm1  =   LoadBitmap (hInstance, MAKEINTRESOURCE(1));
        //hBm2  =   LoadBitmap (hInstance, MAKEINTRESOURCE(2));
        hBm3    =   LoadBitmap (hInstance, MAKEINTRESOURCE(3));
        //hBm4  =   LoadBitmap (hInstance, MAKEINTRESOURCE(4));
                                         
        //GetObject(hBm1,sizeof(BITMAP),&bitmap1);
                                         
        //GetObject(hBm2,sizeof(BITMAP),&bitmap2);
                                         
        GetObject(hBm3,sizeof(BITMAP),&bitmap3);
        cxSource3   =   bitmap3.bmWidth;
        cySource3   =   bitmap3.bmHeight/16;
                                         
                                         
                                         
            for (x = 0 ; x < CXNUM ; x ++)
        for (y = 0 ; y < CXNUM ; y ++)
        {
        minestate[x][y] = 0 ;   //初始化雷区状态
        mineflag[x][y] = 1;// 初始化标志
        }
        //随机布雷    
        srand((unsigned)GetCurrentTime());
        for( j = 1; j <= NUM; )
            {
            cxmine = abs (rand()%(400));
            cymine = abs (rand()%(400));
                                             
            if ( cxmine < CXNUM && cymine < CYNUM &&  minestate[cxmine][cymine] != 5 )
            {
                minestate[cxmine][cymine] = 5 ;//属性置雷
                j++;
            }
            else continue ;
            }
        //GetObject(hBm4,sizeof(BITMAP),&bitmap4);
        return  0 ;
                                         
        case  WM_PAINT:
            hdc = BeginPaint (hwnd, &ps) ;
              hdcmem3 = CreateCompatibleDC (hdc) ;
               SelectObject (hdcmem3, hBm3) ;
                                             
             //画初始化的雷和重画的雷
             for (x = 0 ; x < CXNUM ; x ++)
              {
             for (y = 0 ; y < CYNUM ; y ++)
              {                         
                                             
                                                       
              switch (minestate[x][y])
                  {
                  case  0 :
                  StretchBlt (hdc, x*XUNIT, y*YUNIT, XUNIT, YUNIT, hdcmem3, 0, (mineflag[x][y] - 1)*cySource3,cxSource3, cySource3, MERGECOPY);
                      continue ;
                  case  2 :
                  case  4 :
                 case  3 :          
                  case 6 :
                  case  7 :
                  case  8 :
                  case  9 :
                  case  10 :
                  case  11:
                  case  12:
                  case  13 :
                  case  14:
                  case  15:
                  StretchBlt (hdc, x*XUNIT, y*YUNIT, XUNIT, YUNIT, hdcmem3, 0, minestate[x][y] * cySource3,cxSource3, cySource3, MERGECOPY);
                    continue ;
                                                 
                                          
                  case  5 :
                      switch(Dead)
                      {
                      case 0 :
                      StretchBlt (hdc, x*XUNIT, y*YUNIT, XUNIT, YUNIT, hdcmem3, 0, (mineflag[x][y] - 1)*cySource3,cxSource3, cySource3, MERGECOPY);
                    continue;   
                      case 1 :
                           StretchBlt (hdc, x*XUNIT, y*YUNIT, XUNIT, YUNIT, hdcmem3, 0, 5*cySource3,cxSource3, cySource3, MERGECOPY);
                           continue;
                      }
                  }
                                                   
              }
              }
                DeleteDC (hdcmem3) ;
              EndPaint (hwnd, &ps) ;
              return 0 ;
        case    WM_LBUTTONDOWN:
                x = LOWORD(lParam)/XUNIT;
                y = HIWORD(lParam)/YUNIT;
                                         
                //雷属性赋值
            if(Dead == 1)break;//结束置dead为一
            else
                {
                        hdc = GetDC(hwnd);
                hdcmem3 = CreateCompatibleDC (hdc) ;
                SelectObject (hdcmem3, hBm3) ;
                if(mineflag[x][y] == 1)
                {
            switch (minestate[x][y] )
            {
            case 0 :
                if(GetAroundNum (x, y) == 0 )
                {
                    ExpandMines(x, y);//周围无雷时扩展无雷区
                                             
                }
                        else
                {         
                    minestate[x][y] = 15 - GetAroundNum (x, y);
                }
                break;
                                          
            case 5: //失败的时候
                Dead = 1;
                minestate[x][y] = 4 ;
                break;
            case 1:
            case 2:
            case 4:
            case 3:
            case 6:
            case 7:
            case 8:
            case 9:
            case 10:
            case 11:
            case 12:
            case 13:
            case 14:
            case 15:
                break ;
            }
                }
            //画雷
          for (x = 0 ; x < CXNUM ; x ++)
              {
             for (y = 0 ; y < CYNUM ; y ++)
              {                         
                                             
                                                       
              switch (minestate[x][y])
                  {
                  case  0 :
                  StretchBlt (hdc, x*XUNIT, y*YUNIT, XUNIT, YUNIT, hdcmem3, 0, (mineflag[x][y] - 1)*cySource3,cxSource3, cySource3, MERGECOPY);
                  continue ;
                  case  3 :
                  case  2 :
                  case  4 :              
                  case 6 :
                  case  7 :
                  case  8 :
                  case  9 :
                  case  10 :
                  case  11:
                  case  12:
                  case  13 :
                  case  14:
                  case  15:
                  StretchBlt (hdc, x*XUNIT, y*YUNIT, XUNIT, YUNIT, hdcmem3, 0, minestate[x][y] * cySource3,cxSource3, cySource3, MERGECOPY);
                    continue ;
                                                  
                      case  5 :
                  switch(Dead)
                      {
                      case 0 :
                          StretchBlt (hdc, x*XUNIT, y*YUNIT, XUNIT, YUNIT, hdcmem3, 0, (mineflag[x][y] - 1) * cySource3,cxSource3, cySource3, MERGECOPY);
                     break ;
                     case 1:      
                         if(mineflag[x][y]== 1)
                            StretchBlt (hdc, x*XUNIT, y*YUNIT, XUNIT, YUNIT, hdcmem3, 0, 5 * cxSource3,cxSource3, cySource3, MERGECOPY);
                         else StretchBlt (hdc, x*XUNIT, y*YUNIT, XUNIT, YUNIT, hdcmem3, 0, (mineflag[x][y] - 1) * cxSource3,cxSource3, cySource3, MERGECOPY);
                         break;
                        return 0;
                  }
              }
             }
                                           
            }
          //此处必须这样,放外面会使重画时失效
                    DeleteDC (hdcmem3) ;              
                ReleaseDC(hwnd, hdc);
                                         
                                         
            }
                                             
                                                 
            return 0;
            case    WM_RBUTTONDOWN:
                x = LOWORD(lParam)/XUNIT;
                y = HIWORD(lParam)/YUNIT;
                hdc = GetDC(hwnd);
                hdcmem3 = CreateCompatibleDC (hdc) ;
               SelectObject (hdcmem3, hBm3) ;
                                                
               //标志赋值
            if((IsInMineArea(x, y) && minestate[x][y] == 0 || minestate[x][y] == 5 )&& Dead == 0)
            { 
                mineflag[x][y] = mineflag[x][y] % 3 + 1;   //实现循环
                                                 
                                         
                StretchBlt (hdc, x*XUNIT, y*YUNIT, XUNIT, YUNIT, hdcmem3, 0, (mineflag[x][y] - 1)*cySource3,cxSource3, cySource3, MERGECOPY);
            }
            else
                MessageBeep(0);     
                DeleteDC (hdcmem3) ;              
                ReleaseDC(hwnd, hdc);
                return 0;
                case    WM_COMMAND://command非commend
                    hmenu = GetMenu (hwnd);               
                    switch(LOWORD (wParam))
                    {
                    case ID_FIRST://初级时
                        CheckMenuItem(hmenu,Select, MF_UNCHECKED);
                        Select = LOWORD(wParam);
                        CheckMenuItem(hmenu,Select, MF_CHECKED);
                        NUM  = 60;
        for (x = 0 ; x < CXNUM ; x ++)
        for (y = 0 ; y < CXNUM ; y ++)
        {
        minestate[x][y] = 0 ;   //初始化雷区状态
        mineflag[x][y] = 1;
        }
        //随机布雷    
        srand((unsigned)GetCurrentTime());
        for( j = 1; j <= NUM; )
            {
            cxmine = abs (rand()%(400));
            cymine = abs (rand()%(400));
                                             
            if ( cxmine < CXNUM && cymine < CYNUM &&  minestate[cxmine][cymine] != 5 )
            {
                minestate[cxmine][cymine] = 5 ;
                j++;
                Dead = 0;//重生
            }
            else continue ;
            }
                    InvalidateRect(hwnd, NULL,TRUE);
                        break;
                    case ID_SECOND: //中级              
                        CheckMenuItem(hmenu,Select, MF_UNCHECKED);
                        Select = LOWORD(wParam) ;// 对于前后要用的值得一用
                        CheckMenuItem(hmenu, Select, MF_CHECKED);
                        NUM  = 100;
                        for (x = 0 ; x < CXNUM ; x ++)
        for (y = 0 ; y < CXNUM ; y ++)
        {
        minestate[x][y] = 0 ;   //初始化雷区状态
        mineflag[x][y] = 1;
        }
        //随机布雷    
        srand((unsigned)GetCurrentTime());
        for( j = 1; j <= NUM; )
            {
            cxmine = abs (rand()%(400));
            cymine = abs (rand()%(400));
                                             
            if ( cxmine < CXNUM && cymine < CYNUM &&  minestate[cxmine][cymine] != 5)
            {
                minestate[cxmine][cymine] = 5 ;
                j++;
                Dead = 0 ;
            }
            else continue ;
            }
                    InvalidateRect(hwnd, NULL,TRUE);//重画
                    break;
                    case ID_MAX://高级
                            CheckMenuItem(hmenu,Select, MF_UNCHECKED);
                        Select = LOWORD(wParam) ;// 对于前后要用的值得一用
                        CheckMenuItem(hmenu, Select, MF_CHECKED);
                        NUM  = 140;
                        for (x = 0 ; x < CXNUM ; x ++)
        for (y = 0 ; y < CXNUM ; y ++)
        {
        minestate[x][y] = 0 ;   //初始化雷区状态
        mineflag[x][y] = 1;
        }
        //随机布雷    
        srand((unsigned)GetCurrentTime());
        for( j = 1; j <= NUM; )
            {
            cxmine = abs (rand()%(400));
            cymine = abs (rand()%(400));
                                             
            if ( cxmine < CXNUM && cymine < CYNUM &&  minestate[cxmine][cymine] != 5 )
            {
                minestate[cxmine][cymine] = 5 ;
                j++;
                                                 
                Dead = 0;
            }
            else continue ;
            }
            InvalidateRect(hwnd, NULL,TRUE);
                        break ;
                                                     
                                                     
                    case ID_EXIT://退出
                SendMessage (hwnd, WM_CLOSE, 0, 0) ;
                break;
                                                         
                                                     
                    case ID_START://重开始
                                for (x = 0 ; x < CXNUM ; x ++)
        for (y = 0 ; y < CXNUM ; y ++)
        {
        minestate[x][y] = 0 ;   //初始化雷区状态
        mineflag[x][y] = 1;
        }
        //随机布雷    
        srand((unsigned)GetCurrentTime());
        for( j = 1; j <= NUM; )
            {
            cxmine = abs (rand()%(400));
            cymine = abs (rand()%(400));
                                             
            if ( cxmine < CXNUM && cymine < CYNUM &&  minestate[cxmine][cymine] != 5 )
            {
                minestate[cxmine][cymine] = 5 ;
                j++;
                Dead = 0;
            }
            else continue ;
            }
                    InvalidateRect(hwnd, NULL,TRUE);
                            break;
                    }
                    return 0 ;
                                                     
        case    WM_DESTROY:
                                             
        //  DeleteObject(hBm1);
        //  DeleteObject(hBm2);
            PostQuitMessage(0);
            DeleteObject(hBm3);
                                                      
        //  DeleteObject(hBm4);
                                         
            return  0;
    }
        return DefWindowProc(hwnd,message, wParam, lParam);
}