您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > c++程序设计实践mfc打地鼠
C++程序设计实践MadeBy陈锴刘若欣王一凡杨仕俊*所有排序均按学号DEMO1.题目分析①题目分析本游戏是一个基于对话框C++应用程序。在程序的编辑中涉及到MFC控件的编辑和使用,文件的读,消息的响应。本程序可以实现的功能有:1.选择不同的难度开始游戏;2.鼠标击中“地鼠”时得分+1;3.未击中时得分不变,统计未击中次数+1;4.切换难度时得分清零;5.点错5次后显示“GameOver”,得分不再增加,提示重选难度进行游戏;6.点击按钮读取txt文件显示得分榜2.总体设计分析项目提出主逻辑控件与功能函数得分+1功能函数未击中+1功能函数难度选择控件与消息响应函数得分榜显示控件与消息响应函数调试与优化开始选择关卡击中地鼠?得分加一未击中加一5次未击中?鼠标点击YNYN3.详细设计分析③详细设计介绍界面构成模块实现:王一凡PushButtonComboBoxStaticText③详细设计介绍控件属性模块实现:王一凡ComboBoxPushButton将准备好的png格式文件上传到在线icon制作网站:③详细设计介绍icon制作模块实现:王一凡在资源视图中右击icon,选择insert,在弹出的对话框中选择导入③详细设计介绍icon导入模块实现:王一凡③详细设计介绍添加变量模块实现:陈锴杨仕俊public:CComboBoxm_eb;Cstringm_select;private:inta;interror;CButton*PMouse[16];intnowMouse;intgameScore;③详细设计介绍编写OnInitDialog函数模块实现:陈锴杨仕俊SetWindowText(打地鼠);//改变标题栏的名称gameScore=0;//初始得分为0nowMouse=0;//初始化鼠标点击位置③详细设计介绍编写OnInitDialog函数模块实现:陈锴杨仕俊srand((unsigned)time(NULL));//随机数发生器播种,srand函数是随机数发生器的初始化函数。原型:voidsrand(unsignedseed);用法:它需要提供一个种子,这个种子会对应一个随机数,如果使用相同的种子后面的rand()函数会出现一样的随机数。如:srand(1);直接使用1来初始化种子。不过为了防止随机数每次重复,常常使用系统时间来初始化,即使用time函数来获得系统时间,它的返回值为从00:00:00GMT,January1,1970到现在所持续的秒数,然后将time_t型数据转化为(unsigned)型再传给srand函数,即:srand((unsigned)time(&t));还有一个经常用法,不需要定义time_t型t变量,即:srand((unsigned)time(NULL));直接传入一个空指针,因为你的程序中往往并不需要经过参数获得的t数据。③详细设计介绍编写OnInitDialog函数模块实现:陈锴杨仕俊for(inti=0;i16;i++){PMouse[i]=(CButton*)GetDlgItem(IDC_BUTTON1+i);}//GetDlgItem函数的功能是返回窗口中指定参数ID的子元素的句柄,可以通过返回的句柄对窗口内的子元素进行操作。一个句柄是指使用的一个唯一的整数值,即一个4字节(64位程序中为8字节)长的数值,来标识应用程序中的不同对象和同类中的不同的实例如,一个窗口,按钮,图标,滚动条,输出设备,控件或者文件等,应用程序能够通过句柄访问相应的对象的信息。本段即将指向第i个button的指针存入数组PMouse,实现button控件PMouse的一一对应③详细设计介绍编写OnCommand函数模块实现:陈锴杨仕俊CStringstr;//定义CString型变量strfor(inti=0;i16;i++){if(LOWORD(wParam)==PMouse[i]-GetDlgCtrlID())break;}//GetDlgCtrlID函数的功能是获得指定控件的ID号,LOWORD(wParam)是命令的ID号。③详细设计介绍编写OnCommand函数模块实现:陈锴杨仕俊if(i==nowMouse){gameScore++;//如果检测到鼠标响应位置与随机生成的“地鼠”位置相同,得分加一str.Format(%d,gameScore);//Format函数将十进制数转化为字符串,%d表示十进制,这里将gameScore转化为字符串并赋给strCStatic*pstr=(CStatic*)GetDlgItem(IDC_STATIC);//将文本str传输到静态控件pstr-SetWindowText(str);//将静态控件中的文本str即得分显示出来}③详细设计介绍编写OnTimer函数模块实现:陈锴杨仕俊PMouse[nowMouse]-SetIcon(0);//SetIcon能将图标自动地放到按钮的上面,缺省时居中放置。如果图标太大,则会自动剪裁。nowMouse=rand()%16;//产生随机数取余PMouse[nowMouse]-SetIcon(AfxGetApp()-LoadIcon(IDI_ICON1));//加载已装载的图片资源CDialog::OnTimer(nIDEvent);//OnTimer()是响应CDialog对象产生的WM_Timer消息。nIDEvent表示要响应TIMER事件的ID。③详细设计介绍编写OnSelchangeCombo函数模块实现:刘若欣intnIndex=m_eb.GetCurSel();//GetCurSel函数用于获取当前光标位置,定义int型变量nIndex并将得到的光标位置赋给它。CStringstrCBText;//定义CString类变量strCBTextm_eb.GetLBText(nIndex,strCBText);//GetLBText把选中字符赋值给strCBText即将光标所在的字符串赋给strCBTextintnLength=strCBText.GetLength();//定义int型变量nLength并将strCBText的长度赋给它intnLengthLeft=0;//定义int型变量nLength初始值为0nLengthLeft=strCBText.Find(:);//用Find函数获取冒号的位置③详细设计介绍编写OnSelchangeCombo函数模块实现:刘若欣CStringstrRightString;//定义CString型变量strRightStringstrRightString=strCBText.Right(nLength-nLengthLeft-1);//Right函数从右边第一个字符起获得从右向左nLength-nLengthLeft-1个字符。此处获得冒号右面的字符串。a=atoi(strRightString);//atoi函数将字符串转化为整型数。具体为如果第一个非空格字符存在,是数字或者正负号则开始做类型转换,之后检测到非数字(包括结束符\0)字符时停止转换,返回整型数。SetTimer(1,a,NULL);//设置计数器,时间间隔为a,单位毫秒③详细设计介绍编写OnButton函数模块实现:刘若欣CFilemyfile;CStringfilename=“c:\\得分榜.txt”;myfile.Open(filename,CFile::modeRead);//文件打开及打开方式intfilelength=myfile.GetLength();//获取文件长度CStringdata;//定义字符串类,接收数据char*temp;//临时变量,用于read函数按字节读取数据temp=newchar[filelength+1];myfile.Read(temp,filelength);temp[filelength]='\0';//读文件data=temp;//赋值给data,等号=已经在CString类中重载,直接使用,可以实现赋值delete[]temp;GetDlgItem(IDC_STATIC3)-SetWindowText(data);//发送到IDC_STATIC34.遇到的问题及解决遇到的问题及解决④在低难度的模式下,鼠标快速多次单击一个有“地鼠”的Button,得分会持续增加。问题一:“可以刷分了!233333”遇到的问题及解决④解决方法:当鼠标响应当前的地鼠位置,可以重新运行一边Ontimer函数,更新随机地鼠的位置。不过此时需要重新设置时间,否则就会出现地鼠位置突然变化的情况。因为前一个地鼠(1000ms)可能在500ms被选中,此时地鼠变换位置,就会只停留500ms就转换位置了,所以要重新设置时间。遇到的问题及解决④由于rand()的随机性,会出现rand()%16为0的情况。在这种情况下,没有任何一个Button加载地鼠图标。问题二:“什么都没有让宝宝怎么点!?严重影响游戏体验”遇到的问题及解决④解决方法:加一个循环语句和一个IF语句,循环5次,当随机数取余为0的情况就重新取余,5次就大大降低了取余为0的情况。5.尚存的不足⑤尚存的不足1.UI有待优化;2.Button不能批量定义大小,批量对齐;3.尚未完成得分榜的写操作;4.……6.心得体会⑥心得体会经过一周多的时间我们完成了一个简单的打地鼠程序,经过这次小组合作我认识到了很多。首先一个明确的目标十分重要,在开始设计之前我们花了很长时间来讨论要做什么,否定了很多不成熟的方案。但是一旦目标定下来是打地鼠后进度就开始变快了,根据组内每个人的特点分配了不同的任务,学习能力比较强的同学负责一些较难的模块,然后每个人将各自负责的部分在组内讲解清楚,真正达到了小组学习的目的。⑥心得体会另外我们发现程序设计中不止需要学习能力,创新能力也很重要,通过网络了解了打地鼠程序的主要思路和一些基本知识后,我们将一部分精力放在了优化程序上,增加一些我们自己希望的功能,删去一些我们认为设计不好的地方,(辩证否定的实质是扬弃,新事物对旧事物既批判又继承,既克服其消极因素又保留其积极因素)。⑥心得体会我们还认识到,一个程序的真正价值是面向使用者,只有充实的内涵没有必要的外观也是不够的,就和这次大作业一样,一个好的程序没有一个好的PPT去展示也是不足的,因此我们在展示环节也下了一番功夫,从PPT的设计到台上展示的准备我们都充分发挥了小组成员的优势。为了设计出令自己满意的程序,在设计过程中,我们将一些平时没有掌握好的部分又学习了一次,并且在网上查找了很多相关的资料。提高了我们的学习能力和从冗杂信息中找到我们需要的信息的能力。⑥心得体会小组成员一致认为,掌握知识的多少很重要但不是决定因素,学习能力才显示出一个优秀小组的能力,很多代码可能我们自己难以独立实现,但是借助网络和老师给我们的额外资料我们可以完成一些很有意思的设计。这与老师在开课初传输给我们的理念大致相同,我们认为我们从这门课学到了很多。谢谢观赏
本文标题:c++程序设计实践mfc打地鼠
链接地址:https://www.777doc.com/doc-3972309 .html