欢迎来到人人文库网! | 帮助中心 人人文档renrendoc.com美如初恋!
人人文库网
全部分类
  • 图纸下载>
  • 教育资料>
  • 专业文献>
  • 应用文书>
  • 行业资料>
  • 生活休闲>
  • 办公材料>
  • 毕业设计>
  • ImageVerifierCode 换一换
    首页 人人文库网 > 资源分类 > DOC文档下载  

    24点游戏程序课程设计说明书(C++实现).doc

    • 资源ID:73570218       资源大小:193.50KB        全文页数:19页
    • 资源格式: DOC        下载积分:18积分
    扫码快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 支付宝登录   QQ登录   微博登录  
    二维码
    微信扫一扫登录

    手机扫码下载

    请使用微信 或支付宝 扫码支付

    • 扫码支付后即可登录下载文档,同时代表您同意《人人文库网用户协议》

    • 扫码过程中请勿刷新、关闭本页面,否则会导致文档资源下载失败

    • 支付成功后,可再次使用当前微信或支付宝扫码免费下载本资源,无需再次付费

    账号:
    密码:
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源(1积分=1元)下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    24点游戏程序课程设计说明书(C++实现).doc

    武汉理工大学专业课程设计2课程设计说明书目 录1. 基本功能描述12. 设计思路13. 软件设计33.1 设计步骤33.2 界面设计33.3 关键功能的实现44. 结论与心得体会45. 参考文献56. 思考题57. 附录67.1 调试报告67.2 测试结果67.3 关键源代码924点游戏1. 基本功能描述(1)游戏开始之前可以进行难度选择(默认为简单),难度选定后点击“发牌”按钮,程序上方会随机显示4张扑克牌,进度条开始工作,用以标识耗时,同时“发牌”按钮名称变为“重新开始”。(2)在规定时间范围内,用户可以思考并输入算式。输入完成后,点击“验算”按钮,系统将对输入结果进行检验。若结果正确,显示“你真行!”,同时计分栏将根据难度给予不同的分值奖励;若结果不是24,则显示“输入错误!”,计分栏分数不变。(3)若在规定时间内没有完成输入或没有点击“验算”按钮,则会弹出“时间到!”对话框。(4)菜单可同样实现“发牌”和“结束”功能,同时还有“帮助”菜单,下面的“关于”项写入程序信息。(5)完成一次游戏后,若用户想继续游戏,点击“重新开始”即可;若不想继续,点击“退出”按钮即可关闭程序。2. 设计思路本程序采用基本对话框,初始化过程中载入位图,位图资源从系统的纸牌游戏资源Card.dll中获得。点击“发牌”调用OnStart函数,完成随机发牌和计时功能,时间长短根据难度的不同,由变量m_length控制。用户完成输入后,点击“验算”调用OnCalc函数(OnCalc函数调用qiuzhi函数对输入的多项式进行计算),完成对输入的正误判断并给出相应提示,计分栏显示分值,每次得分分值大小由m_PScore变量根据难度设置。若想重新开始,点击“重新开始”,重新执行OnStart函数;若想结束,点击“结束”,调用OnOK函数,即可退出游戏。程序流程图如下:开始初始化:难度默认为初级;LoadBitMap( )加载位图资源;初始化进度条发牌:随机函数Rand产生012的随机数,利用SetBitMap( )显示纸牌图案;GetCheckRadioButton获取难度,用m_length控制进度条变化范围,m_Pscore控制分值;SetTimer设置计时器用户输入YGetPos>m_length?显示“时间到!”N验算:调用OnCalc计算用户输入Result=24?N显示“输入错误!”Y显示“你真行!”,同时m_Score增加并显示分数继续游戏?YYN结束:OnOK退出图1 24点游戏程序流程图3. 软件设计3.1 设计步骤 1)进入VC+程序后,创建MFC AppWizard(exe)工程,以自己姓名的拼音作为工程名,在应用程序类型中选择基本对话框,完成对话框的创建。 2)在对话框中根据设计要求添加控件,包括按钮,单选按钮,编辑框,进度条,组合框,静态文本和位图。修改其属性,并建立类向导,在相应的地方添加代码。 3)添加菜单,关联到主窗口。 4)对程序进行调试,修改其中的错误,直到实现所要求的各项功能。3.2 界面设计表1 界面控件表控件序号控件名称控件类型属性对应变量1发牌按钮IDC_START2验算按钮IDC_CALC3退出按钮IDC_OK4简单单选按钮IDC_Easy5中等单选按钮IDC_Middle6困难单选按钮IDC_Hard7算式输入框编辑框IDC_EDIT1m_Input8得分栏编辑框IDC_EDIT2m_Score9耗时标识进度条IDC_PROGRESS10难度组框IDC_STATIC11输入算式(以=结束)静态文本IDC_STATIC12时间进度静态文本IDC_STATIC13得分静态文本IDC_STATIC14纸牌1位图IDC_Picture115纸牌2位图IDC_Picture216纸牌3位图IDC_Picture317纸牌4位图IDC_Picture418游戏菜单19帮助菜单20发牌菜单ID_START21验算菜单ID_CALC22结束菜单ID_OK23关于菜单ID_ABOUT3.3 关键功能的实现1)纸牌显示:在BOOL CHukunDlg:OnInitDialog( )中,使用LoadBitmap( )加载纸牌位图,然后在void CHukunDlg:OnStart( )中,通过SetBitmap( )显示纸牌。2)随机发牌:在void CHukunDlg:OnStart( )中,通过随机函数Numberi=rand()%13得到随机数,控制纸牌的显示。同时为了使每次运行程序时发牌都不一样,需要调用系统时间做种子,语句srand(unsigned) time(&t)来实现。3)计时:使用SetTimer( )函数设置计时器,使用SetRange( ),SetStep( )和SetPos( )函数设置进度条, 将控制进度条的函数置于OnTimer( )函数中。每次计时器向窗口发送消息WM_TIMER时会触发函数OnTimer( ),从而使进度条前进。4)难度变化:三种难度有各自不同的ID值,通过获取ID值使系统明白所选难度。通过变量m_length改变进度条的变化范围,即通过改变函数SetRange( )来控制不同难度下游戏时间的长短。通过变量m_PScore控制不同难度下每答对一题给予的分值奖励。5)验算结果:利用堆栈思想编写多项式算法,通过void CHukunDlg:OnCalc( )调用算法函数qiuzhi( )。系统通过GetWindowText( )获取用户的输入后,调用void CHukunDlg:OnCalc( )对用户输入进行检验,并根据结果给出相应提示和加分。6)结束:调用函数void CHukunDlg:OnOk( )。4. 结论与心得体会 通过对各项功能的测试,发现本程序均能达到要求。因此,本程序从设计思路到代码编写到最后的结果都是符合设计规范的,是正确无误的。这次课程设计,给了我很多启发。在一开始拿到选题表时,仅仅是因为感觉24点游戏有意思才选择了它。当进行程序流程图的绘制时,也感觉比较容易,因为仅仅只写个函数名,主要是对MFC运行过程的熟悉。而真正开始编程时才发现,自己平时学的都是纸上谈兵。虽然课本已经看了个遍,MFC编程部分更是看了几遍,可真正动手起来,还是无从下手。且不说编得如何,单单对控件的设计就是丢三落四的,不是忘了添加变量,就是菜单没有进行关联。总之,平时不注意的一些小细节,反而造成了大错误,而且还不容易发现。在编写代码过程中,更是困难重重,漏洞百出。最开始编写结束后我印象极为深刻,当时一共有30多个错误,当然,不少是重复的。尽管如此,也让我一阵眩晕,一个完美的程序果然是要经过无数次修改才行的。编程遇到的最大的问题就是多项式算法的编写,尽管通过数据结构的学习已经知道需要用到栈来实现,同时对其原理也理解了,但是实际应用中还是存在不少问题,而且开始时在网上还找不到资料(实际是查阅方法不对),代码的编写总是不能很好的应用起来。后来通过询问老师和查阅资料,反复试验后终于成功了,当时用欣喜若狂形容也不为过,那种感觉大概就是无数编程员能坦然面对枯燥繁杂的代码,孜孜不倦的追求更人性化、多功能化程序的动力吧。在课程设计即将结束时,我总结得到的启发:1.对于编程这类实践性的课程,绝对不要停留在书本上,看十本书不如动手一次;2.查阅资料是一门学问,具有一定的技巧,学会正确快速查询是我们必备的能力;3.准备要充分,方向要明确,定下来后就不要因旁人影响东添西改,否则容易出错且混乱不堪;4.不要妄想一步登天,任何一件事情都需要从基本到高级一步步来;5.不要怕出错,对于初学者来说,改错是一种极好的学习过程,快速又有效。通过这次课程设计,对于C+认识终于从理论提升到了实践,尽管我们编写的都是极其简单的程序,但起码掌握了一个程序的设计制作过程,MFC应用程序的启动流程,和简单代码的编写。总而言之,对于C+的编程,可以说是初窥门径了。5. 参考文献1 刘卫宏、陈培Visual c+编程基础上海理工大学出版社20032 侯伯亨点游戏的各种开发工具西安电子科技大学出版社20013 揣锦华面向对象程序设计与VC+实践西安电子科技大学出版社20056. 思考题(1) 改变难度可以变化游戏的限时和游戏加分的规则,如何实现?答:游戏的限时是通过改变进度条的SetRange( )函数来实现的。定义变量m_length,将函数设置为m_Progress->Setrange(0,m_lenght),用变量来设置进度条的变化范围,选择不同难度的时候m_length的值也会不同,难度越大它的值越小,时间也就越短,反之时间越长。 同理,加分也定义变量m_PScore,不同的难度m_PScore值不同。即每答对一题,给予的加分各不相同,难度越大分值越高,反之越小。(2) 如何使用随机函数控制扑克牌的显示?答:先利用语句srand(unsigned) time(&t)以系统时间做种子,使每次打开程序时扑克牌显示不会重复。再通过Numberi=rand()%13,可以获得012这13个数字,在初始化函数OnInitDialog()中,加载位图时已经通过语句Bitmap0.LoadBitmap(IDB_BITMAP27)(其余类似)将这13个数字分别与13张扑克牌位图对应。故在OnStart函数中,通过语句(CStatic*)GetDlgItem(IDC_Picture1)->SetBitmap(BitmapNumber0)(其余类似)显示对应的扑克牌图案。(3) 如何保证程序是根据给出的牌来书写算式的?答:定义数组与扑克牌点数关联,每一项一一对应。当用户点击“验算”后,系统将把输入的四个运算数与数组元素(即显示的四张牌)相比较,一样则进行下面的各项操作,否则提示错误。7. 附录7.1 调试报告1)运行程序出错,错误显示:d:我的文档桌面课程设计胡坤hukunhukunDlg.cpp(412) : error C2065: m_PScore : undeclared identifierd:我的文档桌面课程设计胡坤hukunhukunDlg.cpp(447) : error C2065: m_length : undeclared identifier这两个错误都是没有给定义的变量添加声明造成的。只需要在hukunDlg.h中的class CHukunDlg : public Cdialog中将变量声明添加入public里即可。2)一次输入结束后重新开始发现进度条没有清零,仍然接着上次的进度继续走。其原因为在OnStart( )函数中没有设定进度条的初始状态,应该添加m_Progress->SetPos(0)。3)添加菜单后,将各个菜单项与对应按钮地ID值改为相同,同时给菜单连接了类,但运行时仍未显示菜单栏。开始一直以为是ID的问题,结果是菜单没有与主窗口连接。这都是菜单添加不熟悉造成得。7.2 测试结果1)程序正确运行后,界面显示与要求相符合,难度默认为简单,得分栏为零。图2 进入程序初始界面2)选定难度后,点击“发牌”,进度条走动,“发牌”按钮名称变为“重新开始”。在正确输入后点击“验算”后弹出“你真行!”对话框,同时得分栏分数增加。图3 点击“发牌”后界面图4 输入正确时界面3)输入结果不为24时弹出“输入错误!”对话框。图5 输入错误界面4)在规定时间内没完成输入,弹出“时间到!”对话框。图6 时间到界面7.3 关键源代码1)在hukunDlg.h中的class CHukunDlg : public CDialog类中添加公有成员:int Number4;CStatic* m_Static4;CBitmap Bitmap13;int m_length;int m_PScore;2)在hukunDlg.cpp中开头部分添加定义:#include "string.h"#include "math.h"#include "stdlib.h"#include "stdio.h"#define stack_init_size 100#define stackincrement 10#define maxlen 100#define ok 1#define error 0typedef int status;#define overflow -23)以下为关键代码:BOOL CHukunDlg:OnInitDialog()CDialog:OnInitDialog();/ Add "About." menu item to system menu. Bitmap0.LoadBitmap(IDB_BITMAP27); /载入已经创建好的纸牌位图对象 Bitmap1.LoadBitmap(IDB_BITMAP28); Bitmap2.LoadBitmap(IDB_BITMAP29); Bitmap3.LoadBitmap(IDB_BITMAP30); Bitmap4.LoadBitmap(IDB_BITMAP31); Bitmap5.LoadBitmap(IDB_BITMAP32); Bitmap6.LoadBitmap(IDB_BITMAP33);Bitmap7.LoadBitmap(IDB_BITMAP34); Bitmap8.LoadBitmap(IDB_BITMAP35);Bitmap9.LoadBitmap(IDB_BITMAP36);Bitmap10.LoadBitmap(IDB_BITMAP37);Bitmap11.LoadBitmap(IDB_BITMAP38);Bitmap12.LoadBitmap(IDB_BITMAP39); CProgressCtrl*m_Progress=(CProgressCtrl*)GetDlgItem(IDC_PROGRESS); /设置指向进度条的指针 m_Progress->SetStep(1); /设置进度条每次向前1个单位m_Progress->SetPos(0); /设置进度条初始状态处于0位 GetDlgItem(IDC_CALC)->EnableWindow(FALSE); /使“验算”按钮不可用 CheckRadioButton(IDC_Easy,IDC_Hard,IDC_Easy); /使难度默认为“简单”/多项式算法typedef struct char *base,*top; int stacksize;sqstack1; /定义运算符栈typedef struct float *base,*top; int stacksize;sqstack2; /定义运算数栈int isp(char a) /栈内优先数 int e; if(a=*|a=/) e=2; if(a=+|a=-) e=1; if(a=() e=0; if(a=) e=-1; return e;int icp(char a) /栈外优先数 int e; if(a=*|a=/)e=2; if(a=+|a=-)e=1; if(a=()e=3; return e;status initstack1(sqstack1 &s) /运算符栈的初始化 s.base=(char*)malloc(stack_init_size*sizeof(char); if(!s.base)exit(overflow); s.top=s.base; s.stacksize=stack_init_size; return ok;status gettop1(sqstack1 s, char &e) /取栈顶元素 if(s.top=s.base)return error; e=*(s.top-1); return ok;status push1(sqstack1 &s,char e) /进栈 if(s.top-s.base>=s.stacksize) s.base=(char*)realloc(s.base,(s.stacksize+stackincrement)*sizeof(char); if(!s.base)exit(overflow); s.top=s.base+s.stacksize; s.stacksize+=stackincrement; *s.top+=e; return ok;status pop1(sqstack1 &s,char &e) if(s.top=s.base)return error; e=*-s.top; return ok;status initstack2(sqstack2 &s) /运算数栈的初始化 s.base=(float*)malloc(stack_init_size*sizeof(float); if(!s.base)exit(overflow); s.top=s.base; s.stacksize=stack_init_size; return ok;status gettop2(sqstack2 s, float &e) /取栈顶元素 if(s.top=s.base)return error; e=*(s.top-1); return ok;float push2(sqstack2 &s,float e) /进栈 if(s.top-s.base>=s.stacksize) s.base=(float*)realloc(s.base,(s.stacksize+stackincrement)*sizeof(float); if(!s.base)exit(overflow); s.top=s.base+s.stacksize; s.stacksize+=stackincrement; *s.top+=e; return ok;float pop2(sqstack2 &s,float &e) /出栈 if(s.top=s.base)return error; e=*-s.top; return ok;status postfix(char la,char lb) int i,j,k; char c,ea,eb,ec; sqstack1 optr; initstack1(optr);ec=; push1(optr,ec); /optr栈的初始化,栈底为= i=0;j=0; c=la0; while(c!=&& i<maxlen) /k指示是否是运算数 if(c>=0&&c<=9)|c=.)lbi+=c;k=0; else if(c=) /遇" ) "则一直退到" ( " lbi+= ; gettop1(optr,ea); while(ea!=( ) pop1(optr,eb); lbi+=eb;lbi+= ;k=1; gettop1(optr,ea); pop1(optr,eb); else if(i>1&&k=0)lbi+= ; gettop1(optr,ea); while(isp(ea)>=icp(c) /比较优先级 pop1(optr,eb);gettop1(optr,ea); lbi+=eb;lbi+= ;k=1; push1(optr,c);lbi+= ; c=la+j; gettop1(optr,ea); while(ea!=) /退栈到栈底 lbi+= ;pop1(optr,eb);lbi+=eb; gettop1(optr,ea); if(i=maxlen)return(overflow); else lbi+= ;lbi=; return ok; float qiuzhi(char lb) int i,j,k,n,flag; float m,e,ta,tb,d,t;float *p; char c; sqstack2 opnd; initstack2(opnd); /opnd栈的初始化 i=j=n=0;flag=0; c=lb0; while(c!=) if(c= ) if(j>=2) /把字符转化为实数 m=0;k=j; while(j>0) pop2(opnd,e); /弹出栈顶元素 m+=e*(float)pow(10,k-j);j-; m=m/(float)pow(10,n); push2(opnd,m); else j=0; n=0;flag=0; /flag指示小数点的起始,n指示小数点后的位数 else if(c>=0&&c<=9)|c=.) if(c=.)flag=1; else if(flag=1)n+; d=(float)(c-0);push2(opnd,d);j+; else /遇运算符则取数进行运算 pop2(opnd,ta);pop2(opnd,tb); /弹出栈顶两个元素进行运算 if(c=*)t=ta*tb; if(c=/)if(ta=0)return error;else t=tb/ta; /除数为0返回0 if(c=+)t=ta+tb; if(c=-)t=tb-ta; push2(opnd,t); p=opnd.base; c=lb+i; gettop2(opnd,e); return e; /返回计算结果void CHukunDlg:OnCalc() / TODO: Add your control notification handler code hereKillTimer(1); /清除计时器int i=1; float result;char str50;char cbufer50; char exps50; m_Input.GetWindowText(cbufer,20); /获取用户输入 strcpy(str,cbufer); postfix(str,exps); char c=exps0; while(c!=) c=expsi; i+; result=qiuzhi(exps); /调用多项式算法函数 if (result=24.0)m_Score+=m_PScore; /加分UpdateData(FALSE); /分数显示AfxMessageBox("你真行!",MB_OK);else AfxMessageBox("输入错误!",MB_OK);void CHukunDlg:OnOk() / TODO: Add your control notification handler code hereOnOK(); /退出void CHukunDlg:OnStart() / TODO: Add your control notification handler code herem_Input.SetWindowText(""); /编辑框空白显示UpdateData(FALSE); time_t t; srand(unsigned) time(&t); /以系统时间作为种子for(int i=0;i<4;i+) Numberi=rand()%13; /产生随机数 (CStatic*)GetDlgItem(IDC_Picture1)->SetBitmap(BitmapNumber0); /位图显示 (CStatic*)GetDlgItem(IDC_Picture2)->SetBitmap(BitmapNumber1); (CStatic*)GetDlgItem(IDC_Picture3)->SetBitmap(BitmapNumber2);(CStatic*)GetDlgItem(IDC_Picture4)->SetBitmap(BitmapNumber3);UpdateData(FALSE);GetDlgItem(IDC_START)->SetWindowText("重新开始"); /“发牌”按钮显示变为“重新开始”GetDlgItem(IDC_CALC)->EnableWindow(TRUE); /使“验算”按钮可用 int iRADIO=GetCheckedRadioButton(IDC_Easy,IDC_Hard); /难度的判断if(iRADIO=IDC_Easy) m_length=90; /进度条上限设定 m_PScore=1; /奖励分值设定 else if(iRADIO=IDC_Middle) m_length=45; m_PScore=3;else if(iRADIO=IDC_Hard) m_length=15; m_PScore=5; CProgressCtrl* m_Progress=(CProgressCtrl*)GetDlgItem(IDC_PROGRESS); /定义指向进度条的指针 m_Progress->SetPos(0); /设置进度条的初始状态 SetTimer(1,1000,NULL); /设置计时器每隔1S发送一次消息 GetDlgItem(IDC_Easy)->EnableWindow(FALSE); /使难度选择按钮不可用 GetDlgItem(IDC_Middle)->EnableWindow(FALSE); GetDlgItem(IDC_Hard)->EnableWindow(FALSE); void CHukunDlg:OnTimer(UINT nIDEvent) / TODO: Add your message handler code here and/or call defaultif(nIDEvent=1)CProgressCtrl* m_Progress=(CProgressCtrl*)GetDlgItem(IDC_PROGRESS);m_Progress->SetPos(m_Progress->GetPos( )+1); /进度条前进一个单位m_Progress->SetRange(0,m_length); /设置进度条的范围if(m_Progress->GetPos( )>=m_length) /判断是否超时KillTimer(nIDEvent);AfxMessageBox("时间到!",MB_OK); GetDlgItem(IDC_CALC)->EnableWindow(FALSE); /“验算”按钮不可用 CDialog:OnTimer(nIDEvent);void CHukunDlg:OnAbout( ) /菜单“关于”中的内容显示/ TODO: Add your command handler code hereMessageBox("这是一个24点游戏,作者:胡坤 "); 18

    注意事项

    本文(24点游戏程序课程设计说明书(C++实现).doc)为本站会员(带****)主动上传,人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知人人文库网(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    网站客服QQ:2881952447     

    copyright@ 2020-2024  renrendoc.com 人人文库版权所有   联系电话:400-852-1180

    备案号:蜀ICP备2022000484号-2       经营许可证: 川B2-20220663       公网安备川公网安备: 51019002004831号

    本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知人人文库网,我们立即给予删除!