C++扫雷.docx
- 文档编号:8202975
- 上传时间:2023-01-29
- 格式:DOCX
- 页数:25
- 大小:795.63KB
C++扫雷.docx
《C++扫雷.docx》由会员分享,可在线阅读,更多相关《C++扫雷.docx(25页珍藏版)》请在冰豆网上搜索。
C++扫雷
扫雷
1.1. 游戏实现
扫雷,是附带在Window里面的游戏,是个简单的游戏。
因此我们就从扫雷开始我们的游戏旅程。
很多人都玩过这个游戏,只是不知道怎么用程序实现。
不过还有人不知道怎么玩,下面就先说说游戏的规则:
●开始:
按左键开始游戏,按按钮或菜单重新开始。
●左键:
按下时,是雷则结束,非雷则显示数字。
●数字:
代表此数字周围一圈八格中雷的个数。
●右键:
奇次按下表示雷,偶数按下表示对上次的否定。
●结束:
左键按到雷结束,找出全部雷结束。
接下来就该介绍游戏的编程过程了。
不过要先交代一下一些内容。
●添加位图。
●添加全局变量。
●画初始界面。
●添加函数。
为什么要按这种次序呢?
因为我们在画初始界面时,可能要用到位图或变量,而变量的定义又可能要对位图进行定义。
这样的步骤的好处还有:
在做一步之后都可以运行,有错就改,无错就做下一步。
上图是扫雷的一个画面。
下面就一步一步地演示,以编程的思路进行,当然,由于编程过程中有一些函数中的代码是分成两三次写的,我们就不重复,全部代码在第一次讲到时列出,而后面讲到时就只是提一下。
新建单文档工程2_1。
2.2. 资源编辑
添加位图:
前十二幅是在雷区的,后四幅是按钮。
为了便于加载,必须各自保证其连续性。
另外,为什么不添加一个按钮而用位图呢?
是因为即使我们添加了按钮也要添加四幅位图!
位图的ID号:
按扭位图:
30*30IDB_ANNIU1、IDB_ANNIU2、IDB_ANNIU3、IDB_ANNIU4
雷区位图:
14*14ID号按下图依次为:
IDB_BITMAP14。
。
。
。
。
。
IDB_BITMAP25
位图:
下图(图2-1)。
图2-1
位图的ID号:
按扭位图30*30IDB_BITMAP1、IDB_BITMAP2、IDB_BITMAP3、IDB_BITMAP4
雷区位图14*14ID号按下图依次为:
IDB_BITMAP5……IDB_BITMAP16
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
icon
3.3. 变量函数
定义新类:
对于雷,我们是单独定义一个类,这样有利于程序的操作。
classLeiMine
{
public:
//显示哪一个位图
intweitu;bitmap
//这个位置相应的值
intshumu;index
};
并有如下规定(图2-2):
图2-2
视图类变量:
接着是在View类添加变量和函数:
//剩下雷数
intleftnum;
//雷数
intleinum;minenum
//结束
intjieshu;endflag
//计时
shortsecond;
//开始计时
intsecondstart;
//位图数组
CBitmapm_Bitmap[12];bitmap
//按扭位图数组
CBitmapm_anniu[4];button
//雷区行数
intm_RowCount;row
//雷区列数
intm_ColCount;line
//最大雷区
Leilei[50][50];Minemine
//这个位置周围雷数为0
voidleizero();
//计时器函数
afx_msgvoidOnTimer(UINTnIDEvent);
//鼠标按下左键
afx_msgvoidOnLButtonDown(UINTnFlags,CPointpoint);
//鼠标按下右键
afx_msgvoidOnRButtonDown(UINTnFlags,CPointpoint);
//初始化函数
afx_msgintOnCreate(LPCREATESTRUCTlpCreateStruct);
//鼠标左键松开
afx_msgvoidOnLButtonUp(UINTnFlags,CPointpoint);
4.4. 具体实现
删去状态栏和工具栏:
开始执行程序,就能见到一个有状态栏和工具栏的大的单文档,与上图不同,所以我们第一步就是整理框架:
打开下面函数,把里面的一些语句去掉。
如下所示:
intCMainFrame:
:
OnCreate(LPCREATESTRUCTlpCreateStruct)
{
if(CFrameWnd:
:
OnCreate(lpCreateStruct)==-1)
return-1;
/*if(!
m_wndToolBar.CreateEx(this,TBSTYLE_FLAT,WS_CHILD|WS_VISIBLE|CBRS_TOP
|CBRS_GRIPPER|CBRS_TOOLTIPS|CBRS_FLYBY|CBRS_SIZE_DYNAMIC)||
!
m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
{
TRACE0("Failedtocreatetoolbar\n");
return-1;//failtocreate
}
if(!
m_wndStatusBar.Create(this)||
!
m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Failedtocreatestatusbar\n");
return-1;//failtocreate
}
//TODO:
Deletethesethreelinesifyoudon'twantthetoolbarto
//bedockable
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar);
*/
return0;
}
设置窗口大小:
运行附加的代码,还能看到扫雷游戏的框架是不能调大小的,而且总是显示在最前面,这又是怎么实现的呢?
在下面函数里添加语句,你能说出前三句是什么意思吗?
注释已经被我去掉了,如果不知道,不如按一下F1。
BOOLCMainFrame:
:
PreCreateWindow(CREATESTRUCT&cs)
{
if(!
CFrameWnd:
:
PreCreateWindow(cs))
returnFALSE;
//TODO:
ModifytheWindowclassorstylesherebymodifying
//theCREATESTRUCTcs
cs.dwExStyle=cs.dwExStyle|WS_EX_TOPMOST;//
cs.style=WS_SYSMENU|WS_OVERLAPPED|WS_MINIMIZEBOX;//;
//设置窗口大小:
400*340
cs.cx=400;
cs.cy=340;
returnTRUE;
}
构造函数:
由于构造函数是程序运行时就执行的,所以,除了对变量赋值之外,我们还可以把游戏的核心结构即内部数组赋值:
先是把全部格子的位图和雷数赋值为0,然后调用随机函数按指定雷数赋值为-1,最后把不是雷的格子的雷数赋值为相应的值。
CMy2_1View:
:
CMy2_1View()
{
//TODO:
addconstructioncodehere
for(intii=0;ii<16;ii++)
m_Bitmap[ii].LoadBitmap(IDB_BITMAP14+ii);
for(intjj=0;jj<4;jj++)
m_anniu[jj].LoadBitmap(IDB_ANNIU1+jj);
//计时
second=0;
//1时开始计时
secondstart=0;
//行数
m_RowCount=25;
//列数
m_ColCount=16;
//雷数
leinum=80;
//剩余雷数
leftnum=leinum;
//jieshu=1时停止
jieshu=0;
intaa=0;
//初始化为0
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 扫雷
![提示](https://static.bdocx.com/images/bang_tan.gif)