⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 0502001.htm

📁 VC知识库5_chm_decompile_20040520_210715
💻 HTM
字号:
<html>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="GENERATOR" content="Microsoft FrontPage 4.0">
<meta name="ProgId" content="FrontPage.Editor.Document">
<title></title>
<link rel="stylesheet" type="text/css" href="../../vckbase.css">
</head>

<body>

<div align="justify">
  <table border="0" width="100%" class="font" height="57">
    <tr>
      <td width="27%" height="6" class="bigfont" bgcolor="#B8CFE7" align="center" bordercolor="#800080">
      <font color="#800080">VC知识库(五)</font>
      </td>
      <td width="73%" height="6" class="bigfont" bgcolor="#B8CFE7" align="center" bordercolor="#800080">
      <font color="#800080">vckbase</font>
      </td>
    </tr>
    <tr>
      <td width="100%" height="4" class="header" valign="top" align="center" colspan="2">
      <hr>
      </td>
    </tr>
    <tr>
      <td width="100%" height="17" class="header" valign="top" align="center" colspan="2">
      <FONT color=#0000c0>
      用VC++编写扫雷游戏</FONT>
      </td>
    </tr>
    <tr>
      <td width="100%" height="17" class="info" align="center" colspan="2">
      华 中 师 范 大 学 信 息 技 术 系 研98(430079)<BR>王 洪 亚 
      </td>   
    </tr>   
    <tr>  
      <td width="100%" height="22" class="font" colspan="2"> 
        <hr> 
      </td>   
    </tr>  
    <tr>  
      <td width="100%" height="5" class="font" colspan="2">  
      <CENTER><FONT color=#0000c0> 
      </FONT> 
      </CENTER> 
      <P><FONT color=#ffffff>----</FONT> 本 文 从 分 析Windows 扫 雷 游 戏 的 功 能 特 点 开 始,  
      应 用 面 向 对 象 的 可 视 化 编 程 语 言Visual C + + 给 出 了 个 功 能 模 块 的 具 体 实 现 方 法, 并 提  
      供 了 编 写 小 游 戏 程 序 的 一 般 方 法 和Visual C + + 的 一 些 使 用 技 巧。  
      <P><FONT color=#ffffff>----</FONT> 首 先 分 析 扫 雷 的 最 基 本 功 能。  
      <P><FONT color=#ffffff>----</FONT> 点 击 鼠 标 左 键 于 未 知 区 域, 如 果 未 知 区 域 有 雷,  
      游 戏 停 止, 显 示 所 有 的 地 雷。 如 果 没 雷, 则 显 示 周 围 雷 数, 如 果 周 围 没 雷, 则 再 查 看 周 围 八  
      个 区 域 是 否 有 雷 直 到 有 雷 为 止 并 显 示, 这 其 实 是 一 个 递 归 过 程。  
      <P><FONT color=#ffffff>----</FONT> 点 击 鼠 标 右 键 于 未 知 区 域, 则 将 其 置 为 有 雷 而  
      不 管 是 否 真 的 有 雷。 可 选 择 初、 中、 高 三 级 并 可 自 定 义 雷 数 和 区 域 大 ??  
      <P><FONT color=#ffffff>----</FONT> 雷 区 上 部 左 侧 显 示 总 雷 数 减 被 标 明 有 雷 区 域 的  
      数 目。  
      <P><FONT color=#ffffff>----</FONT> 雷 区 上 部 中 间 位 置 显 示 一 按 钮 用 于 开 局 和 显 示  
      鼠 标 动 作 的 结 果。  
      <P><FONT color=#ffffff>----</FONT> 雷 区 上 部 右 侧 显 示 扫 雷 的 时 间。  
      <P><FONT color=#ffffff>----</FONT> 将 雷 全 部 扫 清 后, 则 显 示 一 对 话 框 将 你 的 姓 名  
      记 入 排 行 榜。 以 时 间 排 序。  
      <P><FONT color=#ffffff>----</FONT> 为 完 成 上 述 功 能, 应 用Visual C + + 的 具 体 技  
      术 细 节 如 下:  
      <P><FONT color=#ffffff>----</FONT> 1 . 应 用AppWizard 创 建 基 于SDI 的 应 用 程  
      序CBombApp, 去 除 打 印 和 状 态 条 支 持, 在 资 源 编 辑 器 中 修 改 菜 单 和 相 应 的 加 速 键, 使 其  
      与Windows 扫 雷 游 戏 一 致。 具 体 为 开 局(ID -GAME -BEGIN)、 初 级(ID -GAME -JUNIOR)、 中  
      级(ID -GAME - MIDDLE)、 高 级(ID -GAME -SENIOR)、 自 定 义(ID -GAME -CUSTOM)、 颜  
      色(ID -GAME -COLOR)、 英 雄 榜(ID -GAME -SORT)、 退 出(ID -GAME -EXIT)、 帮 助(ID  
      -HELP)。  
      <P><FONT color=#ffffff>----</FONT> 2 . 在 资 源 编 辑 器 中 对 应 于 雷 区 的 每 个 小 区 域  
      的13 个 属 性。 用 画 笔 或 其 他 绘 图 工 具 绘 制 出 相 对 应 的13 个10 乘10 的16 色 小 位 图, 三 个 对  
      应 于 小 人 表 情 的20 乘20 的16 色 小 位 图, 供 更 换 颜 色 时 使 用 的 一 套 与 前16 个 对 应 的 单 色 位  
      图, 显 示 时 间 和 雷 数 的0 ~9 十 个 数 字 位 图( 底 色 为 黑 色)。  
      <P><FONT color=#ffffff>----</FONT> 定 制CUSTOMER 对 话 框, 内 含 三 个 静 态 文 本 控 件  
      和 三 个 编 辑 控 件, 三 个 编 辑 控 件 分 别 对 应 成 员 m_iRowNum,m_iColumnNum,m_iBombNum。  
      该 对 话 框 用 于 定 制 雷 数, 行 列 数, 其 相 应 的MFC 类 为CCustomer。 定 制SORT 对 话 框, 内 含 九  
      个 静 态 文 本 控 件, 其 中 六 个 显 示 排 行 榜 的 姓 名 和 时 间, 其 对 应 的MFC 类 为 CSort。 定  
      制INPUT 对 话 框, 内 含 一 个 静 态 文 本 控 件 和 一 个 编 辑 控 件, 编 辑 控 件 用 于 在 游 戏 成 功 结 束  
      时 输 入 姓 名, 其 对 应 的MFC 类 为CInput。  
      <P><FONT color=#ffffff>----</FONT> 3 . 定 义 类Bomb, 封 装 每 颗 雷 的 相 关 属 性。 <XMP>Class Bomb 
 { 
 public: 
 int isbomb;//决定初始时是否是雷 
 bool issel; //判断区域是否被处理过且周围  
有雷 
 bool isdone;//判断递归时是否被处理过 
 int num; //周围雷数 
 bool findbomb; //排雷者认为是雷时置一(但  
是不一定真是雷) 
 } ; 
 </XMP><FONT color=#ffffff>----</FONT> 4 . 重 载CMainFrame 中PreCreateWindow,  
      并 设 置 相 应 属 性, 使 其 窗 体 大 小 固 定, 这 样 就 固 定 了 显 示 区 域 的 大 小 为 初 始10 乘10 个 雷  
      和 外 加 雷 区 上 部 的 控 制 区 域, 部 分 代 码 如 下。 <XMP>  
      cs.style=WS_OVERLAPPED|WS_SYSMENU|  
WS_BORDER|WS_MINIMIZEBOX; 
 cs.cy = 10 *15 +6;   
 cs.cx = 10 *15 +60; 
       //6和60分别是横纵的  
       附加值,用于边框、菜单、标题条、控制区域。 
</XMP><FONT color=#ffffff>----</FONT> 5 . 游 戏 的 主 要 工 作 就 是 呈 现 不 断 变 换 的  
      图 形 或 动 画, 并 按 用 户 的 输 入 交 互 进 行 显 示, 而Windows 文 档 - - - - - 视 窗 构 架 中 的 视  
      窗 的 功 能 正 是 接 受 用 户 输 入 并 负 责 显 示, 因 此 由CView 类 来 完 成 扫 雷 的 大 部 分 工 作。  
      在CBombView 中 定 义 下 列 成 员 变 量 记 录 相 关 操 作 的 结 果 或 对 象 的 状 态。 <XMP>Bomb m_bomb[30][30]; //最大的地雷区域 
 CString m_CurrentTime; //用于记录并显示扫雷  
时间 
 CTime m_BeginTime;//记录游戏开始时的时  
 BOOL m_TimerBegin;//定时器是否开启 
 int m_iBomNum;//雷的数目 
 int m_iRow;//雷的行数 
 int m_iColumn;//雷的列数 
 int m_iBombFound;//指示被认为是雷的数目 
 CBitmapButton m_bitButton;//控制区的位图按钮 
 int m_CurrentLevel;//指示当前游戏的级别 
 BOOL m_bIsColor;//指示当前是彩色还是单  
 CBitmap  m_bmBomb[12];//用于存放12个小位  
 int  m_iGameOver;//游戏未结束置0,已清除  
所有的雷置1,被炸死置2。 
</XMP><FONT color=#ffffff>----</FONT> 重 载CBombView 中OnCreate 函 数 创 建 位 图 按  
      钮, 该 位 图 按 钮 的 两 幅 位 图 对 应 了 正 常、 排 雷 正 确 两 种 状 态, 当 要 显 示 被 炸 死 的 状 态 时 应  
      动 态 销 毁 该 按 钮, 并 重 新 创 建 一 位 图 对 应 正 常 和 被 炸 死 两 种 状 态, 将 该 位 图 按 钮 的ID 号  
      定 为 ID_GAME_BEGIN, 这 样 一 来 当 点 击 按 钮 时 便 可 重 新 开 始 游 戏, 部 分 代 码 如 下。 <XMP>  
      CRect rcclient; 
 GetClientRect( &rcclient); 
 CRect rect(rcclient.cx/2 -8,10,rcclient.cx/2 +8,20); 
  
m_Button.Create(“New",BS_DEFPUSHBUTTON|WS_VISIBLE| 
 BS_OWNERDRAW,rect,this,ID_GAME_BEGIN); 
 m_Button.LoadBitmaps(IDB_FACE1, IDB_FACE2); 
</XMP><FONT color=#ffffff>----</FONT> 显 示 时 间 的 功 能 相 对 比 较 简 单, 在 响 应 第 一  
      个WM_LBUTTOMDOWN 消 息 时 开 启 定 时 器, 并 记 录 游 戏 开 始 的 时 间, 在WM_TIME 消 息 响 应 函  
      数OnTimer 中 获 得 当 前 时 间, 减 去 游 戏 开 始 时 的 时 间, 在 显 示 时 间 的 客 户 区 域 显 示 得 到 的  
      时 间 差( 用 数 字 位 图), 当 游 戏 结 束 时( 排 完 全 部 雷 或 被 炸 死) 关 闭 定 时 器, 停 止 显 示。  
      <P><FONT color=#ffffff>----</FONT> WM_LBUTTOMDOWN 消 息 响 应 函 数  
      OnLButtomDown 是 处 理 用 户 输 入 的 主 要 执 行 者, 函 数 首 先 判 断 点 中 位 置 是 否 是 雷, 是 则  
      关 闭 定 时 器, 销 毁 原 位 图 按 钮, 创 建 一 对 应 正 常 和 被 炸 死 两 种 状 态 的 新 位 图 按 钮, 并 调  
      用SetState 将 其 设 置 为PUSHDOWN( 小 人 哭 的 状 态), 将m_bGameOver, 置 为TRUE 标 志 游 戏 结  
      束, 否 则 先 调 用SetState 设 置 位 图 按 钮 为PUSHDOWN ( 小 人 笑 的 状 态), 并 在OnLButtomUp  
      中 设 置 位 图 按 钮 为 正 常 状 态, 然 后 调 用Caculate 函 数 记 下 周 围 雷 的 数 目, 最 后 调  
      用Invalidate 使 客 户 区 无 效, 迫 使 OnDraw 函 数 重 绘 客 户 区 域, 在 调 用Invalidate 时 不 应  
      重 画 背 景, 避 免 闪 烁, 这 样 就 完 成 了 在 雷 区 按 下 左 键 的 响 应 动 作。  
      <P><FONT color=#ffffff>----</FONT> WM_RBUTTOMDOWN 消 息 响 应 函 数  
      OnLButtomDown 将 被 认 为 有 雷 位 置 的m_iBombNum.findbomb 置 一, 减 少 左 上 角 的 雷 记 数,  
      然 后 判 断 是 否 真 正 全 部 排 完 了 雷, 是 则 结 束 游 戏 弹 出INPUT 对 话 框, 让 扫 雷 的 人 输 入 姓  
      名, 在 响 应IDOK 通 知 码 时 将 其 写 入 注 册 表, 没 有 全 部 排 完 则 使 客 户 区 无 效, 迫 使OnDraw 函  
      数 重 绘 客 户 区 域 完 成 在 雷 区 按 下 右 键 的 动 作。  
      <P><FONT color=#ffffff>----</FONT> OnDraw 函 数 在 每 次 点 击 左 键 或 右 键 时 都 会 被  
      调 用 重 雷 区 和 控 制 区 域, 因 为 点 击 情 况 的 复 杂 性 和 雷 属 性 的 多 元 化 导 致OnDraw 函 数 需 要  
      精 心 设 计, 下 面 为 其 流 程:  
      <P><IMG align=center src="../../images/0024000.jpg" width="283" height="452">  
      <P><FONT color=#ffffff>----</FONT> 函 数Caculate 计 算 某 个 雷 周 围 的 雷 数, 根 据 前  
      面 的 分 析 知 道, 计 算 某 个 雷 周 围 的 雷 数 本 身 就 是 一 个 递 归 过 程, 在 编 制 时 应 注 意 递 归 的  
      边 界 条 件, 稍 不 注 意 会 陷 入 无 穷 递 归 而 耗 尽 了 系 统 的 资 源, 下 面 为 其 流 程:  
      <P><IMG align=center src="../../images/0024001.jpg" width="283" height="472">  
      <P><FONT color=#ffffff>----</FONT> 6 . 菜 单 命 令 的 响 应 是 游 戏 交 互 的 另 一 个 重 要  
      方 式, 下 面 的 九 个 命 令 响 应 函 数 分 别 与 九 个 菜 单 项 相 对 应, 用 以 完 成 用 户 的 更 新 和 设 置  
      命 令。  
      <P><FONT color=#ffffff>----</FONT> OnGameBegin 完 成 初 始 时 间 清 零, 随 机 布 雷, 依  
      据 颜 色 指 示 装 载12 幅 小 位 图, 使 雷 区 无 效 调 用OnDraw 重 绘 等 工 作。 其 中 随 机 布 雷 就 是 多  
      次 调 用rand(), 根 据 其 返 回 值 决 定 m_bomb[I][j].isbomb 的 值。  
      <P><FONT color=#ffffff>----</FONT> OnGameCustom 首 先 弹 出CCustomer 对 话 框, 在  
      用 户 输 入 设 置 后 响 应IDOK 通 知 码 时 将 用 户 输 入 的 雷 数、 行 列 数 分 别 赋 给CView 的 数 据 成  
      员m_iBombNum、m_iRow、m_iColumn, 得 到 框 架 窗 口 的 指 针, 用 其 调 用MoveWindow 将 窗 口 调  
      至 所 需 大 小, 销 毁 原 位 置 的 位 图 按 钮, 并 在X 轴 坐 标 为 新 窗 口 宽1/2 减8 处,Y 轴 坐 标 为 新 窗  
      口 顶 部 加30 的 位 置 创 建 一 新 按 钮。 最 后 调 用OnGameBegin 重 新 开 始 游 戏。  
      <P><FONT color=#ffffff>----</FONT> OnGameJunior、OnGameMiddle、OnGameSenior  
      三 个 函 数 与OnGameCustom 类 似, 只 不 过 将 分 别 赋 给CView 的 数 据 成 员  
      m_iBombNum、m_iRow、m_iColumn 以 固 定 的 值, 其 大 小 可 由 编 程 者 自 定, 笔 者 定  
      为Junior(20,8,8,)、Middle(40,13,13)、Senior(99,20,25)。  
      <P><FONT color=#ffffff>----</FONT> OnGameColor 函 数 销 毁 原 位 图 按 钮, 根 据 重 新  
      装 载 位 图 的 标 志m_IsColor 来 创 建 新 的 位 图 按 钮, 将 装 载12 幅 单 色 位 图 的 标 志 取 反, 调  
      用OnGameBegin 重 新 开 始 游 戏。  
      <P><FONT color=#ffffff>----</FONT> OnGameSort 函 数 根 据 当 前 游 戏 级 别 从 注 册 表  
      中 读 出 排 名 并 弹 出SORT 对 话 框 显 示 结 果。 到 现 在 为 止, 一 个 自 己 编 制 的 扫 雷 游 戏 就 基 本  
      完 成 了, 将 数 百 行 代 码 编 译 一 下, 找 出 小 错 误, 最 后BUILD 一 遍,RUN 一 下, 好 了, 可 爱 的 扫  
      雷 游 戏 就 出 现 在 你 的 面 前 了。 怎 么 样, 自 己 的 劳 动 成 果 并 不 比Microsoft 的 差 吧, 而 且 你  
      还 可 以 把 小 位 图 画 成 各 种 样 子, 当 然 你 自 己 要 认 得 出 才 行 了。 
      </td>    
    </tr>   
    <tr>
      <td width="100%" height="12" class="font" colspan="2"> 
      </td>    
    </tr>
    <tr>
      <td width="100%" height="6" class="font" colspan="2"> 
      </td>    
    </tr>
    <tr>
      <td width="100%" height="8" class="font" colspan="2"> 
      </td>    
    </tr>
    <tr>   
      <td width="100%" height="17" class="font" colspan="2"></td>    
    </tr>   
  </table>    
</div>    
    
</body>    
    
</html>    

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -