手把手教你用vc6做扫雷游戏有图

上传人:M****1 文档编号:511601736 上传时间:2023-03-09 格式:DOC 页数:15 大小:832.50KB
返回 下载 相关 举报
手把手教你用vc6做扫雷游戏有图_第1页
第1页 / 共15页
手把手教你用vc6做扫雷游戏有图_第2页
第2页 / 共15页
手把手教你用vc6做扫雷游戏有图_第3页
第3页 / 共15页
手把手教你用vc6做扫雷游戏有图_第4页
第4页 / 共15页
手把手教你用vc6做扫雷游戏有图_第5页
第5页 / 共15页
点击查看更多>>
资源描述

《手把手教你用vc6做扫雷游戏有图》由会员分享,可在线阅读,更多相关《手把手教你用vc6做扫雷游戏有图(15页珍藏版)》请在金锄头文库上搜索。

1、第二章 扫雷1 1 游戏实现扫雷,是附带在Window里面的游戏,是个简单的游戏。因此我们就从扫雷开始我们的游戏旅程。很多人都玩过这个游戏,只是不知道怎么用程序实现。不过还有人不知道怎么玩,下面就先说说游戏的规则: 开始:按左键开始游戏,按按钮或菜单重新开始。左键:按下时,是雷则结束,非雷则显示数字。数字:代表此数字周围一圈八格中雷的个数。右键:奇次按下表示雷,偶数按下表示对上次的否定。结束:左键按到雷结束,找出全部雷结束。接下来就该介绍游戏的编程过程了。不过要先交代一下一些内容。 添加位图。 添加全局变量。 画初始界面。 添加函数。为什么要按这种次序呢?因为我们在画初始界面时,可能要用到位图

2、或变量,而变量的定义又可能要对位图进行定义。这样的步骤的好处还有:在做一步之后都可以运行,有错就改,无错就做下一步。上图是扫雷的一个画面。下面就一步一步地演示,以编程的思路进行,当然,由于编程过程中有一些函数中的代码是分成两三次写的,我们就不重复,全部代码在第一次讲到时列出,而后面讲到时就只是提一下。新建单文档工程2_1。2 2 资源编辑添加位图:前十二幅是在雷区的,后四幅是按钮。为了便于加载,必须各自保证其连续性。另外,为什么不添加一个按钮而用位图呢?是因为即使我们添加了按钮也要添加四幅位图!位图的ID号:按扭位图:30*30 IDB_ANNIU1、IDB_ANNIU 2、IDB_ANNIU

3、3、 IDB_ANNIU4雷区位图:14*14ID号按下图依次为:IDB_BITMAP14。IDB_BITMAP25位图:下图(图2-1)。 图2-13 3 变量函数定义新类:对于雷,我们是单独定义一个类,这样有利于程序的操作。 class Leipublic: /显示哪一个位图int weitu; /这个位置相应的值int shumu;并有如下规定(图2-2): 图2-2 视图类变量: 接着是在View类添加变量和函数:/剩下雷数int leftnum; /雷数int leinum;/结束int jieshu;/计时short second; /开始计时int secondstart; /位

4、图数组CBitmap m_Bitmap12;/按扭位图数组CBitmap m_anniu4;/雷区行数int m_RowCount; /雷区列数int m_ColCount; /最大雷区Lei lei5050; /这个位置周围雷数为0void leizero(); /计时器函数afx_msg void OnTimer(UINT nIDEvent); /鼠标按下左键afx_msg void OnLButtonDown(UINT nFlags, CPoint point);/鼠标按下右键afx_msg void OnRButtonDown(UINT nFlags, CPoint point); /

5、初始化函数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)

6、= -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(Failed to create toolbarn);return -1; / fail to createif (!m_wndStatusBar.Create(this) |!m_

7、wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT)TRACE0(Failed to create status barn);return -1; / fail to create/ TODO: Delete these three lines if you dont want the toolbar to/ be dockablem_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);EnableDocking(CBRS_ALIGN_ANY);DockControlBar(&

8、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/ the CREAT

9、ESTRUCT cscs.dwExStyle=cs.dwExStyle|WS_EX_TOPMOST;/cs.style=WS_SYSMENU|WS_OVERLAPPED|WS_MINIMIZEBOX;/; /设置窗口大小:400*340cs.cx=400;cs.cy=340; return TRUE; 构造函数:由于构造函数是程序运行时就执行的,所以,除了对变量赋值之外,我们还可以把游戏的核心结构即内部数组赋值:先是把全部格子的位图和雷数赋值为0,然后调用随机函数按指定雷数赋值为-1,最后把不是雷的格子的雷数赋值为相应的值。CMy2_1View:CMy2_1View()/ TODO: add

10、construction code herefor(int ii=0;ii16;ii+)m_Bitmapii.LoadBitmap(IDB_BITMAP14+ii); for(int jj=0;jj4;jj+)m_anniujj.LoadBitmap(IDB_ANNIU1+jj); /计时second=0; /1时开始计时secondstart=0; /行数m_RowCount=25; /列数m_ColCount=16; /雷数 leinum=80; /剩余雷数leftnum=leinum; /jieshu=1时停止jieshu=0; int aa=0;/初始化为0for(int i=0;im

11、_RowCount;i+)for(int j=0;jm_ColCount;j+)leiij.shumu=0;leiij.weitu=0;/获取当前时间CTime time=GetCurrentTime();int s;/获取秒数s=time.GetSecond();/设置40个雷do/以当前秒数为产生随机算法int k=(rand()*s)%m_RowCount;int l=(rand()*s)%m_ColCount; /为了避免一个位置同时算两个雷 /只允许当前位置不是雷时赋值为雷if(leikl.shumu!=-1)leikl.shumu=-1; aa+; while(aa!=leinum

12、); /给方格赋值,计算雷数for(int a=0;am_RowCount;a+)for(int b=0;bm_ColCount;b+)if(leiab.shumu=0)for(int c=a-1;ca+2;c+)for(int d=b-1;d=0&c=0&dm_ColCount)if(leicd.shumu=-1)leiab.shumu+;界面函数:现在,可以开始画界面了。如下函数:很明显,前面部分是用画的方法画出整个界面,但是,后面for循环显示的位图并不是现在画界面的内容,为什么要写呢?这是为了用户框重画的需要,当我们的游戏玩了一半后最小化,或是把部分窗口移出屏幕,或是执行了新的应用程序覆盖了原来的程序时,必须重画。我们调用重画函数,它都要重新执行OnDraw(CDC* pDC)函数,那么,此时它就必须把已经显示出来的位图也显示出来。而开始时雷区位图是不可见的,并不影响界面的初始化。 void CMy2_1View:OnDraw(CDC* pDC)CMy2_1Doc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add dra

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号