您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 24点游戏课程设计报告
目录1基本功能描述2设计思路3软件设计3.1设计步骤3.2界面设计3.3关键功能实现3.3.1发牌功能的实现3.3.2计时功能的实现3.3.3计算功能的实现3.3.4验算功能的实现4结论与心得体会5参考文献6思考题7附录7.1调试报告7.1.1变量未定义造成的错误7.1.2管件类未添加7.1.3进度条错误7.2测试结果7.2.1在规定时间内完成点击“验算”按钮操作7.2.2在规定时间内未完成点击按钮操作7.3关键源代码24点游戏课程设计报告1基本功能描述24点游戏是一种使用扑克牌来进行的益智的游戏,游戏内容为:从一副扑克牌四个花色的1到K等52张牌中,任意抽取4张牌,运用加、减、乘、除和括号等运算符把牌面上的数进行运算得到24。游戏有不同的版本,其实是对J、Q、和K的处理有所不同。有的版本版本是把J、Q、和K去除,只用1到10来进行游戏;有的版本是把J、Q、和K当成10;还有的版本是用J表示11,Q表示12,K表示13。此次课程设计采用的是把J表示11,Q表示12,K表示13,使游戏的四张牌在1~K这13张牌中随机取牌。具体功能如下:1)对游戏设计三个难易级别,分别为一级、二级和三级。每次开始游戏前可以根据玩家的需要进行难度设置,如若不设置,系统默认难度级别为一级,设置完难度级别之后就可以开始游戏了,单击“开始”按钮,桌面上出现四张翻开的扑克牌,与此同时,游戏开始计时,进度条开始前进。2)在规定的时间内,玩家可以在“输入结果”的编辑框中输入自己想好的算式,然后点击“验算”按钮:如果输入的算式经运算后所的答案正确,则会弹出“Congregations,答对了!”的窗口;如果输入的数字与给出的牌的数字不符或者符号不合法,则会弹出“Sorry,请输入正确的算式!”的窗口;如果输入的数字与四张牌相符、字符亦合法但是答案不正确,则会弹出“Youransweriswrong!”的窗口;如果未输入任何的数字和算符,则会弹出“输入不能为空!”的窗口。3)如果在规定的时间内,玩家没有点击验算按钮,则会弹出“TimeOver!”的窗口。4)在结束本轮游戏后,如果玩家想继续游戏,则可点击“开始”按钮即可重新发牌,开始下一轮的游戏;如果玩家想结束游戏,则可点击“结束”按钮即可结束游戏2设计思路24点游戏的具体流程图如下图“图1”所示。下面是对流程图的详细说明。在游戏开始前有有难度级别设置选项,玩家可以根据自己的实际水平来进行设置。难度级别有三个级别,分别为一级、二级和三级。此三个级别是通过给玩家的思考的时间的长短来区别的,级别越高,可用时间越少。这个难易程度设置不是必选项。如果玩家不设置难易程度,那么系统就默认为难度级别一。初始化:OnInitDialog()是否设置难易程度?一级:m_Hardlevel=2000二级:m_Hardlevel=1000三级:m_Hardlevel=500发牌:srand();rand()计时开始:OnTimer()输入算式,进行计算SubCompute();TotalCompu开始时间是否到?OnYanSuan()函数判断计算结果是否为24?系统默认难度级别为一级m_Hardlevel=2000为输入任何算式“输入不能为空”输入字符错误“Sorry,请输入正确的算式!”运算结果正确“Congregations,答对了!”运算结果错误“Youransweriswrong!”显示“TimeOver!”AfxMessageBox()结束结束否?图124点游戏程序流程图YNNYNYNY按下“发牌”按钮游戏开始,通过调用srand()和rand()函数,桌面上会随机显示出4张纸牌,这四张牌从1~K这10张牌中随机的调出。与此同时,标识耗时时标的进度条开始前进。计时同步开始(SpendTime++)。通过每隔不同的时间来发送信息来控制三个级别的时间不同。设置了时间限制,如果(m_progress.GetPos()=100)代表游戏结束,用户没有时间进行思考了,本轮游戏结束,在函数OnTimer()的作用下,会弹出对话“超时!”。如果用户在限定时间内按下了“验证”按钮,系统会通过对SubCompute()和TotalCompute()两函数的调用进行相应运算,接下来系统调用OnYanSuan()函数对编辑框玩家输入的算式结果进行验算,根据不同的验算情况给出相应的结果。结果分别为:(1)如果玩家在编辑框中没有输入任何数字和算符而直接按下了“验算”按钮,则会弹出“输入不能为空白!”的提示对话框。(2)如果玩家输入的数字与扑克牌给出的数字不符合,则会弹出“Sorry,请输入正确的算式!”的提示对话框。(3)如果玩家输入的数字与四张牌相符、字符亦合法但是计算结果不为24,会弹出“Youransweriswrong!”的提示对话框。(4)如果玩家输入算式经运算后所得答案正确,则会弹出“Congregations,答对了!”的提示对话框。上述任意一种情况下,只要点击弹出框中的“确定”按钮,系统会自动结束此次游戏,接下来可以单击“开始按钮”进行下一轮的游戏或则单击“结束”按钮推出此游戏。3软件设计3.1设计步骤具体的设计步骤如下:1)在VC++6.0中,用自己的名字gaoqingzhi建立一个MFCAppWizard(exe)工程,在应用程序类型中选择“基本对话框”,其余的都采用默认选项,即可完成对话框的创建。2)在对话框中添加4个图像(分别用于四张扑克牌),9个按钮(分别是(、+、—、*、/、)、开始、运算、结束),1个编辑框(输入算式),一个进度条和三个单选按钮(用于选择难度级别)接着根据属性对以上所添加的控件进行属性修改,主要进行重命名,以便编辑源代码的时候区分,另外对图像的处理除了对其进行重命名外还要对其添加位图。之后通过打开C:\WINDOWS\system32打开cards.dll加载Bitmap图片,并选中对其进行重命名。3)接着对以上添加的控件建立类向导。主要有AddFunction、AddVariable和EditCode这三项的添加。4)根据流程图在类的原文件中逐一添加实现各个模块其功能所需要的各种函数,并添加相应的源代码,同时在头文件中添加对各种函数及变量的声明。5)对编译好的程序进行保存,开始进行调试,边调试边根据报错对原程序进行修改,直到程序不再进行报错为止。图224点游戏运行图3.2界面设计24点游戏所用控件说明图如下:表1控件类型、ID及相关说明对象IDCaption或说明变量名静态文本IDC_STATIC静态文字说明一级单选按钮IDC_RADIO1一级m_Hardleve二级单选按钮IDC_RADIO2二级三级单选按钮IDC_RADIO3三级位图IDC_Picture0位图位图IDC_Picture1位图位图IDC_Picture2位图位图IDC_Picture3位图编辑框IDC_EDIT输入计算m_input进程IDC_PROGRESS耗时m_Progress对象IDCaption或说明变量名按钮IDC_ZOUKUO(按钮IDC_JIA+按钮IDC_JIAN-按钮IDC_CHENG*按钮IDC_CHU/按钮IDC_YOUKUO)按钮IDC_KAISHI开始按钮IDC_YANSUAN验算按钮IDC_JIESHU结束3.3关键功能实现3.3.1发牌功能的实现首先,通过Number[i]=rand()%13。来产生0-12的随机数,利用该函数加载了标号1~K的13张纸牌和一张背景纸牌。然后运行中的以下一段代码,即可在图像框中得到四张铺开的纸牌。代码如下:srand((int)time(0));for(inti=0;i4;i++)Number[i]=rand()%13;//产生0-12的随机数m_picture0.SetBitmap(m_card[Number[0]]);//发牌m_picture1.SetBitmap(m_card[Number[1]]);m_picture2.SetBitmap(m_card[Number[2]]);m_picture3.SetBitmap(m_card[Number[3]]);srand()用来设置rand()产生随机数时的随机数种子。参数必须是个整数,所以用int型通常可以利用geypid()或time(0)的返回值来当做seed。如果每次seed都设相同值,rand()所产生的随机数值每次就会一样。rand的内部实现是用线性同余法实现的,可以产生随机数,rand()会返回一随机数值,范围在0至RAND_MAX间。调用此函数可以产生随机数,但必须先利用srand()设好随机数的种子,如果没有设置随机数的种子,rand()在调用时会自动把其设置为1。这样就可以实现随机发牌的功能。3.3.2计时功能的实现首先,在OnStart()中,通过每隔不同的时间来发送信息来控制三个级别的时间不同。设置了时间限制,如果(m_progress.GetPos()=100)代表游戏结束,用户没有时间进行思考了,本轮游戏结束,在函数OnTimer()的作用下,会弹出对话“超时!”。源代码如下:m_progress.StepIt();if(m_progress.GetPos()=100){KillTimer(1);AfxMessageBox(超时!);}elseCDialog::OnTimer(nIDEvent);3.3.3计算功能的实现对于输入结果的计算,主要是通过intLastPos(CStringStr),intFirstPos(CStringStr),charFirstF(CStringStr),intSubCompute(CStringStr),intTotalCompute(CStringStr)等函数来来确定输入的算式的优先级别并且计算出输入算式的最终结果。现摘两段代码进行详细说明。代码1:intFirst=Str.ReverseFind('(')+1;while(First){CStringSubStr=Str.Mid(First,(Str.GetLength()-First));intLast=SubStr.Find(')')+1;Last+=First;CStringLeftStr=Str.Mid(0,First-1);CStringMiddle=Str.Mid(First,Last-First-1);CStringRight=Str.Mid(Last,Str.GetLength()-Last);intResult=SubCompute(Middle);Middle.Format(%d,Result);Str=LeftStr+Middle+Right;First=Str.ReverseFind('(')+1;}intResult=SubCompute(Str);returnResult;}intFirst=Str.ReverseFind('(')+1;的作用是定位最后一个“(”号位置。Last+=First;作用是定位最后一个“(”号以后的最开始的“)”号位置。CStringLeftStr=Str.Mid(0,First-1);是标明“(”号左边的字符串。CStringRight=Str.Mid(Last,Str.GetLength()-Last);是标明“)”号右边的字符串。则可以确定出最高优先级别()的位置,然后对其之间的数字与算符进行最先计算。代码2://定位第一个*号或/号的位置intMulPos=Str.Find('*')+1;intDivPos=Str.Find('/')+1;First=MulPos;if(MulPosDivPos)First=DivPos;if(DivPos==0&&MulPos!=0){First=MulPos;DivPos=2000;//将除号所在位置设置成一个大于MulPos但又不可能的值}if(DivPos!=0&&MulPos==0){First=DivPos;//将乘号所在位置设置成一个大于DivPos但不可能的值
本文标题:24点游戏课程设计报告
链接地址:https://www.777doc.com/doc-5560256 .html