|
扫雷
在Windows XP系统中自带了一些娱乐用的小游戏,其中扫雷游戏收到了广大用户的欢迎,那么扫雷游戏是如何实现的呢?本例通过Visual C++来开发一款简单的扫雷游戏。运行本实例,单击“开始”按钮,在蓝色的方块内按下鼠标左键可以翻开当前的方块,翻开后会显示空白、数字和地雷三种情况,用户可以用鼠标右键标记地雷,并可以双击鼠标左键翻开数字周围的方块,效果如图1所示。
关键技术
在设计扫雷游戏时,先在对话框上绘制软件的背景位图,绘制的位图是以一个网格为单位的,然后动随机在网格中随机布雷,并通过算法计算无雷网格中应该显示的数字,如果当前网格周围的8个网格中没有地雷,则显示为空地,否则,周围的8个网格中有几个地雷则显示数字几,当用户翻开空地时,会自动翻开空地周围的数字,通过鼠标右键可以标记地雷,并可以取消地雷标记,用户胜利的条件是将所有地雷都标记出来,如果标记的位置都是地雷的位置则游戏胜利,标记数和地雷数是相同的,所以当标记用完而游戏还没有结束时,说明标记的地雷有错误,这样扫雷游戏就完成了。
设计过程
(1)新建一个基于对话框的应用程序,将其窗体标题改为“扫雷”,勾选Minimize box属性,使对话框具有最小化按钮。
(2)向工程中导入12个BMP位图资源。向对话框中添加两个静态文本控件和一个按钮控件。
(3)处理鼠标左键的按下事件,在该事件的处理函数中根据网格状态进行显示,如果是空地,则翻转周围网格,如果是地雷则结束游戏,其实现代码如下:
void CSweepmineDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
GRID* grid = GetLikeGrid(point); //获得当前网格
if(grid != NULL)
{
grid->m_IsShow = TRUE; //显示当前网格
if(grid->m_State == ncMINE) //如果当前网格是地雷
{
ShowAllMine(); //显示所有地雷
Invalidate(); //重绘窗体
KillTimer(1); //关闭定时器
MessageBox("你输了!"); //提示用户游戏失败
if(MessageBox("是否继续新游戏?","系统提示",MB_YESNO
| MB_ICONQUESTION) == IDYES) //询问用户是否重新游戏
{
OnButstart(); //重新游戏
}
else
OnCancel(); //退出游戏
}
else if(grid->m_State == ncNULL) //如果当前网格是空地
DownNullShow(grid); //显示周围网格
Invalidate(); //重绘窗体
}
CDialog::OnLButtonDown(nFlags, point);
}
秘笈心法
心法领悟594:屏幕的刷新方法
实例中使用CWnd的Invalidate方法来实现的屏幕刷新,Invalidate方法的平凡调用会造成图像的闪烁,可以使用InvalidateRect方法替代,但InvalidateRect方法的使用需要不断计算刷新的区域,所以需要不断的计算显示数字的区域。
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|