计算24点游戏c++.docx
- 文档编号:18283993
- 上传时间:2023-08-15
- 格式:DOCX
- 页数:25
- 大小:504.39KB
计算24点游戏c++.docx
《计算24点游戏c++.docx》由会员分享,可在线阅读,更多相关《计算24点游戏c++.docx(25页珍藏版)》请在冰点文库上搜索。
计算24点游戏c++
24点游戏软件的开发
1概述
1.1课程设计目的
a、巩固并加深学生对C++语言程序设计知识的理解;
b、培养学生面向对象的程序设计思想,使学生认识面向过程和面向对象两种设计方法的区别;
c、进一步掌握和应用VC++6.0集成开发环境;
d、提高运用C++语言解决实际问题的能力;
e、初步掌握开发小型实用软件的基本方法,能独立设计、实现基本的MIS系统;
f、掌握书写程序设计开发文档的能力(书写课程设计实验报告)。
1.2课程设计内容
课题名称:
24点游戏软件的开发
说明:
24点游戏是一种常见的纸牌游戏说明
要求:
a)实现随机发牌;
b)能进行结果验算;
c)计分;
d)难度设置。
2系统需求分析
2.1系统目标
24点游戏是个流行的数学运算游戏。
本次课程设计通过24点游戏来加深我们对对话框编程的认识和理解,并介绍VisualC++在数学计算方面的应用,以及在按钮上设置位图和设置计时器的方法。
24点扑克游戏的规则是:
由系统发出4张扑克牌,要求用户利用扑克牌上显示的数字(JQKA算10),通过加减乘除运算得出24。
2.2主体功能
a.对游戏设计三个难易级别,分别为低级、中级和高级。
每次开始游戏前可以根据玩家的需要进行难度设置,如若不设置,系统默认难度级别为中级,设置完难度级别之后就可以开始游戏了,单击“发牌”按钮,桌面上出现四张翻开的扑克牌,与此同时,游戏开始计时,进度条开始前进。
b.在规定的时间内,玩家可以在“输入算式”的编辑框中输入自己想好的算式,然后点击“验算”按钮:
如果输入的算式经运算后所的答案正确,则会在编辑框中显示“正确!
”;如果输入的数字与给出的牌的数字不符或者符号不合法,则会弹出“内部错误!
”的窗口;如果输入的数字与四张牌相符、字符亦合法但是答案不正确,则会在编辑框中显示“错误”;如果未输入任何的数字和算符,则会弹出“内部错误!
”的窗口。
c.如果在规定的时间内,玩家没有点击验算按钮,则会弹出“内部错误”的窗口。
d.在结束本轮游戏后,如果玩家想继续游戏,则可点击“发牌”按钮即可重新发牌,开始下一轮的游戏;如果玩家想结束游戏,则可点击“结束”按钮即可结束游戏。
2.3开发环境
MicrosoftVisualC++6.0
3系统概要设计
3.1系统功能模块划分
a.建立一个随机产生扑克牌的模块。
由程序随机产生4张扑克牌,每张牌对应一个整数。
b.计时的模块。
定义一个计时器,以便对使用时间进行计数。
c.计算表达式的模块。
主要是通过函数来确定运算式各符号优先级和最终计算出输入算式的结果。
d.验算表达式正误的模块。
在规定的时间内输入算式进行验算,根据不同的情况会出现不同的对话框。
3.2系统流程图
图3-1系统流程图
说明:
按下“发牌”按钮游戏开始,通过调用函数,桌面上随机显示4张纸牌。
这4张纸牌从1-K中随机调出。
与此同时,标识耗时时标的进度条开始前进。
计时同步开始。
设置了时间限制,如果玩家没有在规定时间内输入表达式,本轮游戏结束,在函数OnTimer()的作用下,会弹出对话“内部错误”。
若用户在规定时间内点击了“验算”按钮,系统进行相应运算,紧接着系统调用验算函数对编辑框中运算出的结果进行验算,根据验算情况给出相应的结果。
出现的结果有以下四中情况:
(1)如果用户没在输入算式中输入算式,直接按“验算”按钮,会弹出“错误!
”的提示。
(2)如果输入的数字与给出的不符或者符号不合法,会弹出“错误!
”的提示。
(3)如果输入的数字与四张牌相符、字符亦合法但是答案不正确,会弹出“错误!
”。
(4)如果输入算式经运算后所得答案正确,则会弹出“正确!
”,点击弹出框中的“发牌”按钮,系统会自动给出本局的得分和耗时。
本轮游戏结束后,用户可以选择重新开始,否则,可以点击“结束游戏”按钮退出游戏。
4系统详细设计
4.1设计步骤
(a)在VC++6.0中,建立一个MFC AppWizard(exe)工程,在应用程序类型中选择“基本对话框”,其余的都采用默认选项,即可完成对话框的创建。
(b)在对话框中添加4个图像(分别用于四张扑克牌),4个按钮(分别是发牌、输入算式、验算、结束游戏),1个编辑框(输入算式),一个进度条和一个下拉式按钮(用于选择难度级别),接着根据属性对以上所添加的控件进行属性修改,主要进行重命名,以便编辑源代码的时候区分,另外对图像的处理除了对其进行重命名外还要对其添加位图。
通过插入-资源-Bitmap加载图片,图片通过拷贝和复制等操作加载完成。
加载完成的图片在对应的工作区可以找到,选中对其名字进行修改。
(c)接着对以上添加的控件建立类向导。
主要有Add Function、Add Variable和Edit Code这三项的添加。
(d)根据流程图在类的原文件中逐一添加实现各个模块其功能所需要的各种函数,并添加相应的源代码,同时在头文件中添加对各种函数及变量的声明。
(e)对编译好的程序进行保存,开始进行调试,边调试边根据报错对原程序进行修改,直至程序不再报错,并且可以实现预计的各种功能。
4.2界面设计
界面设计主要是创建控件,在ResoureView选项卡中打开Dialog资源组,双击IDD_ZHOUTONG_DIALOG,在右边的窗口中显示出待编辑的对话框。
开始摆放控件,包括编辑框和按钮的创建。
按钮的创建以“1”为例进行介绍,其他按钮的创建可参照此进行操作。
(a)在Controls的“编辑框”按钮上单击鼠标左键,在对话框编辑窗口上合适的位置按下鼠标左键并拖动鼠标画出一个大小合适的编辑框。
在编辑框上单击鼠标右键,在弹出的快捷菜单中选择属性选项,此时弹出Edit属性对话框,在该对话框中输入ID属性。
按照上面的操作过程编辑其他按钮和编辑框等对象的属性。
表4-1各按钮和编辑框等对象的属性
控件对象
ID
Caption
显示纸牌的静态控件1
IDC_STATIC1
/
显示纸牌的静态控件2
IDC_STATIC2
/
显示纸牌的静态控件3
IDC_STATIC3
/
显示纸牌的静态控件4
IDC_STATIC4
/
耗时标识提示静态控件
IDC_STATIC
耗时标识:
难度级别提示静态控件
IDC_STATIC5
难度级别:
当前得分提示静态控件
IDC_STATIC6
当前得分:
显示当前得分静态控件
IDC_STATIC7
/
历史记录提示静态控件
IDC_STATIC8
历史记录
发牌按钮
IDC_BUTTON1
发牌
输入算式按钮
IDC_BUTTON2
输入算式
验算按钮
IDC_BUTTON3
验算
结束游戏按钮
IDC_BUTTON4
结束游戏
进度条
IDC_PROGRESS1
/
输入算式编辑框
IDC_EDIT1
/
显示历史记录列表控件
IDC_COMBO1
/
难度级别选择组合框
IDC_LIST1
/
4.3关键功能的实现
a.发牌功能的实现,首先,通过BOOLCDingluDlg:
:
OnInitDialog()中,根据纸牌对应的ID号加载纸牌,。
利用函数加载了标号1~10的十张纸牌和两张背景纸牌。
然后运行代码,即可在图像框中得到四张铺开的纸牌。
b.计时功能的实现,在CPoint24Dlg:
:
OnTimer中通过m_progress.StepIt()设置是否超时。
如果(m_progress.GetPos()>=100)代表游戏结束,用户没有时间进行思考了,本轮游戏结束,在函数OnTimer()的作用下,会弹出对话“超时!
”
c.计算功能的实现,对于输入结果的验算,主要是通过函数来确定运算式各符号优先级和最终计算出输入算式的结果。
对于编辑框中输入的表达式进行计算,借助于Str=Left+Middle+Right;将有优先级差别同时表达式传送到SubCompute()函数中,最终计算出输入到编辑框中的表达式结果Result,并将其返回。
d.验算功能的实现,在规定的时间内输入算式进行验算,根据不同的情况会出现不同的对话框。
有以下四种情况:
如果用户没在输入算式中输入算式,直接按“验算”按钮,如果输入的数字与给出的不符或者符号不合法,会弹出“内部错误!
”的提示对话框;如果输入的数字与四张牌相符、字符亦合法但是答案不正确,会弹出“错误!
”;如果输入算式经运算后所得答案正确,则会弹出“正确!
”。
e.计分功能的实现,当用户在每局游戏结束后,如果没有计算出正确结果,则会在历史记录中显示1题错误;如果计算出了正确结果,则会在记录中显示1题正确并显示一个0~100之间的整数值。
用户最终得分的确定是由其选择的游戏级别和游戏所花费时间长短来确定的。
5测试
5.1测试方案
测试过程中,由于既涉及到纸牌点数和运算符,又会涉及到运算式结果,于是相应地会显示出四种结果,(a)如果玩家在编辑框中没有输入任何数字和算符而直接按下了“验算”按钮,则会弹出“内部错误!
”的提示对话框。
(b)如果玩家输入的数字与扑克牌给出的数字不符合,则会弹出“内部错误!
”的提示对话框。
(c)如果玩家输入的数字与四张牌相符、字符亦合法但是计算结果不为24,会弹出“内部错误!
”的提示对话框并在表达式编辑框中显示“错误!
”(d)如果玩家输入算式经运算后所得答案正确,则会在编辑表达式框中显示“正确!
”
5.2测试结果
(a)进入游戏界面
图5-1游戏界面
说明:
本界面为游戏初始界面,默认难度级别为中级。
(b)发牌
图5-2发牌界面
说明:
点击“发牌”按钮,自动发牌,计时进度条开始滚动。
(c)不输入验算公式界面
图5-3错误界面
说明:
当不输入验算公式时,游戏界面会显示错误的提示。
(d)输入验算公式
图5-4输入算式界面
图5-5正确输出界面
图5-6错误输出界面
说明:
点击输入算式后耗时标识停止,在旁边的输入框中输入算式后点击验算,正确或错误的界面会显示
(e)没有来的及输入表达式,超过限制时间,页面显示为
图5-7超时输出界面
说明:
.如果在规定的时间内,玩家没有点击验算按钮,则会弹出“内部错误”的窗口。
6.小结
这次课程设计,还是像往常一样,先由班长进行分组,每个小组完成一个任务。
这次我分到的学习任务是完成二十四点游戏软件开发的编程。
由于没有接触过游戏编程,一看到这个题目我就懵了。
但是课程设计还要继续,我先试着从网上搜寻我所需要的资料,可网上资料比较零散,在老师的提醒下,我去图书馆找到了我所需要的。
书中一些案例和我所要做的课程设计类似,经过自己知识上的补充和同组成员的协助,我顺利的完成了这次课程设计。
课程设计是本科学习阶段一次非常难得的理论与实际相结合的机会,通过这次比较完整的一个程序的设计,我摆脱了单纯的理论知识学习状态,和实际设计的结合锻炼了我的综合运用所学的基础知识,解决实际问题的能力,同时也提高我查阅文献资料、对程序整体的把握等其他能力水平,而且通过对整体的掌控,对局部的取舍,以及对细节的斟酌处理,都使我的能力得到了锻炼,经验得到了丰富。
这是我们都希望看到的也正是我们进行课程设计的目的所在。
虽然设计内容繁多,过程繁琐但我的收获却更加丰富。
各种组件的运用,各种算法的应用,各种控件的利用我都是随着设计的不断深入而不断熟悉并逐步掌握的。
和老师以及同学的沟通交流更使我对程序整体的规划与设计有了新的认识也对自己提出了新的要求。
根据我在实习中遇到得问题,我将在以后的学习过程中注意以下几点:
1、认真上好专业实验课,多在实践中锻炼自己。
2、写程序的过程中要考虑周到,严密。
3、在做设计的时候要有信心,有耐心,切勿浮躁。
4、认真的学习课本知识,掌握课本中的知识点,并在此基础上学会灵活运用。
5、在课余时间里多写程序,熟练掌握在调试程序的过程中所遇到的常见错误,以便能节省调试程序的时间。
课程设计不仅能提高我们对所学知识的综合运用能力,全面检查并掌握所学的内容,还让我懂得怎样把理论运用到实际,在实践中遇到问题怎样用理论解决。
在上机调试的过程中,我对数据结构这一门课所学的知识有了更深入的掌握和理解,巩固了理论教学所学到的知识,扩展了我的编程思想。
顺利如期的完成本次课程设计给了我很大的信心,但是也让多不足的地方,学习其实就是一个不断完善的过程,正视自己的不足之处,在以后的工作和学习中不断的弥补这些不足之处,在以后的生活中也要保持同样的态度,不断的完善自己。
参考文献
[1]谭浩强.C++程序设计(第二版)[M].北京:
清华大学出版社,2012.
[2]刘弘,刘希玉.面向对象程序设计——VC++6.0与基于ACIS的几何造型[M].北京:
北京邮电大学出版社,2005.
[3]杨正华,张秋生.VisualC++游戏编程导学[M].北京:
清华大学出版社,2004.
[4]谭浩强.C++程序设计题解与上机指导(第二版)[M].北京:
清华大学出版社,2012.
[5]肖永亮.VisualC++游戏编程基础[M].北京:
电子工业出版社,2005.
[6]肖宏伟.VisualC++实效编程百例[M].北京:
人民邮电出版社,2004.
[7]陈清华.VisualC++课程设计案例精选与编程指导[M].南京:
东南大学出版社,2004.
附录
附录1源程序清单
//Point24Dlg.cpp:
implementationfile
//Downloadby
#include"stdafx.h"
#include"Point24.h"
#include"Point24Dlg.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
//CAboutDlgdialogusedforAppAbout
classCAboutDlg:
publicCDialog
{
public:
CAboutDlg();
//DialogData
//{{AFX_DATA(CAboutDlg)
enum{IDD=IDD_ABOUTBOX};
//}}AFX_DATA
//ClassWizardgeneratedvirtualfunctionoverrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDVsupport
//}}AFX_VIRTUAL
//Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg:
:
CAboutDlg():
CDialog(CAboutDlg:
:
IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
voidCAboutDlg:
:
DoDataExchange(CDataExchange*pDX)
{
CDialog:
:
DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg,CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
//Nomessagehandlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//CPoint24Dlgdialog
CPoint24Dlg:
:
CPoint24Dlg(CWnd*pParent/*=NULL*/)
:
CDialog(CPoint24Dlg:
:
IDD,pParent)
{
//{{AFX_DATA_INIT(CPoint24Dlg)
m_inputs=_T("");
//}}AFX_DATA_INIT
//NotethatLoadIcondoesnotrequireasubsequentDestroyIconinWin32
m_hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);
//初始化变量
m_number1=m_number2=m_number3=m_number4=0;
m_pattern1=m_pattern2=m_pattern3=m_pattern4=129;
Step=500;
m_score=0;
m_factor=4;
count=0;
//设置列表框列属性
lvItem.mask=LVIF_TEXT|LVIF_IMAGE|LVIF_STATE;
lvItem.state=0;
lvItem.stateMask=0;
lvItem.iImage=0;
}
voidCPoint24Dlg:
:
DoDataExchange(CDataExchange*pDX)
{
CDialog:
:
DoDataExchange(pDX);
//{{AFX_DATA_MAP(CPoint24Dlg)
DDX_Control(pDX,IDC_LIST,m_list);
DDX_Control(pDX,IDC_PROGRESS,m_progress);
DDX_Control(pDX,IDC_COMBO,m_combo);
DDX_Control(pDX,IDC_EDIT1,m_input);
DDX_Text(pDX,IDC_EDIT1,m_inputs);
DDV_MaxChars(pDX,m_inputs,15);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CPoint24Dlg,CDialog)
//{{AFX_MSG_MAP(CPoint24Dlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_START,OnStart)
ON_BN_CLICKED(IDC_INPUT,OnInput)
ON_BN_CLICKED(IDC_CALC,OnCalc)
ON_CBN_SELCHANGE(IDC_COMBO,OnSelchangeCombo)
ON_WM_TIMER()
ON_COMMAND(IDD_ABOUT,OnAbout)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//CPoint24Dlgmessagehandlers
BOOLCPoint24Dlg:
:
OnInitDialog()
{
CDialog:
:
OnInitDialog();
//Add"About..."menuitemtosystemmenu.
//IDM_ABOUTBOXmustbeinthesystemcommandrange.
ASSERT((IDM_ABOUTBOX&0xFFF0)==IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX<0xF000);
CMenu*pSysMenu=GetSystemMenu(FALSE);
if(pSysMenu!
=NULL)
{
CStringstrAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if(!
strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);
}
}
//Settheiconforthisdialog.Theframeworkdoesthisautomatically
//whentheapplication'smainwindowisnotadialog
SetIcon(m_hIcon,TRUE);//Setbigicon
SetIcon(m_hIcon,FALSE);//Setsmallicon
//TODO:
Addextrainitializationhere
//设置组合框选项
m_combo.InsertString(0,"高级");
m_combo.InsertString(1,"中级");
m_combo.InsertString(2,"低级");
m_combo.SetCurSel
(1);
//设置记录条
m_progress.SetRange(1,100);
m_progress.SetStep
(2);
m_progress.SetPos(0);
//初始化分数
SetDlgItemText(IDC_CUR_SCORE,"0");
//设置列表框列属性
LV_COLUMNlvColumn;
lvColumn.mask=LVCF_FMT|LVCF_WIDTH|LVCF_TEXT|LVCF_SUBITEM;
lvColumn.fmt=LVCFMT_CENTER;
lvColumn.cx=52;
//设置列表框列标题
lvColumn.iSubItem=0;
lvColumn.pszText="题数";
m_list.InsertColumn(0,&lvColumn);
lvColumn.iSubItem=1;
lvColumn.pszText="对错";
m_list.InsertColumn(1,&lvColumn);
returnTRUE;//returnTRUEunlessyousetthefocustoacontrol
}
voidCPoint24Dlg:
:
OnSysCommand(UINTnID,LPARAMlParam)
{
if((nID&
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算 24 游戏 c+