模拟打地鼠游戏

来源:互联网 发布:凯里欧文总决赛数据 编辑:程序博客网 时间:2024/06/11 21:59

 

#include<windows.h>
#include<time.h>
//#include "mmsystem.h"
#include "resource.h"
#include <stdio.h>
#pragma comment(lib,"msimg32.lib")
#pragma comment(lib,"winmm.lib")


HINSTANCE G_hInst=NULL; 

HDC G_BitMapBCDC=NULL;
HDC G_BitMapBKDC=NULL;
HDC G_BitMapHoleDC=NULL;
HDC G_BitMapMouseDC=NULL;
HDC G_BitMapBoomDC=NULL;

long CALLBACK WndProc(HWND hWnd, int message, int wParam, int lParam);
HDC LoadBitMapToDC(HINSTANCE hInst,char * fileName);
HDC LoadBitMapToDC(HINSTANCE hInst,char * fileName,long& width,long& height);

long BKWidth=800, BKHeight=533;
long HoleIndex=0;
long HoleWidth=0,HoleHeight=0;
long MouseWidth=0,MouseHeight=0;
long MouseX=0,MouseY=0;
long HoleX=0,HoleY=0;
static int i=0,score=0;
static int click=0,sumclick=0;
static int m=2;     //总共时间
static int second=1;   //剩余时间
double mzl=0.0;  //命中率


RECT ClientRect;

HDC LoadBitMapToDC(HINSTANCE hInst,char * fileName)
{
 HBITMAP hBitMap=(HBITMAP)LoadImage(hInst,fileName,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);

 HDC hBitMapDC = ::CreateCompatibleDC(NULL);

    ::SelectObject(hBitMapDC,hBitMap);

 ::DeleteObject(hBitMap);

 return hBitMapDC;
}

HDC LoadBitMapToDC(HINSTANCE hInst,char * fileName,long& width,long& height)
{
  HBITMAP hBitMap =(HBITMAP)LoadImage(hInst, fileName,IMAGE_BITMAP,0,0,LR_LOADFROMFILE | LR_CREATEDIBSECTION);

     //获取位图的宽度和高度
  DIBSECTION dib;
  ::GetObject(hBitMap,sizeof(dib),&dib);
  BITMAPINFOHEADER bm=dib.dsBmih;
  width=bm.biWidth;
  height=bm.biHeight;

  HDC hBitMapDC=::CreateCompatibleDC(NULL);

  ::SelectObject(hBitMapDC,hBitMap);

  ::DeleteObject(hBitMap);

  return hBitMapDC;
}

//7、消息处理
long CALLBACK WndProc(HWND hWnd, int message, int wParam, int lParam)
{
 switch (message)
 {
     case WM_CREATE:
  {
   GetClientRect(hWnd,&ClientRect);
      SetTimer(hWnd,1,500,NULL);
   
           G_BitMapBKDC = LoadBitMapToDC(G_hInst,"bmp01.bmp",BKWidth,BKHeight);
     G_BitMapHoleDC = LoadBitMapToDC(G_hInst,"bmp02.bmp",HoleWidth,HoleHeight);
     G_BitMapMouseDC = LoadBitMapToDC(G_hInst,"bmp03.bmp",MouseWidth,MouseHeight);

    ::GetClientRect(hWnd,&ClientRect);
     break;
  }

  case WM_TIMER:
  {
   ::sndPlaySound("dodo.wav",SND_NOSTOP | SND_ASYNC);
   HDC hDc=::GetDC(hWnd);
   
   RECT rect;
   ::GetClientRect(hWnd,&rect);

   if(sumclick==0) sumclick=1;
   mzl=(double)click/sumclick*100;

   //伸展图片
      ::StretchBlt(hDc,0,0,
             rect.right-rect.left,
       rect.bottom-rect.top,
       G_BitMapBKDC,0,0,BKWidth,BKHeight,SRCCOPY); 
    
   //获取背景透明颜色
             int Color=::GetPixel(G_BitMapHoleDC,0,0);
   
   ::TransparentBlt(hDc,200,270,HoleWidth,HoleHeight,G_BitMapHoleDC,0,0,HoleWidth,HoleHeight,Color);
   ::TransparentBlt(hDc,400,270,HoleWidth,HoleHeight,G_BitMapHoleDC,0,0,HoleWidth,HoleHeight,Color);
   ::TransparentBlt(hDc,600,270,HoleWidth,HoleHeight,G_BitMapHoleDC,0,0,HoleWidth,HoleHeight,Color);
   ::TransparentBlt(hDc,250,370,HoleWidth,HoleHeight,G_BitMapHoleDC,0,0,HoleWidth,HoleHeight,Color);
   ::TransparentBlt(hDc,450,370,HoleWidth,HoleHeight,G_BitMapHoleDC,0,0,HoleWidth,HoleHeight,Color);
   ::TransparentBlt(hDc,650,370,HoleWidth,HoleHeight,G_BitMapHoleDC,0,0,HoleWidth,HoleHeight,Color);
   ::TransparentBlt(hDc,300,470,HoleWidth,HoleHeight,G_BitMapHoleDC,0,0,HoleWidth,HoleHeight,Color);
   ::TransparentBlt(hDc,492,470,HoleWidth,HoleHeight,G_BitMapHoleDC,0,0,HoleWidth,HoleHeight,Color);
   ::TransparentBlt(hDc,700,470,HoleWidth,HoleHeight,G_BitMapHoleDC,0,0,HoleWidth,HoleHeight,Color);
  
   //地鼠随机出现
   ::srand(time(NULL));

      HoleIndex = ::rand()%8;
   Color=::GetPixel(G_BitMapHoleDC,0,0);

   for(int i=0;i<9;i++)
   {
    switch(HoleIndex)
    {
     case 0: MouseX=200; MouseY=270; break;
     case 1: MouseX=400; MouseY=270; break;
     case 2: MouseX=600; MouseY=270; break;
     case 3: MouseX=250; MouseY=370; break;
                    case 4: MouseX=450; MouseY=370; break;
     case 5: MouseX=650; MouseY=370; break;
                    case 6: MouseX=300; MouseY=470; break;
     case 7: MouseX=492; MouseY=470; break;
                    case 8: MouseX=700; MouseY=470; break;
    }

    Color = ::GetPixel(G_BitMapMouseDC,0,0);
    ::TransparentBlt(hDc,MouseX,MouseY-10,MouseWidth,MouseHeight,G_BitMapMouseDC,0,0,MouseWidth,MouseHeight,Color);
   }

   char a[10];  //限定时间
   char b[10];  //剩余时间
   char c[10];  //命中率
   char d[10];  //得分

   sprintf(a," %d 分",m);
   SetBkColor(hDc,RGB(255,255,0));
   TextOut(hDc,142,63,a,strlen(a));

   second--;
   sprintf(b," %02d 秒",second);
   TextOut(hDc,132,135,b,strlen(b));

   if(second<0)
   {
    int result; 
    KillTimer(hWnd,1);
    result = MessageBox(NULL,"GOME OVER /n/n点确定后/n再按Enter键可重新开始","游戏结束",MB_OK);
    second=120;  
    score=0;
    click=0;
    sumclick=0;
   }
  
   

   sprintf(c," %.2lf%%",mzl);
   TextOut(hDc,122,212,c,strlen(c));
   
   sprintf(d,"%2d",score);
   TextOut(hDc,98,290,d,strlen(d));
 
   ReleaseDC(hWnd,hDc); 
   break;
  }
  case WM_KEYDOWN:
  {
   switch(wParam)
   {
    case VK_RETURN: SetTimer(hWnd,1,1000,NULL);

    break;
   }
  }
  case WM_LBUTTONDOWN:
  {
   int X=LOWORD(lParam);
   int Y = HIWORD(lParam);

   HDC hDc=::GetDC(hWnd);
      if(X>=MouseX && X<=MouseX+MouseWidth && Y>=MouseY && Y<=MouseY+MouseHeight)
   {
    ::sndPlaySound("habi.wav", SND_ASYNC | SND_SYNC);
    Sleep(500);
    ::TransparentBlt(hDc,MouseX,MouseY,MouseWidth,MouseHeight,G_BitMapHoleDC,0,0,HoleWidth,HoleHeight,NULL);
    score+=5;
    click++; 
   }
   else
   {
    ::TransparentBlt(hDc,MouseX,MouseY,MouseWidth,MouseHeight,G_BitMapMouseDC,0,0,HoleWidth,HoleHeight,NULL);
    ::sndPlaySound("bfire.wav", SND_ASYNC | SND_SYNC);
   }
   
   sumclick++;
   break;
  }
 
  case WM_SIZE:
  {
   ::GetClientRect(hWnd,&ClientRect);
   break;
  }
  case WM_DESTROY:
  {
  
   ::DeleteObject(G_BitMapBKDC);
   G_BitMapBKDC=NULL;
   ::DeleteObject(G_BitMapHoleDC);
   G_BitMapHoleDC=NULL;
   
   PostQuitMessage(0);
   ::KillTimer(hWnd,1);

   break;
  }
 
  default:
   return DefWindowProc(hWnd, message, wParam, lParam);
   }
   return 0;
}

int _stdcall WinMain(HINSTANCE hInstance,
    HINSTANCE hPrelnstance,
    LPSTR lpCmdLine,
    int nShowCmd)
{
    G_hInst = hInstance;

 //1、设置窗体属性
 WNDCLASSEX wcex;
   
 // 结构体的大小
 wcex.cbSize = sizeof(WNDCLASSEX);
 // 窗体类的样式
 wcex.style = CS_HREDRAW | CS_VREDRAW;
 // *窗体回调函数
 wcex.lpfnWndProc = (WNDPROC)WndProc;
   // 窗体类额外字节数,通常为0
 wcex.cbClsExtra  = 0;
 // 窗体实例额外字节数,通常为0
 wcex.cbWndExtra  = 0; 
 // *应用程序实例句柄
 wcex.hInstance  = hInstance;     
 wcex.hIcon   = NULL;       // 窗体大图标
 wcex.hCursor  = LoadCursor(NULL,IDC_NO);//LoadIcon( G_hInst, MAKEINTRESOURCE(IDI_ICON1) );//::LoadIcon(G_hInst, "IDI_MYICON");       // // 窗体鼠标光标样式
 wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+7);  // 窗体背景色
 wcex.lpszMenuName = NULL;       // 窗体主菜单
 // *窗体类名称
 wcex.lpszClassName = "Bekty";     
 wcex.hIconSm  =NULL;//LoadIcon( G_hInst, MAKEINTRESOURCE(IDI_ICON2) );// NULL;//LoadIcon(G_hInst,"IDI_MYICON");       // 窗体小图标
 
 //2、注册窗体
 RegisterClassEx(&wcex);

 //3、创建窗体
 HWND hWnd = CreateWindow(
  "Bekty",    // *窗体类名称
  "地鼠游戏城",    // 窗体标题名
  WS_OVERLAPPEDWINDOW, // 窗体外观样式
  0,   // 窗体在屏幕上的水平位置
  0,      // 窗体在屏幕上的垂直位置
  CW_USEDEFAULT,   // 窗口的宽度
  0,      // 窗口的高度
  NULL,     // 父窗体句柄
  NULL,     // 窗口菜单句柄
  hInstance,    // *创建窗体的应用程序实例句柄
  NULL);     // 创建窗体时的额外信息,通常为NULL
 
 if (NULL == hWnd)
 {
  return FALSE;
 }

 //4、显示窗体
 ShowWindow(hWnd, nShowCmd);

 //5、 更新窗体
 UpdateWindow(hWnd);

 //6、主消息循环
 MSG msg;
 while (GetMessage(&msg, NULL, 0, 0)) // 从消息队列中获取消息
 {
  TranslateMessage(&msg);  // 转换消息
  DispatchMessage(&msg);  // 分发消息给回调函数
 }

 return msg.wParam;
 
}

 


 

原创粉丝点击