VC++课程设计24点游戏Word下载.docx
- 文档编号:19567192
- 上传时间:2023-01-07
- 格式:DOCX
- 页数:13
- 大小:145.47KB
VC++课程设计24点游戏Word下载.docx
《VC++课程设计24点游戏Word下载.docx》由会员分享,可在线阅读,更多相关《VC++课程设计24点游戏Word下载.docx(13页珍藏版)》请在冰豆网上搜索。
还有的版本是用J表示11,Q表示12,K表示13。
此次课程设计采用的是把J表示11,Q表示12,K表示13,使游戏的四张牌在1~K这13张牌中随机取牌。
第二章系统分析
24点游戏的具体流程图如下图“图2”所示。
下面是对流程图的详细说明。
进入游戏后,玩家可以单击发牌按钮,系统会自动给你发4张牌,玩家根据自己的理解,选择4张牌的运算方法和运算顺序。
如果玩家不能在规定的时间内不能做出正确的答案,玩家可以选择系统提示,玩家根据提示的输入运算方法输入,得到结果。
如果玩家不选择系统提示,也可以选择重做,计时器会重新计时。
如果时间超时,系统会自动显示正确的答案。
在一轮游戏结束后,玩家可以选择重新发牌,继续游戏。
游戏结束后退出游戏。
系统结构图如下:
图1游戏结构图
按下“发牌”按钮游戏开始,通过调用srand()和rand()函数,桌面上会随机显示出4张纸牌,这四张牌从1~K这10张牌中随机的调出。
与此同时,标识耗时时标的进度条开始前进。
设置了时间限制,如果(m_progress.GetPos()>
=100)代表游戏结束,用户没有时间进行思考了,本轮游戏结束。
如果用户在限定时间内按下了“验证”按钮,系统会通过对SubCompute()和TotalCompute()两函数的调用进行相应运算,接下来系统调用OnYanSuan()函数对编辑框玩家输入的算式结果进行验算,根据不同的验算情况给出相应的结果。
第三章游戏设计
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及相关说明
对象
ID
Caption或说明
变量名
静态文本
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
按钮
IDC_ZOUKUO
(
IDC_JIA
+
IDC_JIAN
-
IDC_CHENG
*
IDC_CHU
/
IDC_YOUKUO
)
IDC_KAISHI
开始
IDC_YANSUAN
验算
IDC_JIESHU
结束
3.3关键功能实现
1.发牌功能的实现
首先,通过Number[i]=rand()%13。
来产生0-12的随机数,利用该函数加载了标号1~K的13张纸牌和一张背景纸牌。
然后运行中的以下一段代码,即可在图像框中得到四张铺开的纸牌。
代码如下:
srand((int)time(0));
for(inti=0;
i<
4;
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。
这样就可以实现随机发牌的功能。
2.计时功能的实现
首先,在OnStart()中,通过每隔不同的时间来发送信息来控制三个级别的时间不同。
=100)代表游戏结束,用户没有时间进行思考了,本轮游戏结束,在函数OnTimer()的作用下,会弹出对话“超时!
”。
源代码如下:
m_progress.StepIt();
if(m_progress.GetPos()>
=100)
{
KillTimer
(1);
AfxMessageBox("
超时!
"
);
}
else
CDialog:
:
OnTimer(nIDEvent);
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('
)'
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('
intResult=SubCompute(Str);
returnResult;
}
intFirst=Str.ReverseFind('
的作用是定位最后一个“(”号位置。
Last+=First;
作用是定位最后一个“(”号以后的最开始的“)”号位置。
CStringLeftStr=Str.Mid(0,First-1);
是标明“(”号左边的字符串。
CStringRight=Str.Mid(Last,Str.GetLength()-Last);
是标明“)”号右边的字符串。
则可以确定出最高优先级别()的位置,然后对其之间的数字与算符进行最先计算。
代码2:
//定位第一个*号或/号的位置
intMulPos=Str.Find('
*'
intDivPos=Str.Find('
/'
First=MulPos;
if(MulPos>
DivPos)
First=DivPos;
if(DivPos==0&
&
MulPos!
=0)
DivPos=2000;
//将除号所在位置设置成一个大于MulPos但又不可能的值
if(DivPos!
=0&
MulPos==0)
//将乘号所在位置设置成一个大于DivPos但不可能的值
MulPos=2000;
代码2的作用是定位第一个*号或/号的位置。
系统通过intMulPos=Str.Find('
)+1来查找定位“*”所在的位置,然后通过First=DivPos将乘号所在位置设置成一个大于DivPos但不可能的值。
通过intDivPos=Str.Find('
)+1来查找定位“/”所在的位置,然后通过DivPos=2000将除号所在位置设置成一个大于MulPos但又不可能的值。
这样就完成可定为第一个“*”或“/”的位置。
第四章调试
4.1调试报告
1.变量未定义造成的错误
在代码添加过程中,由于涉及到很多的函数和变量,有时候可能会出现某几个变量忘定义的情况,这些变量有可能是在头文件中忘记定义或者在某个函数体中忘记定义。
下面举一个在头文件中变量忘定义的例子,如下所示:
图3因变量未定义而出现的错误截面图
在添加完各个函数的代码完毕后,以为头文件会自动对相应得变量进行定义,但头文件没有对所有的变量都定义,于是出现了如上图所示的错误。
打开头文件,双击gaoqingzhiDlg.h,在classCDgaoqingzhiDlg:
publicCdialog类定义函数中添加对m_back参数的定义。
添加完毕后,重新进行编译,程序不再报这个错误。
此类错误出过几次,都是由于自己变成不严谨以后一定注意。
2.管件类未添加
建立好工程之后,在画图对话框中,添加各种控件后,逐一对每个控件重命名并且添加类向导。
对话框中出现的控件一般都不会忘记建立类向导,但有1个类向导是容易忘记的,它是IDC_PROGRESS1建立的类向导名称是OnOutofmemoryProgress1。
下面用图形表示这个错误,如下所示:
根据错误提示,重新选中图片,建立OnOutofmemoryProgress1的类向导。
建立完毕后,重新运行程序,不再提示开错误。
图4因关键类未添加而出现的错误截面图
4.2测试结果
1.在规定时间内完成点击“验算”按钮操作
测试过程中,由于既涉及到纸牌点数和运算符,又会涉及到运算式结果,于是相应地会显示出四种结果,下面用图形做相应说明:
1)没有输入任何数字和算符而直接按下了“验算”按钮。
如下图所示:
图6输入表达式为空而出现的游戏界面
2)输入的数字与扑克牌给出的数字不符合。
图7输入字符错误而出现的游戏界面
3)输入的数字与四张牌相符、字符亦合法但是计算结果不为24。
图8输入字符正确而运算结果不正确出现的游戏界面
4)输入输入算式经运算后所得答案正确。
图9输入结果正确而出现的游戏界面
2.在规定时间内未完成点击按钮操作
规定时间内未进行输入,或输入后未完成点击“验算”按钮操作,显示“TimeOver!
”,如下图所示:
图9规定时间内未进行输入出现的游戏界面
第五章总结
7月1号晚上考完我们这学期的最后一门考试,紧接着就开始了开始了为期一周的紧张的VC++课程设计,这已经是大学时代的第三次课程设计了,较之之前的两次,感觉这次的与以往大大不同,是利用自己的知识开发一个小游戏,心里着实兴奋了一把,但是这个设计用的是VC++的知识,由于掌握的不是很熟练,所以刚刚开始的时候,毫无头绪,感觉好难真的好难,难于上青天。
心里障碍阻当着我让我不敢向前迈步。
我很怕自己做不好,怕自己不能按时完成,很怕自己不如其他同学。
内心满是恐惧,被恐惧占具的心灵又怎么能出色的完成课程设计呢?
但是转念一想,大家都一样,都是刚学的知识,慢慢的调整了心态,开始进入状态,第一天和室友到图书馆去找资料,翻看之前的课件,按着书上实例做了一个计算器的笑例子,头脑又开始小兴奋了,原来拾起之前的知识真的不是很难,接着感觉越做越做越上手,心里充满了自豪感和自信心,感觉自己充满了干劲,接着全身心的投入都接下来的工作中。
最后在遇到重重困难,走了好多次的弯路之后终于完成了此次课设。
一下是这次课设的历程,过程虽然你艰辛,但终于做出了成果,很有成就感。
最初进行设计的时候,没有一点头绪,后来对照课本基本控件这一章,将计算器和菜单栏制作这两个范例做了几遍。
感觉很有收获,但是对于进程条的设置还是不清楚,又翻出课件来看重新学习,经与同学讨论,终于弄清了进程条的设置。
而对于编程,是最庞大又棘手的一块,那是忘得更多了,于是把课本和图书馆借来的参考书重新针对性的学了一次,遇到难处先是仔细的思考然后在向同学请教。
可以说开始的那么几天都是在查找资料,翻阅相关的书籍。
在最后添加代码的时候还有一些程序不知道怎么写。
于是,于是又利用了网络资源,收集里了一些,经分析、查询资料仍有一些地方看不懂。
就请教同学,尝试往对话框中添加相应代码的方法。
根据一大段的分析,感觉程序执行某个功能,将这段代码添加到对应位置。
所有的代码添加完后,运行、调试,开始会出现了很多很多的错误。
逐条进行修改,再进行运行和调试,有时候错误看不懂,就找同学商量。
也不知道错了多少次,改了多少次,终于最后做出了完美的游戏界面。
终于完成了设计。
在这次课程设计过程中,我的编程有了很大的提高,虽然有时候自己没有思路,但是可以借鉴别人的代码,看别人设计的思路,理解的同时自己小试一下也可以编出来,所以凡事不能被困难吓倒,只要有开始,去尝试。
就会有意想不到的收获。
其次,在运行、调试过程中也学到了很多,以前编程最怕的就是报错,尤其是错误多了的时候,感觉毫无头绪直接头大,但是编程不可能不出错,报错,只要逐一对付,然后细心研究改正,终究一切问题都会迎刃而解的,所以遇到问题,不能急,要心平气和的去应对,才能把所学的只是真正用于实际,这不得不说正是我们当代大学生所严重缺乏的,以后的学习中更应注意。
综上,一周的课程设计即将结束,虽然时间有些紧凑,虽然中间遇到好多的挫折,但毕竟是自己努力了的,自己收获的是过程中的酸甜苦辣,总体收获很大,有了此次的学习经验,我想以后的课程设计应该就会轻松的多吧。
通过这次课程设计,加强了我动手、思考和解决问题的能力。
比如细心还有耐心还有对自己有一定的自信等等。
而且课程设计同时也是对课本知识的巩固和加强,由于课本上的知识太多,平时只有课间的学习是远远不够的,所以以后要多花时间温故知新。
两个星期的课程设计,过程曲折可谓一语难尽。
在此期间我也从毫无头绪到一度热情高涨。
到从开始时满富盛激情到调不出结果的焦头烂额,到最后慧心的笑,点点滴滴无不令我回味无长。
总之对我而言,知识上的收获重要,精神上的丰收更加可喜。
挫折是一份财富,经历是一份拥有。
这次课设必是我人生旅途上一个非常美好的回忆!
参考文献
[1]揣锦华.面向对象程序设计与VC++实践.西安电子科技大学出版社,2005:
[2]刘弘,刘希玉.面向对象程序设计——VC++6.0与基于ACIS的几何造型.北京邮电大学出版社,2005:
282-292
[3]坂本千寻.VisualC++专业游戏程序设计[M].北京:
中国铁道出版社,2004年
[4]任哲.MFCWindows应用程序设计(第二版).北京:
清华大学出版社,2007
[5]罗伟坚.VC++经典游戏应用程序设计.北京:
人民邮电出版社,2007
[6]王明福,余苏宁.VisualC++程序设计.高等教育出版社,2003年12月
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VC 课程设计 24 游戏