




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、24点游戏程序设计报告1基本功能描述24点游戏介绍24点游戏是一款与计算有关的益智游戏, 其游戏规则如下:从一副扑克牌中抽去大小 王剩下52张,任意抽取4张牌,把牌面上的数运用加、减、乘、除和括号等进行运算得 出24便可获胜。值得注意的是每张牌都必须使用一次,但不能重复使用,其中, J代表数 值11, Q代表数值12, K代表数值13。游戏功能介绍“游戏难度可选”功能设计。将游戏难度分别为初级、中等和高级。每次发牌前可 进行难度设置,若不设置,系统默认为难度级别数为初级。难度级别设置完后,点击“开 始游戏”按钮,便可以开始游戏,并开始计时。“游戏规则可查看”功能设计。此功能是在 Dialog类
2、创建ID为IDD_DIALOG_NE W对话框,并在对话中添加静态文本,其中文本内容即为1.1中陈述的游戏规则。“游戏时间限制即进度条”功能设计。在规定的时间内,用户可以在输入算式编辑 框中输入想好的算式,并按下“结果”按钮。如果不输入任何数字和算符,会弹出“输入 有误! ”;如果输入的数字与给出的不符或者符号不合法,会弹出“输入有误!;如果输入的数字与四张牌相符、字符亦合法但是答案不正确,就会出现“ 回答不正确! ”;如果 输入算式经运算后所得答案正确,则会弹出“你做对了!如果在规定的时间内,没有点击验算按钮,则会弹出一个对话框,上面显示“ Time Over!”。“菜单栏”功能设计。在设计
3、界面时,添加了菜单栏功能,菜单栏的主要选项有: 游戏选项,游戏难度,帮助。以上就是此次 24点游戏主要的基本功能,其具体游戏功能, 以及功能实现将在下文详述。2设计思路2.1游戏过程简述在游戏开始前有难度设置选项,用户可根据自己的实际水平进行设置。难度级别有三 个级别,分别为初级、中等和高级。三个级别是通过时间来区别的,级别越高,可用时间 越少。三个级别的对应时间分别是 60秒、40秒和20秒。该设置不是必选项。如果用户不 设置,系统默认为初级。下面详细介绍各个功能模块的实现过程。运行程序LiPingLin_24后,当单击按钮“游戏规则”时,编译器会调用函数OnOperString()来弹出又
4、t话框IDD_DIALOG_NEW ;从而实现“游戏规则可查看”功能。运行程序LiPingLin_24后,当点击单选按钮“初级” “中等” “困难”(选择游戏 难度)时,编译器会设置游戏难度。int iRADIO=GetCheckedRadioButton(IDC_RADIO1,IDC_RADIO3);if(iRADIO=IDC_RADIO1)m_Hardlevel=60;初级,允许时间为60秒初级if(iRADIO=IDC_RADIO2)m_Hardlevel=40;/中等,允许时间为40秒中等if(iRADIO=IDC_RADIO3)m_Hardlevel=20; 高级,允许时间为20秒高
5、级运行程序LiPingLin_24后,当单击按钮“开始游戏”时,编译器会调用函数OnStart() 来实现编辑框清零,耗时初始化为零,读取游戏难度即允许时间,随机产生4张扑克牌并加载到扑克牌的位置。void CLiPingLin_24Dlg二OnStart()S=1;m_Edit1= _T();/对编辑框清空UpdateData(FALSE);/用负给控件变量的值来刷新控件,让控件把操作后的变量显 示出srand(int)time(0);/以(int)time(0)做为 srand()函数的种子 seedfor(int i=0;iSetBitmap(HBITMAP(BitmapNumber0)
6、;(CStatic*)GetDlgItem(IDC_Picture1)-SetBitmap(HBITMAP(BitmapNumber1);(CStatic*)GetDlgItem(IDC_Picture2)-SetBitmap(HBITMAP(BitmapNumber2);(CStatic*)GetDlgItem(IDC_Picture3)-SetBitmap(HBITMAP(BitmapNumber3);单击按钮“开始游戏”后,当编辑框输入完毕单击按钮“结果验证”时,编译器会 函数OnYanSuan(四停止计时,刷新数据,验证数据是否满足24。系统通过对SubCompute() 和Total
7、Compute()两函数的调用进行相应运算,紧接着系统调用OnYanSuan()函数对编辑框中运算出的结果进行验算,根据验算情况给出相应的结果。出现的结果有以下四中情况: 如果用户没在输入算式中输入算式,直接按“结果验证”按钮,会弹出“表达式不能为空 白! ”的提示对话框。如果输入的数字与给出的不符或者符号不合法,会弹出“输入有 误! ”的提示对话框。如果输入的数字与四张牌相符、字符亦合法但是答案不正确,会弹 出“回答不正确! ”。如果输入算式经运算后所得答案正确,则会弹出“你做对了 !”void CLiPingLin_24Dlg二OnYanSuan()运行程序LiPingLin_24后,当单
8、击按钮“游戏结束”时,编译器会调用函数OnOk() 来实现退出。void CLiPingLin_24Dlg二OnOk() / TODO: Add your control notification handler code here OnOK();本轮游戏结束后,用户可以选择重新开始,否则,可以点击“结束游戏”按钮退出游 戏。2.2游戏设计流程图综合2.1游戏过程简述,分析游戏功能,具 24点游戏程序设计流程图见图1。图1 24点游戏程序设计流程图3软件设计设计步骤下面详细介绍24点游戏的具体设计步骤。创建MFC AppWizard(exe)工程,键入对应的工程名(dinglu ),在应用程序
9、类型中 选择基本对话框,其余的都采用默认选项,完成对话框的创建。通过插入资源Bitmap加载图片,图片通过拷贝和复制等操作加载完成。加载完成的图片在对应的工作区可以找到,选中对其名字进行修改。在对话框中添加4个图像、9个按钮、3个编辑框、1个进度条和3个单选按钮。然后, 根据属性对以上所添加的控件进行属性修改,主要是对其进行重命名。图像内的属性修改 除改名外,还要添加位图。下一步是对以上控件建立类向导,主要包括Add Function、Add Variable 和EditCode这三项的添加。在类的原文件中添加实现功能所需要的各种函数,并添加相应的代码,同时在头文 件中添加对各种函数及变量的声
10、明。对完成的程序进行保存,然后开始调试,根据错误进行修改,直至程序不在报错, 并且可以实现预计的各种功能。关键功能的实现随机发牌功能的实现首先,通过BOOL CDingluDlg:OnInitDialog()中,根据纸牌对应的ID号加载纸牌,例 如:Bitmap7.LoadBitmap(IDB_BITMAP7)这条语句加载标有 7的纸牌。利用该函数加载 了标号110的十张纸牌和两张背景纸牌。然后运行中的以下一段代码,即可在图像框中 得到四张铺开的纸牌。srand(seed用来设置rand()产生随机数时的随机数种子。参数 seed必须是个整数,通 常可以利用geypid()或time(0)的返
11、回值来当做seed如果每次seed都设相同值,rand()所 产生的随机数值每次就会一样。rand的内部实现是用线性同余法做的,他不是真的随机数,只不过是因为其周期特别 长,所以有一定的范围里可看成是随机的,rand()会返回一随机数值,范围在 0至RAND_MAX 问。在调用此函数产生随机数前,必须先利用srand(回好随机数种子,如果未设随机数种子,rand()在调用时会自动设随机数种子为1。rand ()产生的是假随机数字, 每次执行时是相同的。若要不同,以不同的值来初始化它.初始化的函数就是srand(计时功能的实现首先,在 void CDingluDlg二OnStart()中,通过
12、m_Progress-SetStep(1和 m_Progress -SetPos(0股置进度条的步长为1,进度条的初始位置居左。然后调用 void CDingluDlg 二OnTimer(UINT nIDEvent)来完成计时功能。利用函数 if(m_Progress1-GetPos()= m_Hardlevel)来判断即使结束了没有,如果括号中的条件满足,则计时结束,跳出“TimeOver! ”的提示框。如果括号中的条件不满足,则执行以下代码:CProgressCtrl* m_Progress1=(CProgressCtrl*)GetDlgItem(IDC_PROGRESS1);m_Prog
13、ress1-SetRange(0,m_Hardlevel);m_Progress1-SetPos(m_Progress1-GetPos()+1); /进度条前进一步上述代码表示,如果时间没到,时间每流逝1秒,进度条就前进一步。当游戏时间即将结束的时候,进度条亦前进到最后一步。计算功能的实现对于输入结果的验算,主要是通过 int LastPos(CString Str), int FirstPos(CString Str), char FirstF(CString Str), int SubCompute(CString Str), int TotalCompute(CString Str外函数
14、来 来确定运算式各符号优先级和最终计算出输入算式的结果。Pluspos表示十号出现的位置,如果没有十号出现,对pluspos负一个不可能的值;如果十号存在,将pluspos与pos比较大 小。如果 pluspos小于 pos,斗p pluspos的值负给 poso pluspos再与tempos比较,如果在减 号之前出现,显示的结果是十号。 代码1:int CLinPingLin_24Dlg:TotalCompute(CString Str) int First=Str.ReverseFind()+1; while(First) CString SubStr=Str.Mid(First,(St
15、r.GetLength()-First);int Last=SubStr.Find()+1; Last+=FirstCString Left=Str.Mid(0,First-1)CString Middle=Str.Mid(First,Last-First-1)CString Right=Str.Mid(Last,Str.GetLength()-Last)int Result=SubCompute(Middle)Middle.Format(%d,Result);Str=Left+Middle+Right;First=Str.ReverseFind()+1;int Result=SubCompu
16、te(Str); return Result;代码1的作用是对于编辑框中输入的表达式进行计算,系统通过 Str.ReverseFind()+1来反向查找定位第一个“(”所在的位置。然后通过while循环查找到表达式最内层的括号,又借助于Str=Left+Middle+Right;将有优先级差别同时不带括号的表达式传送到SubCompute()函数中,最终计算出输入到编辑框中的表达式结果Result ,并将其返回。验算功能的实现在规定的时间内输入算式进行验算,根据不同的情况会出现不同的对话框。有以下四 种情况:如果用户没在输入算式中输入算式,直接按“结果验证”按钮,会弹出“表达式 不能为空白!
17、”的提示对话框;如果输入的数字与给出的不符或者符号不合法, 会弹出“输 入有误! ”的提示对话框;如果输入的数字与四张牌相符、字符亦合法但是答案不正确, 会弹出“回答不正确! ”;如果输入算式经运算后所得答案正确,则会弹出“你做对了 !”。由于代码太长,只摘取不输入与输入计算结果正确两种情况进行说明。当输入 Str为空时,通过MessageBox()显示“表达式不能为空白! ”。当输入算式正确,判断计算结 果Result=24,通过MessageBox ()显示“你输入正确! 。当输入字符有错,通过一段 很长的程序判断,然后通过 MessageBox ()显示“输入有误! ”。4结论与心得体会
18、此次课设比以往的课设任务重、安排紧。之所以这么安排,这次安排单片机的课设是 为了巩固上课所学的知识,将其应用到实践中来,好歹也是这学期学的。至于安排VC+的课设,我开始是很不能理解,因为我们是大二上学期学的,丢了快一年了,现在做课设 又得重新将它捡起来,这很费时间。后来做完课设,看着自己的游戏界面,可以像平时玩 的小游戏一样玩,感觉还挺自豪的,觉得这一星期没有白过。这一星期走来,我感受颇多, 大约有以下几点:首先,这次课设对 VC起到温故知新的作用。课程设计之初,思路全无,举步维艰, 对于理论知识学习不够扎实的我深感“书到用时方恨少”。于是,重新捡起课本,对照课 本基本控件这一章,将计算器和菜
19、单栏制作这两个范例做了几遍。对于进程条的设置不清 楚,又找同学复制了以前的课件来看,经与同学的再三讨论,终于弄清了进程条的设置。 至于编程这一块,那是忘得更多了,于是又借了基本参考书来看,遇到难处先是仔细的思 考然后在向同学请教。可以说开始的那么几天都是在查找资料,翻阅相关的书籍。其次,这次课设让我明白了实践出真理的道理。最初答辩弄完后,还有一些程序不知 道怎么写。于是,又从网上收集相关程序,经分析、查询资料仍有一些地方看不懂。只能采用尝试往对话框中添加相应代码的方法。 根据一大段的分析,感觉程序执行某个功能, 将这段代码添加到对应位置。所有的代码添加完后,运行、调试,开始会有很多错误出现。
20、我记得最多的时候有 34个错误,逐条进行修改,再进行运行和调试。也不知道改了多少 次和重做了多少次,终于做出了完美的游戏界面。止匕外,让我学会了如何创新。得到游戏界面后,我又从网上下了几个24点游戏与我的相比较。相比较发现,网上的游戏出牌比较合理,我的游戏出牌很杂乱,很多情况都是 无解,我也相应做了调整。再者,我发现很多游戏都是倒计时,我也进行了尝试。除此, 我发现有些游戏也加了四张牌的按钮,一发牌,对应的牌就显示在快捷键上,这点我也做 了尝试。以上三点,就是我关于本次课设的创新,虽然最后没能实现,但这个过程的实践 是快乐的,代表我开动了脑筋。总之,在此课设中收获了很多知识,学习到更多的MFC
21、a识,为我日后的发展有更大的帮助。5思考题.改变难度可以变化游戏的限时和游戏加分的规则,如何实现?游戏的限时是通过对进度条的设置来实现的,通过定义一个m_Hardlevel变量之后,用它来设置进度条的范围(SetRange(0,m_Hardlevel),即当用户选择不同级别的游戏时, 进度条的范围会随着 m_Hardlevel的值而不同,游戏难度越大,m_Hardlevel的值越小(本 游戏中共设置了 60秒、40秒、20秒三个级别),时间也就越短,反之时间越长。游戏的加分规则综合考虑了用户选择的游戏级别和一局游戏所花费时间的长短,即: m_score=100*(m_Hardlevel-Spe
22、ndTime)/m_Hardlevel也就是说难度的选择和用户所用时间 同时决定最后的得分。.如何保证程序是根据给出的牌来书写算式的?答:首先通过每张纸牌的ID号,将它们加载到Bitmap口中,通过随机函数得到四个 随机数之后,亦即得到四张系统随机发放的纸牌;然后利用指针将得到的纸牌在 void C LinPingLin_24Dlg:OnStart()中进行相应设置;最后在 void C LinPingLin_24Dlg二 OnYanSuan(加,通过 Mid()和 int m=(int)(int)(strtod(Mul1.GetBuffer(Mul1.GetLength(),&stopstr
23、ing);获取用户输入到编辑框中的数据,将 m和Numberi进行比较, 从而最终确保程序是根据给出的牌来书写算式的。.如何使用随机函数控制扑克牌的显示?答:首先在BOOL C LinPingLin_24Dlg:OnInitDialog()中,用纸牌对应的ID号对纸牌 进行加载,然后在 void CLinPingLin_24Dlg:OnStart()中,利用 srand(int)time(0);和 Numberi=rand()%13;两条语句选出相对应的四张纸牌,即可得到随机发放的四张扑克牌 了。附录1调试实验报告变量未定义造成错误错误:在代码添加过程中,由于涉及很多的函数和变量,可能会出现某
24、几个变量忘定 义的情况,这些变量有可能是在头文件中忘记定义或者在某个函数体中忘记定义。:修改:在添加完各个函数的代码完毕后,以为头文件会自动对相应得变量进行定义, 但头文件没有对所有的变量都定义,才出现了如上图所示的错误。打开头文件,双击 LinPingLin_24Dlg.h,在 class CLinPingLin_24Dlg : public Cdialog 类定义函数中添加对 m_Hardlevel参数的定义。添加完毕后,程序不再报这个错误。关键类未添加错误:在对话框中,摆好各种控件后,逐一对每个控件添加类向导。对话框中出现的 控件一般都不会忘记建立类向导,但有1个类向导是容易忘记的,它是
25、 IDC_PROGRESS1 立的类向导名称是OnOutofmemoryProgressl修改:根据错误提示,重新选中图片,建立 OnOutofmemoryProgress1的类向导。建立 完毕后,重新运行程序,不再提示开错误。进度条错误错误:类导向和代码添加完后,运行程序,出现游戏界面。点击游戏界面内的“开始 游戏”按钮,出现四张扑克展开,但是没过 2秒钟跳出“Time Over!”对话框,并且进度 条不动。修改:这个错误可能是计时时间设置的太短,进度条的步长设置的不合理。重新设置 计时时间范围和进度条步长,然后运行程序,错误仍然存在。再从头到尾把程序检查一遍, 做相应修改,再运行,错误仍然
26、存在。于是将所有类删除后重新添加,并且添加相应程序, 重新运行,错误消失。2测试结果2.1页面验证下面详细验证下页面的功能,以及各功能是否能实现。 菜单栏验证,见图2。53 L*PingLin_24图2菜单栏验证控件游戏规则验证”,见图3。图3游戏规则验证2.1运算测试测试过程中,由于既涉及到纸牌点数和运算符,又会涉及到运算式结果,于是相应地 会显示出四种结果,分别是:如果用户没在输入算式中输入算式,直接按“结果”按钮, 会弹出“表达式不能为空! ”的提示对话框;如果输入的数字与给出的不符或者符号不合 法,会弹出“你的输入不正确! ”的提示对话框;如果输入的数字与四张牌相符、字符亦 合法但是答
27、案不正确,会弹出“输入有误! ;如果输入算式经运算后所得答案正确,则会弹出“你做对了 !。下面用图形做相应说明。输入算式为空,点击“验算”,显示“表达式不能为空! ”,如下图 4所示3 LiPirgLinr24图4空白验证输入的数字与给出的不符或者符号不合法,点击“结果验证”,会弹出“你的输入不正确!”,如下图5所示。9B UPingLin_24图5输入有误验证 规定时间内未进行输入,或输入后未完成点击 验算”按钮操作,显示Time Ove门”, 如下图5所示。yt LiPingLin_24这I3关键源代码char CLiPingLin_24Dlg:FirstF(CString Str)int
28、 SubPos=Str.Find(-)+1;/R字符串Str中查找减号的位置int PluPos=Str.Find(+)+1;从字符串Str中查找加号的位置int MulPos=Str.Find(*)+1;/从字符串Str中查找乘号的位置int DivPos=Str.Find(/)+1;从字符串Str中查找除号的位置int Pos=200;/股定一个变量,并赋初值200if(SubPos=0)SubPos=200;浓口果没有减号,给SubPos赋一个不可能的值if(PluPos=0)PluPos=200; /改口果没有加号,给PluPos赋一个不可能的值 if(MulPos=0)MulPos=
29、200;/如果没有乘号,给 MulPos赋一个不可能的值 if(DivPos=0)DivPos=200;/如果没有除号,给DivPos赋一个不可能的值 if(PosSubPos)Pos=SubPos;/减号存在,并且把SubPos的值赋给Pos if(PosPluPos)Pos=PluPos; /力口号存在,并且把 PlusPos的值贝武给Pos if(PosMulPos)Pos=MulPos;俅号存在,并且把 MulPos的值赋给Pos if(PosDivPos)Pos=DivPos;邠余号存在,并且把 DivPos的值赋给Pos char Result=-;/川冬赋给 Result int
30、 tempPos=SubPos;/定义变量 tempPos,并将 SubPos的值贝武给 tempPos if(PluPostempPos) Result=+;tempPos=PluPos;/如果+号在-号之前出现,Result的值为+ if(MulPostempPos) Result=*;tempPos=MulPos;/如果*号在-号之前出现,Result的值为* if(DivPosSubPos)Pos=SubPos; /M号存在,并且把 SubPos的值贝8给Pos if(PosPluPos)Pos=PluPos; /力口号存在,并且把 PlusPos的值贝武给Pos if(PosMulP
31、os)Pos=MulPos;俅号存在,并且把 MulPos的值赋给Pos if(PosDivPos)Pos=DivPos;邠余号存在,并且把 DivPos的值赋给Pos return Pos;/等Pos的值返回 /定位最后一个算术符号的位置int CLiPingLin_24Dlg二LastPos(CString Str) int SubPos=Str.ReverseFind(-)+1;纵字符串Str中查找减号的位置int PluPos=Str.ReverseFind(+)+1; /从字符串 Str 中查找加号的位置int MulPos=Str.ReverseFind(*)+1; 从字符串 St
32、r 中查找乘号的位置int DivPos=Str.ReverseFind(7)+1;/A字符用 Str 中查找除号的位置int Pos=SubPos;/定义变量Pos,并给它赋初值if(PosPluPos) /ffi过以下条件更改Pos的值Pos=PluPos;if(PosMulPos)Pos=MulPos;if(PosDivPos)First=DivPos;如果/号在*号之前出现,将 DivPos的值送给First if(DivPos=0&MulPos!=0) First=MulPos;DivPos=2000;/除号不存在,并且乘号存在,将 MulPos的值送给First,并且将DivPos
33、设为不可能值 if(MulPos=0&DivPos!=0) First=DivPos;MulPos=2000;/乘号不存在,并且除号存在,将 DivPos的值送给First,并且将MulPos设为不可能值while(First)CString tempStr=Str.Mid(0,First-1);int temp=LastPos(tempStr);CString Left=Str.Mid(0,temp);CString Mul1=Str.Mid(temp,First-temp-1);tempStr=Str.Mid(First,Str.GetLength()-First);temp=FirstP
34、os(tempStr);if(temp=200) Mul2=tempStr;Right= ;else Mul2=tempStr.Mid(0,temp-1);Right=tempStr.Mid(temp-1,tempStr.GetLength()-temp+1); if(MulPosDivPos)Middle.Format(%d,(int)(strtod(Mul1.GetBuffer(Mul1.GetLength(),&stopstring)/strtod(Mul2.GetBuffer(Mul2.GetLength(),&stopstring); elseMiddle.Format(%d,(in
35、t)(strtod(Mul1.GetBuffer(Mul1.GetLength(),&stopstring)*strtod(Mul2.GetBuffer(Mul2.GetLength(),&stopstring);Str=Left+Middle+Right;MulPos=Str.Find(*)+1;DivPos=Str.Find(/)+1;First=MulPos;if(MulPosDivPos)First=DivPos;if(DivPos=0&MulPos!=0) First=MulPos;DivPos=2000; 将除号所在位置设置成一个大于 MulPos但又不可能的值 if(MulPos
36、=0&DivPos!=0) First=DivPos;MulPos=2000; 将乘号所在的位置设置成一个大于DivPos但不可能的值/定位+号、-号首先出现的位置First=FirstPos(Str);if(First=200) /如果没有十号、-号,则可以直接返回结果return (int)strtod(Str.GetBuffer(Str.GetLength(),&stopstring);char Fuhao=FirstF(Str); /确定首先出现的符号是+号还是-号while(First)/如果找到+号或-号CString tempStr=Str.Mid(0,First-1);int
37、temp=LastPos(tempStr);CString Left=Str.Mid(0,temp);CString Mul1=Str.Mid(temp,First-temp-1);tempStr=Str.Mid(First,Str.GetLength()-First);temp=FirstPos(tempStr);if(temp=200)Mul2=tempStr; Right= ; elseMul2=tempStr.Mid(0,temp-1);Right=tempStr.Mid(temp-1,tempStr.GetLength()-temp+1); if(Fuhao=+)Middle.For
38、mat(%d,(int)(strtod(Mul1.GetBuffer(Mul1.GetLength(),&stopstring)+ strtod(Mul2.GetBuffer(Mul2.GetLength(),&stopstring);elseMiddle.Format(%d,(int)(strtod(Mul1.GetBuffer(Mul1.GetLength(),&stopstring)-strtod(Mul2.GetBuffer(Mul2.GetLength(),&stopstring);Str=Left+Middle+Right;First=FirstPos(Str);if(First=
39、200) break;Fuhao=FirstF(Str);return (int)strtod(Middle.GetBuffer(Middle.GetLength(),&stopstring);/用于计算表达式的结果 int CLiPingLin_24Dlg:TotalCompute(CString Str)int First=Str.ReverseFind()+1;while(First) CString SubStr=Str.Mid(First,(Str.GetLength()-First);int Last=SubStr.Find()+1;Last+=First;/定位最后一个(号以后的
40、最开始的)号位置CString Left=Str.Mid(0,First-1);/ (号左边的字符串CString Middle=Str.Mid(First,Last-First-1);/ ()号中间的字符串CString Right=Str.Mid(Last,Str.GetLength()-Last);/ ()号右边的字符串int Result=SubCompute(Middle);/ 进入下面的计算Middle.Format(%d,Result);Str=Left+Middle+Right;First=Str.ReverseFind()+1;int Result=SubCompute(St
41、r);return Result;/ CLiPingLin_24Dlg message handlersBOOL CLiPingLin_24Dlg:OnInitDialog()CDialog:OnInitDialog();/ Add About. menu item to system menu.Bitmap0.LoadBitmap(IDB_BITMAP13);为纸牌图片的数组加载 13张初始图像Bitmap1.LoadBitmap(IDB_BITMAP1);Bitmap2.LoadBitmap(IDB_BITMAP2);Bitmap3.LoadBitmap(IDB_BITMAP3);Bitm
42、ap4.LoadBitmap(IDB_BITMAP4);Bitmap5.LoadBitmap(IDB_BITMAP5);Bitmap6.LoadBitmap(IDB_BITMAP6);Bitmap7.LoadBitmap(IDB_BITMAP7);Bitmap8.LoadBitmap(IDB_BITMAP8);Bitmap9.LoadBitmap(IDB_BITMAP9);Bitmap10.LoadBitmap(IDB_BITMAP10);Bitmap11.LoadBitmap(IDB_BITMAP11);Bitmap12.LoadBitmap(IDB_BITMAP12);CProgressC
43、trl*m_Progress1=(CProgressCtrl*)GetDlgItem(IDC_PROGRESS1);/设置时间的指 针m_Progress1-SetRange(0,1000)谀置进度条的取值范围m_Progress1-SetPos(0);殷置进度条的初值GetDlgItem(IDC_YanSuan)-EnableWindow(FALSE);使验算按钮无效CheckRadioButton(IDC_RADIO1,IDC_RADIO3,IDC_RADIO2); 测试选中的难度级别 UpdateData(FALSE);/雄度级另I显示 IDM_ABOUTBOX must be in t
44、he system command range.ASSERT(IDM_ABOUTBOX & 0 xFFF0) = IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX AppendMenu(MF_SEPARATOR);pSysMenu-AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);/ Set the icon for this dialog. The framework does this automatically/ when the applications main window is not a dialogSetIc
45、on(m_hIcon, TRUE);/ Set big iconSetIcon(m_hIcon, FALSE); / Set small icon/ TODO: Add extra initialization herereturn TRUE; / return TRUE unless you set the focus to a controlvoid CLiPingLin_24Dlg:OnSysCommand(UINT nID, LPARAM IParam)if (nID & 0 xFFF0) = IDM_ABOUTBOX)CAboutDlg dlgAbout;dlgAbout.DoMod
46、al();elseCDialog:OnSysCommand(nID, lParam);/ If you add a minimize button to your dialog, you will need the code below/ to draw the icon. For MFC applications using the document/view model,/ this is automatically done for you by the framework.void CLiPingLin_24Dlg二OnPaint()if (IsIconic()CPaintDC dc(
47、this); / device context for paintingSendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);/ Center icon in client rectangleint cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Hei
48、ght() - cyIcon + 1) / 2;/ Draw the icondc.DrawIcon(x, y, m_hIcon);elseCDialog二OnPaint();/ The system calls this to obtain the cursor to display while the user drags/ the minimized window.HCURSOR CLiPingLin_24Dlg:OnQueryDragIcon()return (HCURSOR) m_hIcon;void CLiPingLin_24Dlg二OnStart()/ TODO: Add you
49、r control notification handler code hereS=1;m_Edit1= _T();/对编辑框清空m_SpendTime=0;/阴戏耗时初始化为0/m_score=0;/将等分初始化为0UpdateData(FALSE);/用负给控件变量的值来刷新控件,让控件把操作后的变量显示出srand(int)time(0);/以(int)time(0)做为 srand()函数的种子 seedfor(int i=0;iSetBitmap(HBITMAP(BitmapNumber0);(CStatic*)GetDlgItem(IDC_Picture1)-SetBitmap(H
50、BITMAP(BitmapNumber1);(CStatic*)GetDlgItem(IDC_Picture2)-SetBitmap(HBITMAP(BitmapNumber2);(CStatic*)GetDlgItem(IDC_Picture3)-SetBitmap(HBITMAP(BitmapNumber3);/将随机产生的四张图片加载在四张扑克牌位置GetDlgItem(IDC_Start)-SetWindowText(重新开始);/将发牌”按钮的名字改为“重新开始”GetDlgItem(IDC_YanSuan)-EnableWindow(TRUE);/使验算按钮被鼠标点击有效/设置三个
51、难度级别int iRADIO=GetCheckedRadioButton(IDC_RADIO1,IDC_RADIO3);if(iRADIO=IDC_RADIO1)m_Hardlevel=60; 一级,允许时间为 60秒if(iRADIO=IDC_RADIO2)m_Hardlevel=40; 二级,允许时间为 40秒if(iRADIO=IDC_RADIO3)m_Hardlevel=20;三级,允许时间为 20秒CProgressCtrl* m_Progress=(CProgressCtrl*)GetDlgItem(IDC_PROGRESS1);/定义进度条指针变量m_Progressm_Prog
52、ress-SetStep(1);股置步长值为 1m_Progress-SetPos(0);进度条初始位置居左SetTimer(1,1000,NULL);/设置计时器,每隔1秒发出一个消息映射GetDlgItem(IDC_RADIO1)-EnableWindow(FALSE); 游戏开始后,难度选择按钮禁用GetDlgItem(IDC_RADIO2)-EnableWindow(FALSE);GetDlgItem(IDC_RADIO3)-EnableWindow(FALSE);void CLiPingLin_24Dlg二OnYanSuan()/ TODO: Add your control not
53、ification handler code hereKillTimer;/点击验算按钮后停止计时UpdateData();/数据刷新int flag=1;/设置变量flag,作为后续程序的判断标准CString Str=m_Edit1;int First=Str.ReverseFind()+1;while(First)CString SubStr=Str.Mid(First,(Str.GetLength()-First);int Last=SubStr.Find()+1;Last+=First;CString Left=Str.Mid(0,First-1);CString Middle=St
54、r.Mid(First,Last-First-1);CString Right=Str.Mid(Last,Str.GetLength()-Last);Str=Left+Middle+Right;First=Str.ReverseFind()+1;if(Str=)MessageBox(表达式不能为空匚Warning!,MB_OK);flag=0; 表达式为空,弹出”表达式不能为空!”的对话框/* if(Str=)MessageBox。对不起,您的输入不正确!,错误,MB_OK);flag=0;*/表达式为空,弹出对不起,您的输入不正确!”的对话框First=FirstPos(Str);while
55、(First!=200&flag)CString tempStr=Str.Mid(0,First-1);/输入字符不正确,弹出”对不起,您的输入不正确int temp=LastPos(tempStr);CString Left=Str.Mid(0,temp);CString Mul1=Str.Mid(temp,First-temp-1);Str=Str.Mid(First,Str.GetLength()-First);int m=(int)(int)(strtod(Mul1.GetBuffer(Mul1.GetLength(),&stopstring);int n=1;for(int i=0;
56、i4;i+)if(m=Numberi)Numberi=-1;n+;break;if(n2&flag)MessageBox(对不起,您的输入不正确!,错误,MB_OK);flag=0;break;First=FirstPos(Str);int m=(int)(int)(strtod(Str.GetBuffer(Str.GetLength(),&stopstring);int n=1;for(int i=0;i4;i+)if(m=Numberi)Numberi=-1;n+;break;if(n2&flag) MessageBox(对不起,您的输入不正确!,错误,MB_OK);flag=0; for
57、(int j=0;jSetWindowText(+Sscore+分)/ UpdateData(FALSE); 将m_score的值显示在编辑框内 if(Result!=24) /* CString temp;temp.Format(%d,Result);CString Answer=The result is:+temp+!;/如果计算结果不等于24,显示错误的结果*/MessageBoxC结果错误!,FALSE!,MB_OK);flag=0;UpdateData(FALSE);GetDlgItem(IDC_YanSuan)-EnableWindow(FALSE);验算按钮禁用GetDlgIt
58、em(IDC_RADIO1)-EnableWindow(TRUE);GetDlgItem(IDC_RADIO2)-EnableWindow(TRUE);GetDlgItem(IDC_RADIO3)-EnableWindow(TRUE); / 难度级别设置禁用void CLiPingLin_24Dlg二OnOk()/ TODO: Add your control notification handler code here OnOK();void CLiPingLin_24Dlg二OnParenlButton()/ TODO: Add your control notification handler code hereif(S=1) UpdateData(true);m_Edit1=m_Edit1+(;/在编辑框中显示(符号UpdateData(false); void CLiPingLin_24Dlg:OnParenrButton()/ TODO: Add your control notification handler code hereif(S=1) UpdateData(true);m_Edit1
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论