虫虫教学

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 507|回复: 0

扫雷

[复制链接]

4449

主题

4659

帖子

4万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
41710

最佳新人发帖达人推广达人热心会员突出贡献优秀讲师

发表于 2021-10-15 18:34:15 | 显示全部楼层 |阅读模式
        扫雷
           在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
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|虫虫教学--虫虫联盟官网

GMT+8, 2025-4-28 23:40 , Processed in 0.091108 second(s), 24 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表