计算4点游戏c++_第1页
计算4点游戏c++_第2页
计算4点游戏c++_第3页
计算4点游戏c++_第4页
计算4点游戏c++_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、4 点游戏软件的开发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点

2、游戏是个流行的数学运算游戏。本次课程设计通过24点游戏来加深我们对对 话框编程的认识和理解,并介绍 Visual C+在数学计算方面的应用,以及在按钮上设 置位图和设置计时器的方法。24点扑克游戏的规则是:由系统发出 4张扑克牌,要求用户利用扑克牌上显示的 数字(JQKA算10),通过加减乘除运算得出24。2.2 主体功能a.对游戏设计三个难易级别,分别为低级、中级和高级。每次开始游戏前可以根 据玩家的需要进行难度设置,如若不设置,系统默认难度级别为中级,设置完难度级 别之后就可以开始游戏了,单击“发牌”按钮,桌面上出现四张翻开的扑克牌,与此 同时,游戏开始计时,进度条开始前进。b.在规定的时

3、间内,玩家可以在“输入算式”的编辑框中输入自己想好的算式, 然后点击“验算”按钮:如果输入的算式经运算后所的答案正确,则会在编辑框中显示“正确!” ;如果输入的数字与给出的牌的数字不符或者符号不合法,则会弹出“内部错误! ”的窗口;如果输入的数字与四张牌相符、字符亦合法但是答案不正确,则会在编辑框中显示“错误”;如果未输入任何的数字和算符,则会弹出“内部错误!”的窗口。c.如果在规定的时间内,玩家没有点击验算按钮,则会弹出“内部错误”的窗口。d.在结束本轮游戏后,如果玩家想继续游戏,则可点击“发牌”按钮即可重新发牌,开始下一轮的游戏;如果玩家想结束游戏,则可点击“结束”按钮即可结束游戏。2.3

4、 开发环境Microsoft Visual C+ 6.03系统概要设计3.1 系统功能模块划分a.建立一个随机产生扑克牌的模块。由程序随机产生 4张扑克牌,每张牌对应一 个整数。b.计时的模块。定义一个计时器,以便对使用时间进行计数。c.计算表达式的模块。主要是通过函数来确定运算式各符号优先级和最终计算出 输入算式的结果。d.验算表达式正误的模块。在规定的时间内输入算式进行验算,根据不同的情况会出现不同的对话框。3.2 系统流程图图3-1系统流程图说明:按下“发牌”按钮游戏开始,通过调用函数,桌面上随机显示4张纸牌这4张纸牌从1-K中随机调出。与此同时,标识耗时时标的进度条开始前进。计时同 步

5、开始。设置了时间限制,如果玩家没有在规定时间内输入表达式,本轮游戏结束,在函数OnTimer()的作用下,会弹出对话“内部错误”。若用户在规定时间内点击了 “验算”按钮,系统进行相应运算,紧接着系统调用 验算函数对编辑框中运算出的结果进行验算,根据验算情况给出相应的结果。出现的 结果有以下四中情况:(1)如果用户没在输入算式中输入算式,直接按“验算”按钮, 会弹出“错误! ”的提示。(2)如果输入的数字与给出的不符或者符号不合法,会弹 出“错误! ”的提示。(3)如果输入的数字与四张牌相符、字符亦合法但是答案不正 确,会弹出“错误! ”。(4)如果输入算式经运算后所得答案正确,则会弹出“正确!

6、”, 点击弹出框中的“发牌”按钮,系统会自动给出本局的得分和耗时。本轮游戏结束后,用户可以选择重新开始,否则,可以点击“结束游戏”按钮退 出游戏04系统详细设计4.1 设计步骤(a)在VC+6.0中,建立一个 MFC AppWizard(exe)工程,在应用程序类型中选 择“基本对话框”,其余的都采用默认选项,即可完成对话框的创建。(b)在对话框中添加4个图像(分别用于四张扑克牌),4个按钮(分别是发牌、 输入算式、验算、结束游戏),1个编辑框(输入算式),一个进度条和一个下拉式按钮 (用于选择难度级别),接着根据属性对以上所添加的控件进行属性修改,主要进行重 命名,以便编辑源代码的时候区分,

7、另外对图像的处理除了对其进行重命名外还要对 其添加位图。通过插入资源Bitmap加载图片,图片通过拷贝和复制等操作加载完 成。加载完成的图片在对应的工作区可以找到,选中对其名字进行修改。(c)接着对以上添加的控件建立类向导。 主要有Add Function、Add Variable 和Edit Code这三项的添加。(d)根据流程图在类的原文件中逐一添加实现各个模块其功能所需要的各种函 数,并添加相应的源代码,同时在头文件中添加对各种函数及变量的声明。(e)对编译好的程序进行保存,开始进行调试,边调试边根据报错对原程序进行 修改,直至程序不再报错,并且可以实现预计的各种功能。4.2 界面设计界

8、面设计主要是创建控件,在 Resoure View选项卡中打开Dialog资源组,双击 IDD_ZHOUTONG_DIALOG右边的窗口中显示出待编辑的对话框。开始摆放控件,包括 编辑框和按钮的创建。按钮的创建以“ 1”为例进行介绍,其他按钮的创建可参照此进 行操作。(a)在Controls的“编辑框”按钮上单击鼠标左键,在对话框编辑窗口上合适的 位置按下鼠标左键并拖动鼠标画出一个大小合适的编辑框。在编辑框上单击鼠标右键,在弹出的快捷菜单中选择属性选项,此时弹出Edit属性对话框,在该对话框中输入ID 属性。按照上面的操作过程编辑其他按钮和编辑框等对象的属性。表4-1各按钮和编辑框等对象的属性

9、控件对象IDCaption显示纸牌的静态控件1IDC_STATIC1/显示纸牌的静态控件2IDC_STATIC2/显示纸牌的静态控件3IDC_STATIC3/显示纸牌的静态控件4IDC_STATIC4/耗时标识提示静态控件IDC_STATIC耗时标识:难度级别提不静态控件IDC_STATIC5难度级别:当前得分提示静态控件IDC_STATIC6当前得分:显示当前得分静态控件IDC_STATIC7/历史记录提示静态控件IDC_STATIC8历史记录发牌按钮IDC_BUTTON1发牌输入算式按钮IDC_BUTTON2输入算式验算按钮IDC_BUTTON3验算结束游戏按钮IDC_BUTTON4结束游

10、戏进度条IDC_PROGRESS1/输入算式编辑框IDC_EDIT1/显示历史记录列表控件IDC_COMBO1/难度级别选择组合框IDC_LIST1/4.3 关键功能的实现a.发牌功能的实现,首先,通过 BOOlCDingluDlg:OnInitDialog()中,根据纸牌对应的ID号加载纸牌,。利用函数加载了标号110的十张纸牌和两张背景纸牌。然 后运行代码,即可在图像框中得到四张铺开的纸牌。b.计时功能的实现,在 CPoint24Dlg:OnTimer 中通过 m_progress.StepIt()设置 是否超时。如果(m_progress.GetPos()>=100)代表游戏结束,

11、用户没有时间进行思考 了,本轮游戏结束,在函数 OnTimer()的作用下,会弹出对话“超时! ”c.计算功能的实现,对于输入结果的验算,主要是通过函数来确定运算式各符号 优先级和最终计算出输入算式的结果。对于编辑框中输入的表达式进行计算,借助于 Str=Left+Middle+Right;将有优先级差别同时表达式传送到 SubCompute()函数中,最终计算出输入到编辑框中的表达式结果 Result ,并将其返回。d.验算功能的实现,在规定的时间内输入算式进行验算,根据不同的情况会出现 不同的对话框。有以下四种情况:如果用户没在输入算式中输入算式,直接按“验算” 按钮,如果输入的数字与给出

12、的不符或者符号不合法,会弹出“内部错误! ”的提示 对话框;如果输入的数字与四张牌相符、字符亦合法但是答案不正确,会弹出“错 误!” ;如果输入算式经运算后所得答案正确,则会弹出“正确 !”。e.计分功能的实现,当用户在每周游戏结束后,如果没有计算出正确结果,则会 在历史记录中显示1题 错误;如果计算出了正确结果,则会在记录中显示1题正确并 显示一个0100之间的整数值。用户最终得分的确定是由其选择的游戏级别和游戏所 花费时间长短来确定的。5测试5.1 测试方案测试过程中,由于既涉及到纸牌点数和运算符,又会涉及到运算式结果,于是相 应地会显示出四种结果,(a)如果玩家在编辑框中没有输入任何数字

13、和算符而直接按 下了 “验算”按钮,则会弹出“内部错误! ”的提示对话框。( b)如果玩家输入的数 字与扑克牌给出的数字不符合,则会弹出“内部错误! ”的提示对话框。(c)如果玩家输入的数字与四张牌相符、字符亦合法但是计算结果不为24,会弹出“内部错误!”的提示对话框并在表达式编辑框中显示“错误!” ( d)如果玩家输入算式经运算后所 得答案正确,则会在编辑表达式框中显示“正确!”5.2 测试结果(a)进入游戏界面图5-1游戏界面说明:本界面为游戏初始界面,默认难度级别为中级。(b)发牌图5-2发牌界面说明:点击“发牌”按钮,自动发牌,计时进度条开始滚动。(c)不输入验算公式界面图5-3错误界

14、面说明:当不输入验算公式时,游戏界面会显示错误的提示。(d)输入验算公式图5-4输入算式界面图5-5正确输出界面图5-6错误输出界面说明:点击输入算式后耗时标识停止,在旁边的输入框中输入算式后点击验算, 正确或错误的界面会显示(e)没有来的及输入表达式,超过限制时间,页面显示为图5-7超时输出界面说明:.如果在规定的时间内,玩家没有点击验算按钮,则会弹出“内部错误” 的窗口。6.小结这次课程设计,还是像往常一样,先由班长进行分组,每个小组完成一个任务。 这次我分到的学习任务是完成二十四点游戏软件开发的编程。由于没有接触过游戏编 程,一看到这个题目我就懵了。但是课程设计还要继续,我先试着从网上搜

15、寻我所需要的资料,可网上资料比较零散,在老师的提醒下,我去图书馆找到了我所需要的。书中一些案例和我所要做的课程设计类似, 经过自己知识上的补充和同组成员的协助, 我顺利的完成了这次课程设计。课程设计是本科学习阶段一次非常难得的理论与实际相结合的机会,通过这次比 较完整的一个程序的设计,我摆脱了单纯的理论知识学习状态,和实际设计的结合锻 炼了我的综合运用所学的基础知识,解决实际问题的能力,同时也提高我查阅文献资 料、对程序整体的把握等其他能力水平,而且通过对整体的掌控,对局部的取舍,以 及对细节的斟酌处理,都使我的能力得到了锻炼,经验得到了丰富。这是我们都希望 看到的也正是我们进行课程设计的目的

16、所在。虽然设计内容繁多,过程繁琐但我的收 获却更加丰富。各种组件的运用,各种算法的应用,各种控件的利用我都是随着设计 的不断深入而不断熟悉并逐步掌握的。和老师以及同学的沟通交流更使我对程序整体 的规划与设计有了新的认识也对自己提出了新的要求。根据我在实习中遇到得问题,我将在以后的学习过程中注意以下几点:1、认真上好专业实验课,多在实践中锻炼自己。 2、写程序的过程中要考虑周到,严密。 3、 在做设计的时候要有信心,有耐心,切勿浮躁。 4、认真的学习课本知识,掌握课本中 的知识点,并在此基础上学会灵活运用。5、在课余时间里多写程序,熟练掌握在调试 程序的过程中所遇到的常见错误,以便能节省调试程序

17、的时间。课程设计不仅能提高我们对所学知识的综合运用能力,全面检查并掌握所学的内 容,还让我懂得怎样把理论运用到实际,在实践中遇到问题怎样用理论解决。在上机 调试的过程中,我对数据结构这一门课所学的知识有了更深入的掌握和理解,巩固了 理论教学所学到的知识,扩展了我的编程思想。顺利如期的完成本次课程设计给了我很大的信心,但是也让多不足的地方,学习 其实就是一个不断完善的过程,正视自己的不足之处,在以后的工作和学习中不断的 弥补这些不足之处,在以后的生活中也要保持同样的态度,不断的完善自己。参考文献1谭浩强.C+程序设计(第二版)M.北京:清华大学出版社,2012.2刘弘,刘希玉.面向对象程序设计

18、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.附录1源程序清单/ Point24Dlg.cpp : implementation file#include &

19、quot;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:CAboutDlg();/ Dialog Data/AFX_DATA(CAboutDlg)enum IDD =

20、 IDD_ABOUTBOX ;/AFX_DATA/ ClassWizard generated virtual function overridesAFX_VIRTUAL(CAboutDlg)protected:/ DDX/DDVvirtual void DoDataExchange(CDataExchange* pDX); support/AFX_VIRTUAL/ Implementationprotected:AFX_MSG(CAboutDlg)/AFX_MSGDECLARE_MESSAGE_MAP();CAboutDlg:CAboutDlg() : CDialog(CAboutDlg:I

21、DD)/AFX_DATA_INIT(CAboutDlg)AFX_DATA_INIT)void CAboutDlg:DoDataExchange(CDataExchange* pDX) (CDialog:DoDataExchange(pDX);/AFX_DATA_MAP(CAboutDlg)/AFX_DATA_MAP)BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)AFX_MSG_MAP(CAboutDlg)/ No message handlers/AFX_MSG_MAPEND_MESSAGE_MAP()/ CPoint24Dlg dialogCPoint24Dlg:

22、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_MAINFRAME);m_hIcon = AfxGetApp()->LoadIcon(IDR_MA

23、INFRAME);/初始化变量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;void CPoint24Dlg:DoDataExchange(CDataExcha

24、nge* 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_MAPBEGIN

25、_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

26、_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 & 0xFFF0) = IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu*

27、pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != NULL)CString strAboutMenu;strAboutMenu.LoadString(IDS_ABOUTBOX);if (!strAboutMenu.IsEmpty()pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX, strAboutMenu);)/ Set the icon for this dialog. The framework does this auto

28、matically/ when the application's main window is not a dialogSetIcon(m_hIcon, TRUE);/ Set big iconSetIcon(m_hIcon, FALSE); / Set small icon/ TODO: Add extra initialization here/设置组合框选项m_combo.InsertString(0," 高级");m_combo.InsertString(1," 中级");m_combo.InsertString(2," 低级

29、");m_combo.SetCurSel(1);/ 'k置记录条m_progress.SetRange(1,100);m_progress.SetStep(2);m_progress.SetPos(0);/初始化分数SetDlgItemText(IDC_CUR_SCORE,"0");/设置列表框列属性LV_COLUMN lvColumn;lvColumn.mask = LVCF_FMT| LVCF_WIDTH |LVCF_TEXT LVCF_SUBITEM;lvColumn.fmt = LVCFMT_CENTER;lvColumn.cx = 52;/设置列

30、表框列标题lvColumn.iSubItem = 0;lvColumn.pszText =" 题数"m_list.InsertColumn(0, &lvColumn);lvColumn.iSubItem = 1;lvColumn.pszText =" 对错"m_list.InsertColumn(1, &lvColumn);return TRUE; / return TRUE unless you set the focus to a control )void CPoint24Dlg:OnSysCommand(UINT nID, LPA

31、RAM lParam)(if (nID & 0xFFF0) = IDM_ABOUTBOX)(CAboutDlg dlgAbout; dlgAbout.DoModal();else(CDialog:OnSysCommand(nID, IParam);)/ 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 automatically d

32、one for you by the framework.void CPoint24Dlg:OnPaint()(CPaintDC pDC(this); / device context for paintingif (IsIconic()(SendMessage(WM_ICONERASEBKQWPARAMp DC.GetSafeHdc(), 0);/使图标处于客户矩形的中央int cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&

33、rect);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;dc=GetDC();dcMem.CreateCompatibleDC(&pDC);card1.LoadBitmap(m_pattern1);01dBitMap=dcMem.SelectObj

34、ect(&card1);dc->BitBlt(50,30,BitmapW,BitmapH,&dcMem,0,0,SRCCOPY);dcMem.SelectObject(OldBitMap);DeleteObject(&card1);card2.LoadBitmap(m_pattern2);01dBitMap=dcMem.SelectObject(&card2);dc->BitB1t(130,30,BitmapW,BitmapH,&dcMem,0,0,SRCCOPY);dcMem.SelectObject(OldBitMap);DeleteOb

35、ject(&card2);card3.LoadBitmap(m_pattern3);01dBitMap=dcMem.SelectObject(&card3);dc->BitBlt(210,30,BitmapW,BitmapH,&dcMem,0,0,SRCCOPY);dcMem.SelectObject(OldBitMap);DeleteObject(&card3);card4.LoadBitmap(m_pattern4);01dBitMap=dcMem.SelectObject(&card4);dc->BitBlt(290,30,Bitmap

36、W,BitmapH,&dcMem,0,0,SRCCOPY);dcMem.SelectObject(OldBitMap);DeleteObject(&card4);dcMem.DeleteDC();CDialog:OnPaint();/ The system calls this to obtain the cursor to display while the user drags/ the minimized window.HCURSOR CPoint24Dlg:OnQueryDragIcon()return (HCURSOR) m_hIcon;./发牌void CPoint

37、24Dlg: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()/(double)RAND_MAX)*9+1;m_number3=(double)rand()/(double)RAND_MAX)*9+1;m_number4=(double)rand()/(double)RAND_MA

38、X)*9+1;m_pattern1=130+m_number1;m_pattern2=143+m_number2;m_pattern3=156+m_number3;m_pattern4=169+m_number4; m_input.SetReadOnly(TRUE); if(m_pattern4>172) m_pattern4+=7; UpdateData(FALSE);Invalidate(FALSE);SetTimer(1, Step, NULL);CWnd *pWnd=GetDlgItem(IDC_CALC); pWnd->EnableWindow(TRUE);pWnd=Ge

39、tDlgItem(IDC_INPUT); pWnd->EnableWindow(TRUE);)/输入计算式void CPoint24Dlg:OnInput()/ TODO: Add your control notification handler code here m_input.SetReadOnly(FALSE);KillTimer(TRUE);)/计算void CPoint24Dlg:OnCalc()/ TODO: Add your control notification handler code here UpdateData(TRUE);int result = m_expression.ChangeExpression(m_inputs); if (result<0)long result = m_expression.Value(m_Result);if (re

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论