计算机综合课程设计报告_第1页
计算机综合课程设计报告_第2页
计算机综合课程设计报告_第3页
计算机综合课程设计报告_第4页
计算机综合课程设计报告_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

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

文档简介

计算机综合课程设计报告 目录.概述项目背景是什么原因导致你们选择这个项目的?贪吃蛇游戏是一个经典的小游戏在各种平台上都有不同的版本,我们想做好贪吃蛇应该是成为检验我们编程技巧一个很好的实例,也是为了实现更高级的贪吃蛇游戏功能。系统目标这个系统最终实现出来要完成那些任务,解决那些问题?1完成传统的贪吃蛇游戏框架,即设置初始蛇身和目标物块,点击开始即可使用方向键控制蛇的移动,不能往回走也不能触碰边界,否则提示错误。2在进入游戏时有权限设置,可通过对数据库中用户名和密码的设置来添加用户和删除用户。3对游戏进行了三个难度的设置,每个难度下的游戏界面大小将不同,操作性上也有差异。需求分析系统功能分析通过获得访问权限进入游戏,进行游戏前可选择不同的难度对游戏的属性参数进行设置,开始游戏后,程序自动执行线程,在享受背景音乐的同时进行经典的贪吃蛇游戏操作。功能1完成传统的贪吃蛇游戏框架,即设置初始蛇身和目标物块,点击开始即可使用方向键控制蛇的移动,不能往回走也不能触碰边界,否则提示错误。功能2在进入游戏时有权限设置,可通过对数据库中用户名和密码的设置来添加用户和删除用户。功能3对游戏进行了三个难度的设置,每个难度下的游戏界面大小将不同,操作性上也有差异。系统性能指标/*说明系统实现后所要实现的性能或指标参数,性能:一些文字性的标准,比如,系统达到什么什么的功能,要实现什么什么,要建立什么什么,为什么什么而什么什么等等指标:一些有数字的标准,比如同时在线访问量、运行效率、准确性百分比等等*/系统平台说明系统所运行的操作系统、开发环境、网络环境,用户除了安装本系统外,还需安装的程序、组件等等。在32bit,64bit的win操作系统下均可完美运行,无需安装其他插件。概要设计总体设计系统总体结构整个系统大致由两个主类(CSnakeView,CDlg_login)和其余子类组成。子系统系统接口在这里说明各子系统之间的数据交互和接口CSnakeView类(派生自view类)内有接口:1CSnakeView();修改CSnakeView的构造函数,完成游戏的初始化2voidOnDraw(CDC*pDC);显示游戏界面3voidReDisplay(CPointpPoint);//刷新游戏区域中pPoint处的一个小方格4voidIniGame();用于初始化游戏的参数//该函数对游戏初始化,定义游戏的初始状态5voidIniAim();用于初始化食物的坐标//该函数随机产生一个供蛇吃的目标,如果该目标恰巧与蛇身重合,则重新产生一个6voidOnGameStart();用于相应菜单上的开始控件(ID_GAME_START)7voidOnKeyDown(UINTnChar,UINTnRepCnt,UINTnFlags);用于响应键盘上的消息(WM_KeyDown)根据按下的方向键设置代表不同方向的值8voidOnTimer(UINTnIDEvent);为相应定时器的消息(WM_Timer)1voidCSnakeView::IniAim(){intuX,uY;//目标位置while(1){uX=rand()%m_nHeight;uY=rand()%m_nWidth;intuTag=0;//0-不与蛇身重合,1-重合for(inti=0;i<=m_aBody.GetUpperBound();i++){CPointuPoint=m_aBody.GetAt(i);if(uPoint.x==uX||uPoint.y==uY)//目标与蛇身重合{uTag=1;break;}}if(uTag==0)break;}m_pAim=CPoint(uX,uY);//产生的目标存放在成员变量中}2voidCSnakeView::IniGame(){//游戏区域m_nLeft=20;m_nTop=20;m_nWidth=40;m_nHeight=30;m_nSize=10;//游初始状态m_nGameStatus=0;m_nDirect=1;m_nCount=0;//初始化蛇身m_aBody.RemoveAll();m_aBody.Add(CPoint(2,7));m_aBody.Add(CPoint(2,6));m_aBody.Add(CPoint(2,5));m_aBody.Add(CPoint(2,4));//计时器清零m_nTime=0;m_nTime1=0;//初始化随机数发生器srand((unsigned)time(NULL));//产生一个目标IniAim();}3voidCSnakeView::ReDisplay(CPointpPoint){InvalidateRect(CRect(m_nLeft+pPoint.y*m_nSize,m_nTop+pPoint.x*m_nSize,m_nLeft+(pPoint.y+1)*m_nSize,m_nTop+(pPoint.x+1)*m_nSize));}4CSnakeView::CSnakeView(){IniGame();}5voidCSnakeView::OnDraw(CDC*pDC){CSnakeDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);//TODO:adddrawcodefornativedatahere//画游戏区域pDC->SelectStockObject(WHITE_BRUSH);pDC->Rectangle(CRect(m_nLeft-1,m_nTop-1,m_nLeft+m_nWidth*m_nSize+1,m_nTop+m_nHeight*m_nSize+1));//显示当前用时CStringuStr;uStr.Format("当前用时:%d",m_nTime);pDC->TextOut(m_nLeft+m_nWidth*m_nSize+30,40,uStr);//显示当前得分uStr.Format("当前得分:%d",m_nCount);pDC->TextOut(m_nLeft+m_nWidth*m_nSize+30,140,uStr);//显示目标pDC->SelectStockObject(LTGRAY_BRUSH);pDC->Rectangle(CRect(m_nLeft+m_pAim.y*m_nSize,m_nTop+m_pAim.x*m_nSize,m_nLeft+(m_pAim.y+1)*m_nSize,m_nTop+(m_pAim.x+1)*m_nSize));//画蛇for(inti=0;i<=m_aBody.GetUpperBound();i++){CPointuPoint=m_aBody.GetAt(i);pDC->Rectangle(CRect(m_nLeft+uPoint.y*m_nSize,m_nTop+uPoint.x*m_nSize,m_nLeft+(uPoint.y+1)*m_nSize,m_nTop+(uPoint.x+1)*m_nSize));}}6voidCSnakeView::OnGameStart(){//启动游戏,启动定时器IniGame();m_nGameStatus=1;SetTimer(1,100,NULL);Invalidate();}7voidCSnakeView::OnKeyDown(UINTnChar,UINTnRepCnt,UINTnFlags){switch(nChar){case38:m_nDirect=4;break;case40:m_nDirect=3;break;case37:m_nDirect=2;break;case39:m_nDirect=1;break;}CView::OnKeyDown(nChar,nRepCnt,nFlags);}8voidCSnakeView::OnTimer(UINTnIDEvent){m_nTime1++;//计时if(m_nTime1==10)//达到1秒{m_nTime++;m_nTime1=0;Invalidate();}CPointuPoint=m_aBody.GetAt(0);//蛇头的位置intuTag=0;//是否失败switch(m_nDirect)//判断下一步蛇是否出界{case1://rightuPoint.y++;if(uPoint.y>=m_nWidth)uTag=1;break;case2://leftuPoint.y--;if(uPoint.y<0)uTag=1;break;case3://downuPoint.x++;if(uPoint.x>=m_nHeight)uTag=1;break;case4://upuPoint.x--;if(uPoint.x<0)uTag=1;break;}if(uTag==0)//判断蛇是否碰到了自身{for(inti=0;i<=m_aBody.GetUpperBound();i++){CPointuPoint1=m_aBody.GetAt(i);if(uPoint1.x==uPoint.x&&uPoint1.y==uPoint.y){uTag=1;break;}}}if(uTag==0){m_aBody.InsertAt(0,uPoint);//新的蛇头的位置ReDisplay(uPoint);if(uPoint.x==m_pAim.x&&uPoint.y==m_pAim.y)//碰上目标{m_nCount++;IniAim();Invalidate();}else{CPointuPoint1=m_aBody.GetAt(m_aBody.GetUpperBound());m_aBody.RemoveAt(m_aBody.GetUpperBound());ReDisplay(uPoint1);}}else//游戏结束{KillTimer(1);AfxMessageBox("Fail!");}CView::OnTimer(nIDEvent);}CDlg_login类(派生至CDialog类)内有接口:1CDlg_login(CWnd*pParent=NULL);标准的对话框构造函数用于初始化对话框参数和建立对话框2voidOnOK();用于判断用户权限是否正确并进入游戏,否则提示错误3voidOnCancel();用于取消进入游戏的动作,退出游戏1voidCDlg_login::OnOK(){ //TODO:Addextravalidationherethis->UpdateData(true); ::CoInitialize(NULL); this->m_pConnection.CreateInstance(__uuidof(Connection)); this->m_pRecordset.CreateInstance(__uuidof(Recordset)); this->m_pConnection->Open("DSN=book_db_dsn","","",0);//上面四行为打开数据源连接 CStringstr; str.Format("select*frombook_adminwhereadmin_name='%s'andadmin_pwd='%s'",this->m_login_name,this->m_login_pwd); BSTRbstrSQL=str.AllocSysString(); this->m_pRecordset->Open(bstrSQL,(IDispatch*)this->m_pConnection,adOpenDynamic,adLockOptimistic,adCmdText); if(!this->m_pRecordset->adoEOF) CDialog::OnOK(); else MessageBox("Failed"); this->m_pRecordset->Close(); this->m_pConnection->Close();}2voidCDlg_login::OnCancel(){//TODO:AddextracleanupherePostQuitMessage(0);}CWzdSplash类(派生至CFrameWnd类)内有接口:1voidCreate(UINTnBitmapID);用于构建背景图片对象2voidOnPaint();用于实现显示背景图片的动作1voidCWzdSplash::Create(UINTnBitmapID){ m_bitmap.LoadBitmap(nBitmapID); BITMAPbitmap; m_bitmap.GetBitmap(&bitmap); intx=(::GetSystemMetrics(SM_CXSCREEN)-bitmap.bmWidth)/2; inty=(::GetSystemMetrics(SM_CYSCREEN)-bitmap.bmHeight)/2; CRectrect(x,y,x+bitmap.bmWidth,y+bitmap.bmHeight); CreateEx(0,AfxRegisterWndClass(0),"",WS_POPUP|WS_VISIBLE|WS_BORDER,rect,NULL,0);}2voidCWzdSplash::OnPaint(){ CPaintDCdc(this);//devicecontextforpainting BITMAPbitmap; m_bitmap.GetBitmap(&bitmap); CDCdcComp; dcComp.CreateCompatibleDC(&dc); dcComp.SelectObject(&m_bitmap); //drawbitmap dc.BitBlt(0,0,bitmap.bmWidth,bitmap.bmHeight,&dcComp,0,0,SRCCOPY);}各子系统结构在这里说明系统每个组成部分的结构。注意:在这里不要写类和成员函数的组成,这部分在下一章。子系统1结构CSnakeView类classCSnakeView:publicCView{protected://createfromserializationonly CSnakeView(); DECLARE_DYNCREATE(CSnakeView)public: CSnakeDoc*GetDocument(); CBrushm_brushBackground;private: voidReDisplay(CPointpPoint); voidIniGame(); voidIniAim(); intm_nLeft,m_nTop,m_nWidth,m_nHeight,m_nSize; intm_nDirect; CPointm_pAim; CArray<CPoint,CPoint>m_aBody; intm_nGameStatus; intm_nCount; intm_nTime,m_nTime1;};此外还有控件ID_GAME_START,函数voidOnDraw(CDC*pDC);子系统2结构CDlg_login类classCDlg_login:publicCDialog{//Constructionpublic: CDlg_login(CWnd*pParent=NULL);//standardconstructor _ConnectionPtrm_pConnection; _RecordsetPtrm_pRecordset;};此外还有控件ID_OKID_CANCLE动态编辑框ID_EDIT_NAMEID_EDIT_PWD子系统3结构CWzdSplash类classCWzdSplash:publicCFrameWnd{ DECLARE_DYNCREATE(CWzdSplash)public: CWzdSplash();//protectedconstructorusedbydynamiccreation virtual~CWzdSplash(); CBitmapm_bitmap; voidCreate(UINT);}数据库设计如果采用数据库,这里说明数据库的结构。如果没有数据库,可以将整体删除本节表book_admin字段名字段类型索引默认值字段描述Admin_name字符型Math用户名Admin_pwd字符型1234密码数据文件设计详细说明数据文件的格式。如果没有使用数据文件,可以将本节整体删去。数据文件存放位置及命名规范数据文件在根目录下的database文件夹下,其名称为book_db.mdb.命名没有特别的规范。数据文件格式规范数据文件格式为microsoftoffice的access数据库文件.mdb。详细设计子系统1详细设计静态结构CSnakeView类: voidReDisplay(CPointpPoint);刷新游戏区域中pPoint处的一个小方格 voidIniGame();用于开始游戏 voidIniAim();用于初始化食物的坐标voidOnDraw(CDC*pDC);用于显示游戏界面,其中也包括初始化蛇身,显示蛇和食物等功能。 intm_nLeft,m_nTop,m_nWidth,m_nHeight,m_nSize;起始坐标,宽/高度(格数),每格大小 intm_nDirect;记录当前方向用1-右,2-左,3-下,4-上的规则 CPointm_pAim;用于储存当前目标坐标 CArray<CPoint,CPoint>m_aBody;用于构造蛇身 intm_nGameStatus;用于储存游戏状态:0-未开始,1-开始 intm_nCount;用于记录吃掉目标数 intm_nTime,m_nTime1;用于记录游戏所用时间工作流程子系统2详细设计静态结构CDlg_login类 CDlg_login(CWnd*pParent=NULL);用于构建对话框对象VoidOnOK();用于进行确定操作VoidOnCancel();用于进行取消操作工作流程系统实现设计过程蛇的活动区域是由若干个小方格组成的。当这些小方格呈现灰色时,便表示蛇身。设整个区域由m×n个方格组成,最左上角的方格坐标为(0,0)。蛇是由若干个邻的方格组成的,将这些方格的坐标依蛇头至蛇尾的次序存入到一个数组中便代表了蛇身。当蛇在游戏区域中“游动”一格时,所对应的数组操作应该是,将新的位置坐标插入到数组头部,同时将数组中最后一个元素删除。这项工作可以用一个一般的数组来完成,但当进行插入操作时需要自己移动数组中的元素;也可以使用CArray来完成这些工作,CArray的成员函数提供了需要的操作,这样做将会更加简单一些。开发过程(1)新建工程Snake,在MFC的向导第一步选择SingleDocument,按Finish结束。(2)选择ResourceView窗口,打开菜单编辑器,在顶层菜单上添加一个名为“游戏”的弹出式菜单,该菜单下再添加一个名为“开始”的子菜单,其ID为ID_GAME_START,如图1所示。(3)在ClassWizard中为刚才编辑好的菜单添加消息处理函数。打开ClassWizard,选中MessageMaps页。在ClassName中选择CSnakeView,在ObjectID中选择ID_GAME_START,在Messages中选择COMMAND,添加消息处理函数。(4)在ClassWizard中添加键盘消息处理函数。打开ClassWizard,选中MessageMaps页。在ClassName中选择CSnakeView,在ObjectID中选择CSnakeView,在Messages中选择WM_KeyDown,添加消息处理函数。(5)在ClassWizard中定时器消息添加处理函数。打开ClassWizard,选中MessageMaps页。在ClassName中选择CSnakeView,在ObjectID中选择CSnakeView,在Messages中选择WM_Timer,添加消息处理函数。并添加如3.1.2所示的代码即可完成游戏主界面的设计。(6)建立权限登录界面,首先建立对话框CDlg_login,然后分别添加2个静态文本框ID_STATIC将其标题改为用户名和密码,然后添加动态文本框ID_EDIT_NAME,和ID_EDIT_PWD分别用于存储输入的用户名和密码变量,添加控件按钮ID_OK和ID_CANCLE并分别添加消息响应函数voidCDlg_login::OnCancel()和voidCDlg_login::OnOk(),用于响应对两个控件的动作。然后在CMainFrame::OnCreate(LPCREATESTRUCTlpCreateStruct)函数中添加如下代码:CDlg_logindlg;(用以生成一个登陆对话框对象),dlg.DoModal()

;(让对话框对象以有模式形式显示出来。并在MainFrm.cpp中添加头文件

“dlg_login.h”。最后为ID_OK和ID_CANCLE两个消息添加3.1.2所示的函数即可。(7)建立完权限设置对话框之后设置开机画面,首先用photoshopcs3制作开机画面并且储存为.bmp格式,利用输入向导加入Snake工程的资源文件之中,并且可以利用相应函数改变其显示的时间。利用组件库中的SplashScreen组件实现,在资源中插入位图资源,打开VC++的资源编辑器,用鼠标右键单击Resources文件夹,选择Import命令,插入所制作的位图。如果位图超过256色,VC会弹出一个对话框,提示位图已经插入但不能在位图编辑器中显示,确定即可。将位图ID改为IDB_SPLASH。添加SplashScreen控件:①选择菜单“project”/“AddToProject”/“ConponentsandControls”打开对话框,在列表框中双击“VisualC++Conponents”选项,选择“SplashScreen”控件,然后单击“Insert”。②确认或修改类名和位图资源ID,单击OK确认。③编译、连接,漂亮的启动画面就显示出来了。如果需要改变启动画面的停留时间,就修改SetTimer()函数的第二个参数,默认是750毫秒。该函数所在位置:intCSplashWnd::OnCreate(LPCREATESTRUCTlpCreateStruct){...//Setatimertodestroythesplashscreen.SetTimer(1,750,NULL);//修改第二个参数以调整画面停留时间return0;}(8)至此大体的程序框架基本建立,然后插入背景图片和背景音乐并且将背景音乐设置为开启程序时自动播放。在弹出式菜单中再添加一个控件播放并设置起消息为IDC_PLAY,然后通过Workspace->Insert->Resource->InsertResource->Import在ImportResource对话框中选择相应的.wma格式的音频文件然后单击Import。然后将导入资源的音频文件的属性改为IDR_WAVE_RINGIN在OnPlay()函数中添加如下代码:PlaySound(MAKEINTRESOURCE(IDR(WAVE_RINGIN),AfxGetInstanceHandle(),SND_ASYNC/SND_NOWAIT/SND_RESOURCE);(9)然后逐步输入3.1.2所示代码建立起整个完整程序。(10)最后将自己制作的.ico文件替换到debug文件夹中得到自定义图标的效果。测试过程声音测试对于游戏背景音乐的问题,一开始是通过控件“播放”来调用OnPlay函数人为地启动音乐播放,不太符合游戏性和人性化设计。为了实现程序刚开始运行就播放

温馨提示

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

评论

0/150

提交评论