打地鼠游戏的核心就是一个随机和一个坐标检测。随机的是地鼠(目标矩形)的位置,鼠标单击后就得到当前的鼠标的坐标,然后检测坐标是否在地鼠头部的范围内。如果在这个范围内,就表示击中了,就要加分。然后显示总分。
MFC实现这个不难,下面看代码,代码的解释请看原文,说的很清楚《win32实现的最简单的打地鼠游戏》:
void C打地鼠Dlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// 使图标在工作区矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
PAINTSTRUCT ps;
p1DC=BeginPaint(&ps);
p1DC->SelectObject(GetStockObject(GRAY_BRUSH));
p1DC->Rectangle(rect);
lp=msg.AllocSysString();
wsprintf(lp,_T("当前得分:%d"),sum*100);
p1DC->TextOutW(0,0,lp);
EndPaint(&ps);
CDialogEx::OnPaint();
}
}
//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR C打地鼠Dlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
void C打地鼠Dlg::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CDC* pDC=GetDC();
if(PtInRect(&rect,point))
{
sum++;
pDC->Ellipse(rect);
}
ReleaseDC(pDC);
CDialogEx::OnLButtonDown(nFlags, point);
}
void C打地鼠Dlg::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
GetClientRect(rectClient);
rect.left=rand()%(rectClient.right-200);
rect.right=rect.left+100;
rect.top=rand()%(rectClient.bottom-200);
rect.bottom=rect.top+100;
Invalidate();
CDialogEx::OnTimer(nIDEvent);
}
int C打地鼠Dlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CDialogEx::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: 在此添加您专用的创建代码
SetTimer(1,1000,NULL);
return 0;
}