Cmin里怎么写扫雷( 二 )


重载cbombview中oncreate函数创建位图按钮,该位图按钮的两幅位图对应了正常、排雷正确两种状态,当要显示被炸死的状态时应动态销毁该按钮,并重新创建一位图对应正常和被炸死两种状态,将该位图按钮的id号定为id_game_begin,这样一来当点击按钮时便可重新开始游戏,部分代码如下 。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); 显示时间的功能相对比较简单,在响应第一个wm_lbuttomdown消息时开启定时器,并记录游戏开始的时间,在wm_time消息响应函数ontimer中获得当前时间,减去游戏开始时的时间,在显示时间的客户区域显示得到的时间差(用数字位图),当游戏结束时(排完全部雷或被炸死)关闭定时器,停止显示 。
wm_lbuttomdown消息响应函数onlbuttomdown是处理用户输入的主要执行者,函数首先判断点中位置是否是雷,是则关闭定时器,销毁原位图按钮,创建一对应正常和被炸死两种状态的新位图按钮,并调用setstate将其设置为pushdown(小人哭的状态),将m_bgameover,置为true标志游戏结束,否则 。
2.如何用C++写扫雷用VC++编写扫雷游戏用VC++编写扫雷游戏 王洪亚 本文从分析windows扫雷游戏的功能特点开始,应用面向对象的可视化编程语言visual c++给出了个功能模块的具体实现方法,并提供了编写小游戏程序的一般方法和visual c++的一些使用技巧 。
首先分析扫雷的最基本功能 。点击鼠标左键于未知区域,如果未知区域有雷,游戏停止,显示所有的地雷 。
如果没雷,则显示周围雷数,如果周围没雷,则再查看周围八个区域是否有雷直到有雷为止并显示,这其实是一个递归过程 。点击鼠标右键于未知区域,则将其置为有雷而不管是否真的有雷 。
可选择初、中、高三级并可自定义雷数和区域大小 。雷区上部左侧显示总雷数减被标明有雷区域的数目 。
雷区上部中间位置显示一按钮用于开局和显示鼠标动作的结果 。雷区上部右侧显示扫雷的时间 。
将雷全部扫清后,则显示一对话框将你的姓名记入排行榜 。以时间排序 。
为完成上述功能,应用visual c++的具体技术细节如下: 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) 。
2. 在资源编辑器中对应于雷区的每个小区域的13个属性 。用画笔或其他绘图工具绘制出相对应的13个10乘10的16色小位图,三个对应于小人表情的20乘20的16色小位图,供更换颜色时使用的一套与前16个对应的单色位图,显示时间和雷数的0~9十个数字位图(底色为黑色) 。
定制customer对话框,内含三个静态文本控件和三个编辑控件,三个编辑控件分别对应成员m_irownum,m_icolumnnum,m_ibombnum 。该对话框用于定制雷数,行列数,其相应的mfc类为ccustomer 。
定制sort对话框,内含九个静态文本控件,其中六个显示排行榜的姓名和时间,其对应的mfc类为csort 。定制input对话框,内含一个静态文本控件和一个编辑控件,编辑控件用于在游戏成功结束时输入姓名,其对应的mfc类为cinput 。
3. 定义类bomb,封装每颗雷的相关属性 。class bomb { public: int isbomb;//决定初始时是否是雷 bool issel; //判断区域是否被处理过且周围有雷 bool isdone;//判断递归时是否被处理过 int num; //周围雷数 bool findbomb; //排雷者认为是雷时置一(但是不一定真是雷) } ; 4. 重载cmainframe中precreatewindow,并设置相应属性,使其窗体大小固定,这样就固定了显示区域的大小为初始10乘10个雷和外加雷区上部的控制区域,部分代码如下 。