用vc++实现vc mfc扫雷编程教程游戏程序 maximize box是什么意思

新版扫雷游戏设计与实现 正文_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
新版扫雷游戏设计与实现 正文
上传于||文档简介
&&毕​业​设​计
阅读已结束,如果下载本文需要使用3下载券
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩24页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢扫雷游戏制作过程(C#描述):第一节、创建项目 - 为程序员服务
扫雷游戏制作过程(C#描述):第一节、创建项目
这一系列的文章主要受许宏旭的启发而来。他目前在连载更新一篇使用C#制作五子棋的教程。选择这一项目的主要原因是Windows 8.1系统上的扫雷需要前往应用商店下载,显得有些麻烦。因此想自己制作一个。主要采用C#语言进行实现。主要功能与原来的扫雷游戏基本相同,进行修改的地方主要是扫雷区的界面。如有不恰当的地方,还望指正。
该项目现已根据文章进度托管在上,读者可以自行查看。
玩过扫雷的读者应该知道,扫雷需要用到三种图片素材——地雷、红旗、问号。当右击一个方块的时候,会插上红旗,表示游戏者认为该方块内有地雷;再次右击该方块,会变成问号,表示不确定该方块内是否有地雷;第三次右击该方块,问号消失,恢复到初始的状态。我们前往寻找合适的图标,并且通过Photoshop或者Illustrator的处理得到我们所需要的图标。文章中含有下载地址的图标资源可以使用右键—目标另存为进行下载。
通过一定的搜索以及图片的处理,我们得到了下面一组素材图标,下载地址:、、。
除了这些素材以外,我们还需要找一个图标,使得整个程序看上去更加正式一点,这里使用图标如下,注意程序图标的后缀为ico,下载地址:。
接下来,我们打开Visual Studio 2013开始创建工程,界面如下:
依次展开文件—新建—项目,选择“Visual C#”中的“Windows 窗体应用程序”,项目名称填写为“Minesweeper”,单击确定创建项目。如下图所示:
创建好的项目如下图所示。
我们需要对这个窗口的几项属性进行修改,首先通过Text属性将它的标题修改为“Minesweeper”;通过FormBorderStyle属性将它的大小设置为“FixedSingle”,即为不可调节窗口大小; 通过MaximizeBox属性将它的最大化按钮设置为“False”,即最大化按钮失效;通过Name属性将它的名称修改为“Form_Main”,修改这个属性主要用于后面书写代码的方便; 通过BackColor属性将它的背景修改为“White”。如下图所示:
我们可以顺便修改一下这个窗口的代码文件的名称。在右上方找到解决方案资源管理器,右击Form_1.cs—重命名—Form_Main.cs,程序会自动将下面包含的文件名也都改成一致的名称。如图所示:
接下来我们需要修改一下程序的图标,将刚才下载的favicon文件放到Minesweeper/Minesweeper文件夹下,同时将三个图标资源放到Minesweeper/Minesweeper/Resources文件夹下(Resources文件夹需要自己新建),如下图所示:
在属性栏中找到Icon属性,并且定位到favicon.ico文件,如下图所示:
此时,我们按下快捷键Ctrl + S对整个工程进行保存,并且按下快捷键Ctrl + F5运行查看我们的程序,效果如下:
到目前为止,我们的程序只是一个空白的界面,下一节中我们将介绍程序的界面布局的设计。
上善若水,大道至简。
原文地址:, 感谢原作者分享。
您可能感兴趣的代码2191人阅读
用VC++编写扫雷游戏
华中师范大学信息技术系研98(430079) 王洪亚
本文从分析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
//决定初始时是否是雷
//判断区域是否被处理过且周围有雷
//判断递归时是否被处理过
//周围雷数
//排雷者认为是雷时置一(但是不一定真是雷)
4. 重载CMainFrame中PreCreateWindow,并设置相应属性,使其窗体大小固定,这样就固定了显示区域的大小为初始10乘10个雷和外加雷区上部的控制区域,部分代码如下。
cs.style=WS_OVERLAPPED|WS_SYSMENU| WS_BORDER|WS_MINIMIZEBOX;
cs.cy = 10*15+6;
cs.cx = 10*15+60; //6和60分别是横纵的附加值,用于边框、菜单、标题条、控制区域。
5. 游戏的主要工作就是呈现不断变换的图形或动画,并按用户的输入交互进行显示,而Windows文档-----视窗构架中的视窗的功能正是接受用户输入并负责显示,因此由CView类来完成扫雷的大部分工作。在CBombView中定义下列成员变量记录相关操作的结果或对象的状态。
Bomb m_bomb[30][30]; //最大的地雷区域
CString m_CurrentT //用于记录并显示扫雷时间
CTime m_BeginT//记录游戏开始时的时间
BOOL m_TimerB//定时器是否开启
int m_iBomN//雷的数目
int m_iR//雷的行数
int m_iC//雷的列数
int m_iBombF//指示被认为是雷的数目
CBitmapButton m_bitB//控制区的位图按钮
int m_CurrentL//指示当前游戏的级别
BOOL m_bIsC//指示当前是彩色还是单色
CBitmap m_bmBomb[12];//用于存放12个小位图
int m_iGameO//游戏未结束置0,已清除所有的雷置1,被炸死置2。
重载CBombView中OnCreate函数创建位图按钮,该位图按钮的两幅位图对应了正常、排雷正确两种状态,当要显示被炸死的状态时应动态销毁该按钮,并重新创建一位图对应正常和被炸死两种状态,将该位图按钮的ID号定为ID_GAME_BEGIN,这样一来当点击按钮时便可重新开始游戏,部分代码如下。
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标志游戏结束,否则先调用SetState 设置位图按钮为PUSHDOWN (小人笑的状态),并在OnLButtomUp中设置位图按钮为正常状态,然后调用Caculate函数记下周围雷的数目,最后调用Invalidate使客户区无效,迫使OnDraw函数重绘客户区域,在调用Invalidate时不应重画背景,避免闪烁,这样就完成了在雷区按下左键的响应动作。
WM_RBUTTOMDOWN消息响应函数OnLButtomDown将被认为有雷位置的m_iBombNum.findbomb置一,减少左上角的雷记数,然后判断是否真正全部排完了雷,是则结束游戏弹出INPUT对话框,让扫雷的人输入姓名,在响应IDOK通知码时将其写入注册表,没有全部排完则使客户区无效,迫使OnDraw函数重绘客户区域完成在雷区按下右键的动作。
OnDraw函数在每次点击左键或右键时都会被调用重雷区和控制区域,因为点击情况的复杂性和雷属性的多元化导致OnDraw函数需要精心设计,下面为其流程:图1
函数Caculate计算某个雷周围的雷数,根据前面的分析知道,计算某个雷周围的雷数本身就是一个递归过程,在编制时应注意递归的边界条件,稍不注意会陷入无穷递归而耗尽了系统的资源,下面为其流程:
6. 菜单命令的响应是游戏交互的另一个重要方式,下面的九个命令响应函数分别与九个菜单项相对应,用以完成用户的更新和设置命令。
OnGameBegin完成初始时间清零,随机布雷,依据颜色指示装载12幅小位图,使雷区无效调用OnDraw重绘等工作。其中随机布雷就是多次调用rand(),根据其返回值决定m_bomb[I][j].isbomb的值。
OnGameCustom首先弹出CCustomer对话框,在用户输入设置后响应IDOK通知码时将用户输入的雷数、行列数分别赋给CView的数据成员m_iBombNum、m_iRow、m_iColumn,得到框架窗口的指针,用其调用MoveWindow将窗口调至所需大小,销毁原位置的位图按钮,并在X轴坐标为新窗口宽1/2减8处,Y轴坐标为新窗口顶部加30的位置创建一新按钮。最后调用OnGameBegin重新开始游戏。
OnGameJunior、OnGameMiddle、OnGameSenior三个函数与OnGameCustom类似,只不过将分别赋给CView的数据成员m_iBombNum、m_iRow、m_iColumn以固定的值,其大小可由编程者自定,笔者定为Junior(20,8,8,)、Middle(40,13,13)、Senior(99,20,25)。
OnGameColor函数销毁原位图按钮,根据重新装载位图的标志m_IsColor来创建新的位图按钮,将装载12幅单色位图的标志取反,调用OnGameBegin重新开始游戏。
OnGameSort函数根据当前游戏级别从注册表中读出排名并弹出SORT对话框显示结果。到现在为止,一个自己编制的扫雷游戏就基本完成了,将数百行代码编译一下,找出小错误,最后BUILD一遍,RUN一下,好了,可爱的扫雷游戏就出现在你的面前了。怎么样,自己的劳动成果并不比Microsoft的差吧,而且你还可以把小位图画成各种样子,当然你自己要认得出才行了。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:2542481次
积分:34881
积分:34881
排名:第98名
原创:939篇
评论:1616条
(2)(1)(1)(7)(15)(17)(2)(5)(5)(2)(2)(8)(3)(12)(12)(14)(5)(16)(18)(9)(3)(5)(6)(1)(3)(10)(6)(1)(4)(1)(2)(4)(4)(2)(2)(4)(3)(3)(13)(4)(2)(1)(10)(4)(5)(9)(4)(4)(3)(1)(1)(3)(4)(2)(6)(8)(5)(4)(9)(12)(14)(11)(6)(1)(2)(1)(4)(4)(19)(8)(21)(2)(36)(9)(1)(1)(3)(2)(1)(1)(7)(53)(5)(13)(14)(28)(25)(66)(29)(105)(41)(22)(48)(8)
() () () ()

我要回帖

更多关于 maximizebox 的文章

 

随机推荐