MFC自制扫雷游戏心得.doc_第1页
MFC自制扫雷游戏心得.doc_第2页
MFC自制扫雷游戏心得.doc_第3页
MFC自制扫雷游戏心得.doc_第4页
MFC自制扫雷游戏心得.doc_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

首先亮一下自己做出的扫雷游戏界面效果:还没来得急改exe文件的图标,刚下好ico文件,不过没有合适的,所以就还没换。 我做这个扫雷游戏的第一件事当然是想解决怎么让这个界面看起来像扫雷那个样子。我首先想到了按钮控件可以响应鼠标点击事件,所以就决定了使用MFC的对话框,用紧密排列的按钮来当做雷区,索性就拉了几个按钮在界面随意放着,然后Ctrl+c和Ctrl+v的凑够100个按钮。这样一阵随意操作之后,我急后悔了!太乱了,密密麻麻地,再怎么也要弄个10*10的方阵出来才像样嘛所以干脆把按钮全Delete掉,规规矩矩地先放5个按钮进来,把按钮的文字都删掉,然后调整按钮大小成一个方形,将5个按钮选定布局一横排,之后再复制这5个到后面紧挨着放好,这样才弄好第一行雷区,接下来就10个10个的复制,对齐了。我想要是这个布局有网格的就好了,就不用我这样一排一排的弄了第二步就是做上图右边那一列的游戏信息,简单的就不用赘述了。第三步嘛自然是在雷区安排雷的位置了。这就需要为这100个按钮安排序号以作区别,然后随机数序号的按钮下对应着一个雷。而我又打开该对话框的资源文件头文件Resource.h发现关于这100个按钮的ID设置是这样的:#define IDC_BUTTON1 1000 #define IDC_BUTTON2 1001 #define IDC_BUTTON3 1002#define IDC_BUTTON98 1097 #define IDC_BUTTON99 1098 #define IDC_BUTTON100 1099所以我就干脆以1000-1099为序号,当然雷的标记是定义一个整数数组flg100,flgindex=0则不是雷,flgindex=1则是雷,其中index+1000对应按钮的ID。第四步了,需要为这100个按钮添加响应鼠标左键单击事件和右键单击事件,不想做得太复杂了,就没做鼠标左键双击和鼠标左右键同时点击的响应。当然只算鼠标左键和右键就已经是麻烦事了,比较要为100个按钮添加呢!百度了一下多个控件响应同一个事件的添加方法,其中左键单击有比较详细的方法说明,就是先添加一个按钮的左键单击事件,再改Mine_SweepDlg.cpp如下几句代码:BEGIN_MESSAGE_MAP(CChusDlg, CDialog) /AFX_MSG_MAP(CChusDlg) ON_BN_CLICKED(IDC_BUTTON1, OnButton1) /AFX_MSG_MAP END_MESSAGE_MAP()将其中的 ON_BN_CLICKED(IDC_BUTTON1, OnButton1) 改为 ON_CONTROL_RANGE(BN_CLICKED,IDC_BUTTON1,IDC_BUTTON100,OnButton1) 即可实现100个按钮响应同一个鼠标左键单击事件函数OnButton1() 这只适用于ID连续的控件。当然鼠标左键单击事件函数需要知道是哪一个ID的控件发生的,所以还需要传递一个ID参数,做下面几个位置的修改:Mine_SweepDlg.h中afx_msg void OnButton1(UINT uID);加入括号的参数,再在Mine_SweepDlg.cpp的事件响应函数中加入参数void CMine_SweepDlg:OnButton1(UINT uID)其中的uID就是100个按钮的序号,而uID-1000就得到雷区标识的index了。然后我将响应事件作出的效果如图:即点击某一个方格,判断周边8个方格是否有雷标识,若没有则隐藏该按钮,若有则显示周边雷标识个数。若点击的这个方格就是累标识,则弹出消息框提示游戏结束。以下附上事件响应函数的代码:void CMine_SweepDlg:OnButton1(UINT uID) / TODO: Add your control notification handler code here int index=(int)uID-1000; int chack9; int i,j; if(flgindex=0)/如果该位置不是雷 chack_mine(index,chack);/获取试探方向 for(i=0,j=0;iShowWindow(FALSE);/隐藏该按钮 flgindex=2; m_score+=10; for(i=0,j=0;ichack0;i+)/隐藏周边按钮 int chac9; chack_mine(chacki+1,chac); for(int m=0,n=0;mShowWindow(FALSE); flgchacki+1=2; m_score+=10; else/否则显示周边雷数量 CString bu; bu.Format(%d,j); SetDlgItemText(index+1000,bu); m_score+=10; else/左键单击了一个雷 SetDlgItemText(uID,*); m_minenum-; mine0-; m_score-=20; if(MessageBox(你触雷了!游戏结束,提示,MB_OKCANCEL)=IDOK) KillTimer(1);/取消定时器 CDialog:OnOK(); 以上是完成了左键单击的响应,至于右键单击的响应,比较麻烦了一点,需要重载一个虚函数PreTranslateMessage(MSG* pMsg)。说是该函数可以获取界面上的鼠标事件,包括了左键单击,左键双击,左键按下放开,右键单击等消息,然后可以根据消息来完成想要的功能。具体的重载方法是在类视图里右键单击Mine_SweepDlg,选择Add Virtual Function ,在弹出对话框中左边选择PreTranslateMessage,然后确定。然后就可以在CMine_SweepDlg.cpp里编辑使得响应控件的右键。以下是我的函数代码:BOOL CMine_SweepDlg:PreTranslateMessage(MSG* pMsg) / TODO: Add your specialized code here and/or call the base class if(pMsg-message=WM_RBUTTONDOWN)/鼠标点击右键 CRect rc; CPoint ptCursor; GetCursorPos(&ptCursor);/获取鼠标的位置信息 int pos; for(pos=1000;pos GetWindowRect(&rc);/获取控件的位置信息 if(PtInRect(&rc,ptCursor)/右键点击位置在某一个控件上 SetDlgItemText(pos,*); m_minenum-; if(flgpos-1000=1) mine0-; GetDlgItem(1100)- GetWindowRect(&rc);/获取开始按钮的位置信息 if(PtInRect(&rc,ptCursor)/右键点击位置在某一个控件上 for(int i=1;i=mine0;i+) SetDlgItemText(minei+1000,*); return CDialog:PreTranslateMessage(pMsg); 到此,按钮的鼠标左键响应,右键响应已经完成,接下来就是设置定时器刷新游戏用时和游戏得分。第五步,设置定时器。具体方法如下:1.双击资源对话框,对着对话框空白处右键,选择事件;2.在左侧的新建windows消息/事件下选择WM_TIMER双击,然后确定;3.在出现的void CMine_SweepDlg:OnTimer(UINT nIDEvent)中添加需要做的事4.为开始按钮添加鼠标左键单击响应事件,添加SetTimer(1,1000,NULL);/启动定时器,1秒调用一次OnTimer函数。 以上就是我做这个扫雷游戏的大致过程了。其中遇到的各种问题,也让我学到不少东西,首先就是

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论