1、24 点游戏软件的开发024点游戏软件的开发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 系统需求分析2.1 系统目标24点游戏是个流行的数学运算游戏。本次课程设计通过 24点游戏来加深我们对对话框编程的认识和理解,并介绍 Visual C+在数学计算方面的应用,以及在按钮上设置位图和设置计时器的方法。24点扑克游戏的规则是:由系统发出 4张扑克牌,要求用户利用扑克牌上显示的数字(JQKA 算 10) ,通过加减乘除运算得出 24。2.2 主体功能a.对游戏设计三个难易级别,分别为低级、中级和高级。每次开始游戏前可以根据玩家的需要进行难度设置,如若不设置,系统默认难度级别为中级,设置完难度级别之后就可以开始游戏了,单击“发牌”按钮,桌面上出现四张翻开的扑克牌,与此同时,游戏
3、开始计时,进度条开始前进。 b.在规定的时间内,玩家可以在“输入算式”的编辑框中输入自己想好的算式,然后点击“验算”按钮:如果输入的算式经运算后所的答案正确,则会在编辑框C+课程设计报告(2014 )1中显示“正确!” ;如果输入的数字与给出的牌的数字不符或者符号不合法,则会弹出“内部错误!”的窗口;如果输入的数字与四张牌相符、字符亦合法但是答案不正确,则会在编辑框中显示“错误” ;如果未输入任何的数字和算符,则会弹出“内部错误!”的窗口。 c.如果在规定的时间内,玩家没有点击验算按钮,则会弹出“内部错误”的窗口。 d.在结束本轮游戏后,如果玩家想继续游戏,则可点击“发牌”按钮即可重新发牌,开
4、始下一轮的游戏;如果玩家想结束游戏,则可点击“结束”按钮即可结束游戏。2.3 开发环境Microsoft Visual C+ 6.03 系统概要设计3.1 系统功能模块划分a.建立一个随机产生扑克牌的模块。由程序随机产生 4张扑克牌,每张牌对应一个整数。b.计时的模块。定义一个计时器,以便对使用时间进行计数。c.计算表达式的模块。主要是通过函数来确定运算式各符号优先级和最终计算出输入算式的结果。d.验算表达式正误的模块。在规定的时间内输入算式进行验算,根据不同的情况会出现不同的对话框。24 点游戏软件的开发23.2 系统流程图Y NNYNYYN是否设置难度?1.低级2.中级3.高级系统默认难度
5、级别为中级初始化发牌计时开始输入算式,进行计算比较函数值与参数值得大小 显示“错误!”验算函数判断计算结果是否为 24?超时,输入空白显示:“错误!”输入字符错误:显示:“错误!”运算结果正确:“正确!”运算结果错误:显示:“错误!”继续否? 结束开始图 3-1 系统流程图说明:按下“发牌”按钮游戏开始,通过调用函数,桌面上随机显示 4张纸牌。这 4张纸牌从 1-K中随机调出。与此同时,标识耗时时标的进度条开始前进。计时同步开始。设置了时间限制,如果玩家没有在规定时间内输入表达式,本轮C+课程设计报告(2014 )3游戏结束,在函数 OnTimer()的作用下,会弹出对话“内部错误” 。若用户
6、在规定时间内点击了“验算”按钮,系统进行相应运算,紧接着系统调用验算函数对编辑框中运算出的结果进行验算,根据验算情况给出相应的结果。出现的结果有以下四中情况:(1)如果用户没在输入算式中输入算式,直接按“验算”按钮,会弹出“错误!”的提示。 (2)如果输入的数字与给出的不符或者符号不合法,会弹出“错误!”的提示。 (3)如果输入的数字与四张牌相符、字符亦合法但是答案不正确,会弹出“错误!” 。 (4)如果输入算式经运算后所得答案正确,则会弹出“正确!” ,点击弹出框中的“发牌”按钮,系统会自动给出本局的得分和耗时。本轮游戏结束后,用户可以选择重新开始,否则,可以点击“结束游戏”按钮退出游戏。4
7、系统详细设计4.1 设计步骤(a)在 VC+6.0中,建立一个 MFC AppWizard(exe)工程,在应用程序类型中选择“基本对话框” ,其余的都采用默认选项,即可完成对话框的创建。(b)在对话框中添加 4个图像(分别用于四张扑克牌),4 个按钮(分别是发牌、输入算式、验算、结束游戏) ,1 个编辑框(输入算式) ,一个进度条和一个下拉式按钮(用于选择难度级别) ,接着根据属性对以上所添加的控件进行属性修改,主要进行重命名,以便编辑源代码的时候区分,另外对图像的处理除了对其进行重命名外还要对其添加位图。通过插入资源Bitmap 加载图片,图片通过拷贝和复制等操作加载完成。加载完成的图片在
8、对应的工作区可以找到,选中对其名字进行修改。(c)接着对以上添加的控件建立类向导。主要有Add Function、Add Variable 和 Edit Code这三项的添加。(d)根据流程图在类的原文件中逐一添加实现各个模块其功能所需要的各种函数,并添加相应的源代码,同时在头文件中添加对各种函数及变量的声明。(e)对编译好的程序进行保存,开始进行调试,边调试边根据报错对原程序进行修改,直至程序不再报错,并且可以实现预计的各种功能。4.2 界面设计界面设计主要是创建控件,在 Resoure View选项卡中打开 Dialog资源组,双击 IDD_ZHOUTONG_DIALOG,在右边的窗口中显
9、示出待编辑的对话框。开始摆放控件,包括编辑框和按钮的创建。按钮的创建以“1”为例进行介绍,其他按钮的创建可参照此进行操作。(a)在 Controls的“编辑框”按钮上单击鼠标左键,在对话框编辑窗口上合适的位置按下鼠标左键并拖动鼠标画出一个大小合适的编辑框。在编辑框上单击鼠标右键,在弹出的快捷菜单中选择属性选项,此时弹出 Edit属性对话框,在该对24 点游戏软件的开发4话框中输入 ID属性。 按照上面的操作过程编辑其他按钮和编辑框等对象的属性。表 4-1 各按钮和编辑框等对象的属性4.3 关键功能的实现a.发牌功能的实现,首先,通过 BOOL CDingluDlg:OnInitDialog()
10、中,根据纸牌对应的 ID号加载纸牌, 。利用函数加载了标号 110 的十张纸牌和两张背景纸牌。然后运行代码,即可在图像框中得到四张铺开的纸牌。b.计时功能的实现,在 CPoint24Dlg:OnTimer中通过 m_progress.StepIt()设置是否超时。如果(m_progress.GetPos()=100)代表游戏结束,用户没有时间进行思考了,本轮游戏结束,在函数 OnTimer()的作用下,会弹出对话“超时!”c.计算功能的实现,对于输入结果的验算,主要是通过函数来确定运算式各符号优先级和最终计算出输入算式的结果。对于编辑框中输入的表达式进行计算,借助于 Str=Left+Midd
11、le+Right;将有优先级差别同时表达式传送到SubCompute()函数中,最终计算出输入到编辑框中的表达式结果 Result,并将其返回。d.验算功能的实现,在规定的时间内输入算式进行验算,根据不同的情况会出现不同的对话框。有以下四种情况:如果用户没在输入算式中输入算式,直接按“验算”按钮,如果输入的数字与给出的不符或者符号不合法,会弹出“内部错误!”的提示对话框;如果输入的数字与四张牌相符、字符亦合法但是答案不正确,会弹出“错误!” ;如果输入算式经运算后所得答案正确,则会弹出“正确!” 。e.计分功能的实现,当用户在每局游戏结束后,如果没有计算出正确结果,控件对象 ID Captio
12、n显示纸牌的静态控件 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 验算结束游戏
13、按钮 IDC_BUTTON4 结束游戏进度条 IDC_PROGRESS1 /输入算式编辑框 IDC_EDIT1 /显示历史记录列表控件 IDC_COMBO1 /难度级别选择组合框 IDC_LIST1 /C+课程设计报告(2014 )5则会在历史记录中显示 1题 错误;如果计算出了正确结果,则会在记录中显示 1题正确并显示一个 0100 之间的整数值。用户最终得分的确定是由其选择的游戏级别和游戏所花费时间长短来确定的。5 测试5.1 测试方案测试过程中,由于既涉及到纸牌点数和运算符,又会涉及到运算式结果,于是相应地会显示出四种结果,(a)如果玩家在编辑框中没有输入任何数字和算符而直接按下了“验算
14、”按钮,则会弹出“内部错误!”的提示对话框。(b)如果玩家输入的数字与扑克牌给出的数字不符合,则会弹出“内部错误!”的提示对话框。(c)如果玩家输入的数字与四张牌相符、字符亦合法但是计算结果不为24,会弹出“内部错误!”的提示对话框并在表达式编辑框中显示“错误!”(d)如果玩家输入算式经运算后所得答案正确,则会在编辑表达式框中显示“正确!”5.2 测试结果(a)进入游戏界面图 5-1 游戏界面说明:本界面为游戏初始界面,默认难度级别为中级。(b)发牌24 点游戏软件的开发6图 5-2 发牌界面说明:点击“发牌”按钮,自动发牌,计时进度条开始滚动。(c)不输入验算公式界面图 5-3 错误界面说明
15、:当不输入验算公式时,游戏界面会显示错误的提示。(d)输入验算公式C+课程设计报告(2014 )7图 5-4 输入算式界面图 5-5正确输出界面图 5-6 错误输出界面说明:点击输入算式后耗时标识停止,在旁边的输入框中输入算式后点击验算,正确或错误的界面会显示(e)没有来的及输入表达式,超过限制时间,页面显示为24 点游戏软件的开发8图 5-7 超时输出界面说明:.如果在规定的时间内,玩家没有点击验算按钮,则会弹出“内部错误”的窗口。 6.小结这次课程设计,还是像往常一样,先由班长进行分组,每个小组完成一个任务。这次我分到的学习任务是完成二十四点游戏软件开发的编程。由于没有接触过游戏编程,一看
16、到这个题目我就懵了。但是课程设计还要继续,我先试着从网上搜寻我所需要的资料,可网上资料比较零散,在老师的提醒下,我去图书馆找到了我所需要的。书中一些案例和我所要做的课程设计类似,经过自己知识上的补充和同组成员的协助,我顺利的完成了这次课程设计。课程设计是本科学习阶段一次非常难得的理论与实际相结合的机会,通过这次比较完整的一个程序的设计,我摆脱了单纯的理论知识学习状态,和实际设计的结合锻炼了我的综合运用所学的基础知识,解决实际问题的能力,同时也提高我查阅文献资料、对程序整体的把握等其他能力水平,而且通过对整体的掌控,对局部的取舍,以及对细节的斟酌处理,都使我的能力得到了锻炼,经验得到了丰富。这是
17、我们都希望看到的也正是我们进行课程设计的目的所在。虽然设计内容繁多,过程繁琐但我的收获却更加丰富。各种组件的运用,各种算法的应用,各种控件的利用我都是随着设计的不断深入而不断熟悉并逐步掌握的。和老师以及同学的沟通交流更使我对程序整体的规划与设计有了新的认识也对自己提出了新的要求。 根据我在实习中遇到得问题,我将在以后的学习过程中注意以下几点:1、认真上好专业实验课,多在实践中锻炼自己。2、写程序的过程中要考虑周到,严密。3、在做设计的时候要有信心,有耐心,切勿浮躁。4、认真的学习课本知识,掌握课本中的知识点,并在此基础上学会灵活运用。5、在课余时间里多写程序,熟练掌握在调试程序的过程中所遇到的
18、常见错误,以便能节省调试程序的时间。课程设计不仅能提高我们对所学知识的综合运用能力,全面检查并掌握所学的内容,还让我懂得怎样把理论运用到实际,在实践中遇到问题怎样用理论解决。在上机调试的过程中,我对数据结构这一门课所学的知识有了更深入的掌握和理解,巩固了理论教学所学到的知识,扩展了我的编程思想。C+课程设计报告(2014 )9顺利如期的完成本次课程设计给了我很大的信心,但是也让多不足的地方,学习其实就是一个不断完善的过程,正视自己的不足之处,在以后的工作和学习中不断的弥补这些不足之处,在以后的生活中也要保持同样的态度,不断的完善自己。24 点游戏软件的开发10参考文献1谭浩强.C+程序设计(第
19、二版)M.北京:清华大学出版社,2012. 2刘弘,刘希玉.面向对象程序设计VC+6.0 与基于 ACIS的几何造型M.北京:北京邮电大学出版社,2005.3杨正华,张秋生.Visual C+游戏编程导学M.北京:清华大学出版社,2004.4谭浩强.C+程序设计题解与上机指导(第二版)M.北京:清华大学出版社,2012.5肖永亮.Visual C+游戏编程基础M.北京:电子工业出版社,2005.6肖宏伟.Visual C+实效编程百例M.北京:人民邮电出版社,2004.7陈清华.Visual C+课程设计案例精选与编程指导M.南京:东南大学出版社,2004.C+课程设计报告(2014 )11附
20、 录附录 1 源程序清单/ Point24Dlg.cpp : implementation file/ Download by http:/#include “stdafx.h“#include “Point24.h“#include “Point24Dlg.h“#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif/ CAboutDlg dialog used for App Aboutclass CAboutDlg : public CDialogpublic:CAbou
21、tDlg();/ Dialog Data/AFX_DATA(CAboutDlg)enum IDD = IDD_ABOUTBOX ;/AFX_DATA/ ClassWizard generated virtual function overrides/AFX_VIRTUAL(CAboutDlg)protected:virtual void DoDataExchange(CDataExchange* pDX); / DDX/DDV support/AFX_VIRTUAL/ Implementationprotected:/AFX_MSG(CAboutDlg)/AFX_MSGDECLARE_MESS
22、AGE_MAP();CAboutDlg:CAboutDlg() : CDialog(CAboutDlg:IDD)/AFX_DATA_INIT(CAboutDlg)/AFX_DATA_INITvoid CAboutDlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);/AFX_DATA_MAP(CAboutDlg)/AFX_DATA_MAP24 点游戏软件的开发12BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)/AFX_MSG_MAP(CAboutDlg)/ No message handl
23、ers/AFX_MSG_MAPEND_MESSAGE_MAP()/ CPoint24Dlg dialogCPoint24Dlg:CPoint24Dlg(CWnd* pParent /*=NULL*/): CDialog(CPoint24Dlg:IDD, pParent)/AFX_DATA_INIT(CPoint24Dlg)m_inputs = _T(“);/AFX_DATA_INIT/ Note that LoadIcon does not require a subsequent DestroyIcon in Win32m_hIcon = AfxGetApp()-LoadIcon(IDR_M
24、AINFRAME);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.iIma
25、ge = 0;void CPoint24Dlg: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);D
26、DV_MaxChars(pDX, m_inputs, 15);/AFX_DATA_MAPBEGIN_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)C+课程设计报告(2014 )13ON_CBN_SELCHANGE(IDC_COMBO
27、, OnSelchangeCombo)ON_WM_TIMER()ON_COMMAND(IDD_ABOUT, OnAbout)/AFX_MSG_MAPEND_MESSAGE_MAP()/ CPoint24Dlg message handlersBOOL CPoint24Dlg:OnInitDialog()CDialog:OnInitDialog();/ Add “About.“ menu item to system menu./ IDM_ABOUTBOX must be in the system command range.ASSERT(IDM_ABOUTBOX ASSERT(IDM_ABO
28、UTBOX 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 dialogSetIcon(m_hIcon, TRUE); / Set big iconSetIcon(m_hIcon, FALSE); / Set small icon/ TODO: Add
29、 extra initialization here/设置组合框选项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_COLUMN lvColumn;lvColumn.mask
30、= LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;lvColumn.fmt = LVCFMT_CENTER;24 点游戏软件的开发14lvColumn.cx = 52;/设置列表框列标题lvColumn.iSubItem = 0;lvColumn.pszText = “题数 “;m_list.InsertColumn(0, lvColumn.iSubItem = 1;lvColumn.pszText = “对错 “;m_list.InsertColumn(1, return TRUE; / return TRUE unless you set
31、 the focus to a controlvoid CPoint24Dlg:OnSysCommand(UINT nID, LPARAM lParam)if (nID dlgAbout.DoModal();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 au
32、tomatically done for you by the framework.void CPoint24Dlg:OnPaint() CPaintDC pDC(this); / device context for paintingif (IsIconic()SendMessage(WM_ICONERASEBKGND, (WPARAM) pDC.GetSafeHdc(), 0);/ 使图标处于客户矩形的中央int cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;
33、GetClientRect(int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;/ 画图标pDC.DrawIcon(x, y, m_hIcon);else/显示扑克牌CRect rect;CBitmap card1,card2,card3,card4,*OldBitMap;CDC *dc,dcMem;C+课程设计报告(2014 )15dc=GetDC();dcMem.CreateCompatibleDC(card1.LoadBitmap(m_pattern1);OldBitMap=dc
34、Mem.SelectObject(dc-BitBlt(50,30,BitmapW,BitmapH,dcMem.SelectObject(OldBitMap);DeleteObject(card2.LoadBitmap(m_pattern2);OldBitMap=dcMem.SelectObject(dc-BitBlt(130,30,BitmapW,BitmapH,dcMem.SelectObject(OldBitMap);DeleteObject(card3.LoadBitmap(m_pattern3);OldBitMap=dcMem.SelectObject(dc-BitBlt(210,30
35、,BitmapW,BitmapH,dcMem.SelectObject(OldBitMap);DeleteObject(card4.LoadBitmap(m_pattern4);OldBitMap=dcMem.SelectObject(dc-BitBlt(290,30,BitmapW,BitmapH,dcMem.SelectObject(OldBitMap);DeleteObject(dcMem.DeleteDC();CDialog:OnPaint();/ The system calls this to obtain the cursor to display while the user
36、drags/ the minimized window.HCURSOR CPoint24Dlg:OnQueryDragIcon()return (HCURSOR) m_hIcon;/发牌void CPoint24Dlg:OnStart() / TODO: Add your control notification handler code herem_progress.SetPos(0);m_combo.EnableWindow(FALSE);m_number1=(double)rand()/(double)RAND_MAX)*9+1;m_number2=(double)rand()/(dou
37、ble)RAND_MAX)*9+1;m_number3=(double)rand()/(double)RAND_MAX)*9+1;m_number4=(double)rand()/(double)RAND_MAX)*9+1;m_pattern1=130+m_number1;m_pattern2=143+m_number2;m_pattern3=156+m_number3;24 点游戏软件的开发16m_pattern4=169+m_number4;m_input.SetReadOnly(TRUE);if(m_pattern4172) m_pattern4+=7;UpdateData(FALSE)
38、;Invalidate(FALSE);SetTimer(1, Step, NULL);CWnd *pWnd=GetDlgItem(IDC_CALC);pWnd-EnableWindow(TRUE);pWnd=GetDlgItem(IDC_INPUT);pWnd-EnableWindow(TRUE);/输入计算式void CPoint24Dlg:OnInput() / TODO: Add your control notification handler code herem_input.SetReadOnly(FALSE);KillTimer(TRUE);/计算void CPoint24Dlg
39、:OnCalc() / TODO: Add your control notification handler code hereUpdateData(TRUE);int result = m_expression.ChangeExpression(m_inputs);if (resultEnableWindow(FALSE);pWnd=GetDlgItem(IDC_INPUT);pWnd-EnableWindow(FALSE);/选择组合框选项void CPoint24Dlg:OnSelchangeCombo() / TODO: Add your control notification h
40、andler code hereint i=m_combo.GetCurSel();if(i=0)Step=600;m_factor=2;if(i=1)Step=500;m_factor=4;if(i=2)Step=400;m_factor=6;/计时器处理函数void CPoint24Dlg:OnTimer(UINT nIDEvent) / TODO: Add your message handler code here and/or call defaultm_progress.StepIt();if(m_progress.GetPos()=100)KillTimer(1);m_inputs=_T(“超时!“);OnCalc();elseCDialog:OnTimer(nIDEvent);void CPoint24Dlg:OnAbout() 24 点游戏软件的开发18/ TODO: Add your command handler code hereCAboutDlg dlg;dlg.DoModal();void CPoint24Dlg:OnCancel()