ImageVerifierCode 换一换
格式:DOCX , 页数:20 ,大小:134.65KB ,
资源ID:9717302      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/9717302.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(c++课程设计.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

c++课程设计.docx

1、c+课程设计广东工业大学课程设计任务书题目名称 “ 猫抓老鼠”游戏设计学生学院 自动化专业班级 09级网络工程4班姓 名 孔凡云学 号 3109001405一、 课程设计的内容1. 项目简介:项目名称:“猫抓老鼠”游戏设计项目类型:娱乐编程环境:Microsoft Visual C+ 6.0项目经验:学习在MFC框架下编程,提升编程综合能力。项目说明:本程序采用标准的SDI程序结构,没有考虑有关保存文档的工作,为简单起见,所有的工作都在试图类中完成。通过定时器消息是老鼠在场地中自动随机运动,通过键盘消息移动猫去抓老鼠。原理很简单,但为了使运动状态逼真且游戏的逻辑正确、完整、也有一定的难度。编写

2、这样一个综合面较广的程序对提升C+初学的编程与设计能力是极有帮助的。2.功能介绍:(1)通过键盘的上、下、左、右方向键控制猫。(2)老鼠在窗口中自由活动,可随时改变行走方向,与窗口边界则改变方向。(3)猫碰到老鼠后就吃掉老鼠(老鼠不再显示),吃掉老鼠后,游戏结束并显示 所剩余时间;(4)能显示当前时间的老鼠数目和剩余时间值;(5)可以选择游戏的级别和难度。3.系统实现概述:(1)首先用AppWizard生成一个名为CatCatchRat的SDI程序框架。(2)调出Insert Source对话框,利用位图编辑器分别画出一个方向的猫和老鼠的位图(画猫操作如图1所示),然后把它们复制到其他的方向的

3、位图上并用“Rotate 90 degrees”命令对其进行旋转。相应的ID分别为IDB_CatUp、IDB_CatDown、IDB_CatLeft、IDB_CatRight、IDB_RatUp、IDB_RatDown、IDB_RatLeft和 IDB_RatRight。 图1(3)在框架窗口的主菜单(IDR_MAINFRAME)中添加两个下拉选项,一个为“控件”,添加三个菜单选项“开始”、“停止”和“重玩”;另一个为“难度”,添加三个菜单选项“高”、“中”、“低”,删除其他无关的下拉菜单,各菜单属性设置如表1所示: ID Caption IDM_Start 开始 ID_Stop 停止 ID_

4、Resart 重玩 IDM_Hard 高 ID_Normal 中 ID_Easy 低具体操作如图2所示:(4)为视图添加菜单选项对应的成员函数。进入ClassWizard的Message Maps选项卡,选择Class Name项为CcatCathRatView,在Object IDs列表框中分别选择新添加的菜单选项的ID,在Messages列表框中选择COMMAAND,按下Add Function按钮添加成员函数,然后再在Messages列表中选择UPDATE_COMMAND,按下Add Function按钮添加另一组成员函数。如图3所示: 图3 (5)用ClassWizard在视图类中建立

5、定时器的消息处理函数OnTimer(),以及键盘消息处理函数OnKeyDown()。具体操作如图4所示: 图4(6) 在相应的函数中写入代码,完成程序;(7)游戏的运行及输入输出。游戏者可以选择框架窗口的下拉菜单“难度”中的选项设置难度,选择下拉菜单“控制”中的菜单选项“开始”后,老鼠在场地中随机运动,这时通过四个方向键可以移动猫去抓老鼠,猫身体的任何部分碰到老鼠身体的任何部分则猫吃掉老鼠,该老鼠消失,游戏过程中可以选择菜单选项“停止”暂停。如果在规定的时间内抓完所有的老鼠则成功,否则失败。游戏结束后可以选择菜单选项“重玩”重新开始。场地右边显示剩余的老鼠数目和剩余的游戏时间,如图5所示: 图

6、5胜利时:失败时:4.关键技术:本程序主要涉及到的知识点有:键盘消息、菜单、定时器消息、位移显示和移动、位置判断算法。同时还有判断游戏输赢、设置游戏难度系数、显示文字等工作,有一定的难度和工作量。该题的难点在于猫和老鼠的的显示。使老鼠随机移动以及如何判断老鼠被吃掉。猫和老鼠可以分别用位图画出,显示他们有固定的步骤。但为了把老鼠和猫的运动模拟得更加逼真,用场要保证脑袋的方向和运动方向一致,这样如果简单地假定只有上、下、左、右四个方向的话,就必须分别使用四幅位图来显示不同方向的猫和老鼠。我们知道,位图在窗口客户区自动移动可以通过一个定时器消息改变位图所显示的坐标来实现,即当定时器消息到来时,计算位

7、图显示的位置,并在新的位置重新显示位图。当老鼠和猫位图的显示位置有重合时,则认为老是被吃掉,这里使用了一个不十分精确的简单算法,当猫和老鼠水平方向的位置差小于老鼠的宽度,并且猫和老鼠垂直方向的位置差小于老鼠的高度时,就认为老鼠被抓住。关键函数具体如下:(1)在视图类结构函数中添加以下初始化代码,这部分代码除“载入猫和老鼠的位图资源”外,也可以添加到视图类的OnInitilUpdate()函数中。 /载入猫和老鼠的位图资源 m_bmCat0.LoadBitmap(IDB_CatUp); m_bmCat1.LoadBitmap(IDB_CatDown); m_bmCat2.LoadBitmap(I

8、DB_CatLeft); m_bmCat3.LoadBitmap(IDB_CatRight); m_bmRat0.LoadBitmap(IDB_RatUp); m_bmRat1.LoadBitmap(IDB_RatDown); m_bmRat2.LoadBitmap(IDB_RatLeft); m_bmRat3.LoadBitmap(IDB_RatRight); /计算猫和老鼠位图的搞和宽 BITMAP bmCat; m_bmCat2.GetBitmap(&bmCat); m_nCatw=bmCat.bmWidth; m_nCath=bmCat.bmHeight; BITMAP bmRat4;

9、 m_bmRat0.GetBitmap(&bmRat0); m_bmRat1.GetBitmap(&bmRat1); m_bmRat2.GetBitmap(&bmRat2); m_bmRat3.GetBitmap(&bmRat3); m_nRatw=bmRat0.bmWidth; m_nRath=bmRat0.bmHeight; /场地矩形和老鼠数目设置 m_rectClient=CRect(20,20,380,380); m_nRat=RATMAX; StartFlag=-1; /计算猫和老鼠位图的初时位置和运动方向 m_nCatx=m_rectClient.left+m_rectClien

10、t.Width()/2; m_nCaty=m_rectClient.top+m_rectClient.Height()/2; m_rectCat=CRect(m_nCatx,m_nCaty,m_nCatx+m_nCatw,m_nCaty+m_nCath); m_nCatDirection=2; srand(unsigned)time(NULL); for(int i=0;iTextOut(410,100,strTime); pDC-TextOut(410,140,strRat); /显示猫和老鼠 CDC memDCRATMAX; CDC memCatDC; CBitmap *pOldDC; m

11、emCatDC.CreateCompatibleDC(NULL); pOldDC=memCatDC.SelectObject(&m_bmCatm_nCatDirection); pDC-BitBlt(m_nCatx,m_nCaty,m_nCatw,m_nCath,&memCatDC,0,0,SRCAND); memCatDC.SelectObject(pOldDC);(3)在键盘、定时器、菜单消息处理函数中写入老鼠和猫移动的相应代码代码。void CCatCatchRatView:OnTimer(UINT nIDEvent) if(m_nRat0) /有老鼠未被抓住 srand(unsigne

12、d)time(NULL); for(int i=0;iRATMAX;i+) if(m_bRatLivei) /对未被抓住的老鼠进行处理 switch(nIDEvent) case 2:/该变老鼠运动方向 m_nRatDirectioni=rand()%4; break; case 1: /改变老鼠位置 InvalidateRect(m_rectRati); int nRatMoveStep=m_nRatSpeed+rand()%5;/老鼠移动的距离 if(abs(m_nRatxi-m_nCatx)3*m_nRatw) & (abs(m_nRatyi-m_nCaty)m_rectClient.t

13、op) m_rectRati.top-=nRatMoveStep; m_rectRati.bottom-=nRatMoveStep; m_nRatyi-=nRatMoveStep; /*if*/ else /运动到边界侧改变方向 m_nRatDirectioni=rand()%4; /*else*/ break; case 1: /向下移动 if(m_rectRati.bottom+nRatMoveStepm_rectClient.left) m_rectRati.left-=nRatMoveStep; m_rectRati.right-=nRatMoveStep; m_nRatxi-=nRa

14、tMoveStep; /*if*/ else /运动到边界侧改变方向 m_nRatDirectioni=rand()%4; /*else*/ break; case 3: /向右移动 if(m_rectRati.right+nRatMoveStepm_rectClient.right) m_rectRati.left+=nRatMoveStep; m_rectRati.right+=nRatMoveStep; m_nRatxi+=nRatMoveStep; /*if*/ else /运动到边界侧改变方向 m_nRatDirectioni=rand()%4; /*else*/ break; /*

15、swicth*/ /*switch*/ /判断运动后是否被猫抓住 if(abs(m_nRatxi-m_nCatx)m_nRatw) & (abs(m_nRatyi-m_nCaty)0) /游戏时间以到,老鼠还没抓完,失败 m_nWinFlag=1; /MessageBox(猫高一尺,鼠高一丈!); /*if*/ else /游戏时间未到,老鼠已经抓完,成功 m_nWinFlag=0; /MessageBox(鼠高一尺,猫高一丈!); /*else*/ Invalidate(); /*if*/ /*if*/ else if(m_timeWork.GetTotalSeconds() KillTim

16、er(1); KillTimer(2); StartFlag=2; Invalidate(); m_nWinFlag=0;/MessageBox(鼠高一尺,猫高一丈!); /*else if*/ CView:OnTimer(nIDEvent);void CCatCatchRatView:OnRestart() /重新开始游戏的初始化工作,设置初始参数 StartFlag=-1; m_nRat=RATMAX; m_timeWork=m_timeSet; m_nCatDirection=2; /计算猫和老鼠位图的初时位置和运动方向 m_nCatx=m_rectClient.left+m_rectC

17、lient.Width()/2; m_nCaty=m_rectClient.top+m_rectClient.Height()/2; m_rectCat=CRect(m_nCatx,m_nCaty,m_nCatx+m_nCatw,m_nCaty+m_nCath); srand(unsigned)time(NULL); for(int i=0;im_rectClient.top) m_rectCat.top-=m_nCatSpeed; m_rectCat.bottom-=m_nCatSpeed; m_nCaty-=m_nCatSpeed; m_nCatDirection=0; /*if*/ br

18、eak; case VK_DOWN: /向下移动 if(m_rectCat.bottom-m_nCatSpeedm_rectClient.left) m_rectCat.left-=m_nCatSpeed; m_rectCat.right-=m_nCatSpeed; m_nCatx-=m_nCatSpeed; m_nCatDirection=2; /*if*/ break; case VK_RIGHT: /向右移动 if(m_rectCat.right+m_nCatSpeedm_rectClient.right) m_rectCat.left+=m_nCatSpeed; m_rectCat.r

19、ight+=m_nCatSpeed; m_nCatx+=m_nCatSpeed; m_nCatDirection=3; /*if*/ break; /*switch*/ InvalidateRect(m_rectCat,FALSE); /判断猫的移动后是否抓住老鼠 for(int i=0; iRATMAX; i+) if(m_bRatLivei & (abs(m_nRatxi-m_nCatx)m_nRatw) & (abs(m_nRatyi-m_nCaty)m_nRath) m_bRatLivei=FALSE; m_nRat-; InvalidateRect(m_rectRati); Inva

20、lidateRect(CRect(410,100,560,160); /*if*/ /*for*/ /*if*/ CView:OnKeyDown(nChar, nRepCnt, nFlags);void CCatCatchRatView:OnSelect() CSelectDlg dlg; if(dlg.DoModal()=IDOK) m_nDifficulty=dlg.m_nDifficulty; switch(m_nDifficulty) case 2: m_nCatSpeed=8; m_nRatSpeed=2; m_timeSet=40; break; case 1: m_nCatSpeed=5; m_nRatSpeed=3; m_timeSet=20; break; case 0: m_nCatSpeed=6; m_nRatSpeed=8; m_timeSet=10; break; default: AfxMessageBox(Difficulty sel

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1