C++扫雷
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
扫雷
1.1.游戏实现
扫雷,是附带在Window里面的游戏,是个简单的游戏。因此我们就从扫雷开始我们的游戏旅程。很多人都玩过这个游戏,只是不知道怎么用程序实现。不过还有人不知道怎么玩,下面就先说说游戏的规则:
●开始:按左键开始游戏,按按钮或菜单重新开始。
●左键:按下时,是雷则结束,非雷则显示数字。
●数字:代表此数字周围一圈八格中雷的个数。
●右键:奇次按下表示雷,偶数按下表示对上次的否定。
●结束:左键按到雷结束,找出全部雷结束。
接下来就该介绍游戏的编程过程了。不过要先交代一下一些内容。
●添加位图。
●添加全局变量。
●画初始界面。
●添加函数。
为什么要按这种次序呢?因为我们在画初始界面时,可能要用到位图或变量,而变量的定义又可能要对位图进行定义。这样的步骤的好处还有:在做一步之后都可以运行,有错就改,无错就做下一步。
上图是扫雷的一个画面。
下面就一步一步地演示,以编程的思路进行,当然,由于编程过程中有一些函数中的代码是分成两三次写的,我们就不重复,全部代码在第一次讲到时列出,而后面讲到时就只是提一下。
新建单文档工程2_1。
2.2.资源编辑
添加位图:
前十二幅是在雷区的,后四幅是按钮。为了便于加载,必须各自保证其连续性。另外,为什么不添加一个按钮而用位图呢?是因为即使我们添加了按钮也要添加四幅位图!
位图的ID号:
按扭位图:30*30 IDB_ANNIU1、IDB_ANNIU 2、IDB_ANNIU3、IDB_ANNIU4 雷区位图:14*14 ID号按下图依次为:IDB_BITMAP14。。。。。。IDB_BITMAP25
位图:下图(图2-1)。
图2-1
位图的ID号:
按扭位图30*30 IDB_BITMAP1、IDB_BITMAP2、IDB_BITMAP3、IDB_BITMAP4 雷区位图14*14 ID号按下图依次为:IDB_BITMAP5……IDB_BITMAP16
1234
5678910
111213141516
icon
3.3.变量函数
定义新类:
对于雷,我们是单独定义一个类,这样有利于程序的操作。
class Lei Mine
{
public:
//显示哪一个位图
int weitu; bitmap
//这个位置相应的值
int shumu; index
};
并有如下规定(图2-2):
图2-2
视图类变量:
接着是在View类添加变量和函数:
//剩下雷数
int leftnum;
//雷数
int leinum; minenum
//结束
int jieshu; endflag
//计时
short second;
//开始计时
int secondstart;
//位图数组
CBitmap m_Bitmap[12]; bitmap
//按扭位图数组
CBitmap m_anniu[4]; button
//雷区行数
int m_RowCount; row
//雷区列数
int m_ColCount; line
//最大雷区
Lei lei[50][50]; Mine mine
//这个位置周围雷数为0
void leizero();
//计时器函数
afx_msg void OnTimer(UINT nIDEvent);
//鼠标按下左键
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
//鼠标按下右键
afx_msg void OnRButtonDown(UINT nFlags, CPoint point);
//初始化函数
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
//鼠标左键松开
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
4.4.具体实现
删去状态栏和工具栏:
开始执行程序,就能见到一个有状态栏和工具栏的大的单文档,与上图不同,所以我们第一步就是整理框架:
打开下面函数,把里面的一些语句去掉。如下所示:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
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_FL YBY | CBRS_SIZE_DYNAMIC) ||
!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
{
TRACE0("Failed to create toolbar\n");
return -1; // fail to create
}
if (!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Failed to create status bar\n");
return -1; // fail to create
}
// TODO: Delete these three lines if you don't want the toolbar to
// be dockable
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar);
*/
return 0;
}
设置窗口大小:
运行附加的代码,还能看到扫雷游戏的框架是不能调大小的,而且总是显示在最前面,这又是怎么实现的呢?
在下面函数里添加语句,你能说出前三句是什么意思吗?注释已经被我去掉了,如果不知道,不如按一下F1。
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
if( !CFrameWnd::PreCreateWindow(cs) )
return FALSE;
// TODO: Modify the Window class or styles here by modifying