




已阅读5页,还剩28页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
山东科技大学实习报告程序设计综合实践实习报告一、实习题目:飞机大战游戏 二、实习时间:2014.9.20-2014.9.30实习地点:J13-132、232三、实习任务:通过项目实战,掌握C+面向对象编程的基础技术和Windows应用程序的编程方法,能够运用MFC技术及其开发环境进行小项目的开发。 四、小组分工说明: 五、实习成绩 六、指导教师对实习的评语: 指导教师(签章): 年 月 日飞机大战游戏1. 实习目的1.1使学生全面了解软件项目实施的过程,理解软件企业对于程序员的基本素质和技术能力要求。1.2使学生掌握C+及Window程序设计的基本技术,能够运用MFC技术及其开发环境进行小型项目的开发。1.3重点培养学生的独立创新精神和查阅资料能力,提高其口头和书面的沟通能力。1.4使学生掌握快速学习新知识、新技术方法,培养良好的分析问题和解决问题的能力1.5重点提高学生的编程能力,使学生建立正确的编程理念,养成规范的编程习惯。2. 实习计划 1、9209.21先建立CGameObject 类,利用继承机制,根据此类进行依次的派生。2、9.229.25再建立派生类:Bomb,Ball,Enemy,MyPlane,Explosion等,并实现各自功能。3、9.269.29在xxView.cpp中的OnTimer中实现背景的设置,对敌机,导弹,敌机子弹,爆炸效果的绘制,以及敌机子弹和战机,导弹和敌机的碰撞检验,并添加爆炸效果4、9.299.30最后释放pDC以及定时器3实习过程3.1 技术准备透明贴图技术绘制透明位图的关键就是创建一个“掩码”位图(mask bitmap),这个“掩码”位图是一个单色位图,它是位图中图像的一个单色剪影。在详细介绍实现过程之前先介绍下所使用的画图函数以及函数参数所代表的功能;整个绘制过程需要使用到BitBlt()函数。整个功能的实现过程如下: (1) 创建一张大小与需要绘制图像相同的位图作为“掩码”位图;(2) 将新创建的“掩码”位图存储至掩码位图的设备描述表中;(3) 把位图设备描述表的背景设置成“透明色”,不需要显示的颜色;(4) 复制粘贴位图到“掩码”位图的设备描述表中,这个时候“掩码”位图设备描述表中存放的位图与位图设备描述表中的位图一样;(5) 把需要透明绘制的位图与对话框绘图相应区域的背景进行逻辑异或操作绘制到对话框上;(6) 把“掩码”位图与这个时候对话框相应区域的背景进行逻辑与的操作;(7) 重复步骤5的操作,把需要透明绘制的位图与对话框绘图相应区域的背景进行逻辑异或操作绘制到对话框上;(8) 最后把系统的画笔还给系统,删除使用过的GDIObject,释放非空的指针,最后把新建的设备描述表也删除。BOOL CGameObject:LoadImage(CImageList& imgList,UINT bmpID,COLORREF crMask,int cx,int cy,int nInitial)CBitmap bmp;if(!bmp.LoadBitmap(bmpID)return FALSE;if(!imgList.Create(cx, cy, ILC_COLOR24|ILC_MASK, nInitial, 0)/图像的长、宽、显示样式、图像可控数return FALSE;imgList.Add(&bmp, crMask);/滤掉底色return TRUE;CObList链表在本程序中使用了CObList链表来分别存储敌机,炸弹,导弹,爆炸效果。CObList 链表类似于一个双向链表,POSITION类型的变量为链表的键。使用POSITION变量,既可以作为链表循环中的循环变量,也可以作为标记某个位置的标签。我们可以通过获得莫元素的POSITION()来访问它。本程序中主要用到的函数有:GetHeadPosition()获取链表首元素的POSITIONAddTail()向链表尾部添加新的元素GetNext( POSITION& rPosition )返回当前rPosition指向的元素,并使rPosition指向下一个元素碰撞检验相关函数用CRect类中的GetRect()函数可以获得当前对象的矩形区域,IntersectRect()函数判断战机与敌机、子弹与战机,导弹与敌机,导弹与子弹是否相撞。设置定时器、销毁定时器Windows定时器是一种输入设备,它周期性地在每经过一个指定的时间间隔后就通知应用程序一次。程序将时间间隔告诉Windows,然后Windows给您的程序发送周期性发生的WM_TIMER消息,以表示时间到了。SetTimer()函数来设置定时器,控制每隔多少毫秒执行一次什么任务。用KillTime函数来销毁定时器。键盘控制添加OnKeyDown()和OnKeyUp()函数,通过修改战机的相应参数来实现对战机的控制,如上下左右运动,发射子弹等等。双缓冲技术关于双缓冲技术主要就是利用缓存的原理进行将所有的东西都先存在一个缓冲的虚拟的区域,然后再一次性的将所有的虚拟缓存中的东西都放入实在的存储器中。CDC* pDC=GetDC();CDC cdc;cdc.CreateCompatibleDC(pDC);/依附窗口DC创建兼容内存DC所有的图像文字均存入cdc中,然后一次性的通过cdc.BitBlt(0,0,rc.Width(),rc.Height(),&cdc,0,0,SRCCOPY);/双缓冲BitBlt()函数,防止窗口刷新而闪烁将内存DC上的图像拷贝到前台cdc.DeleteDC();bitmap1.DeleteObject();ReleaseDC(pDC);添加爆炸效果函数PlaySound(H:xx1Explode,NULL,SND_FILENAME|SND_ASYNC);弹出对话框函数if(life = 0) AfxMessageBox(Game Over!,0,0); break;3.2 项目实施 3.2.1 功能需求战机数量为1由玩家通过键盘控制(方向控制位置、默认开启炸弹,空格键发射清屏导弹)战机导弹遇到敌机发生爆炸,敌机被炸毁,导弹消失,玩家得分有计算机控制敌机自动向战机发动攻击,战机有10条生命敌机数量随机,计算机生成敌机时随机选择类别敌机行驶期间,不左右移动,不反向移动在游戏界面输出当前游戏进行信息,包括当前得分、击中敌机数量游戏过程中添加了声效 3.2.2 总体设计 系统模块划分有两个主要的部分组成,分别是规则子系统、游戏规则子系统。游戏规则子系统模块名称功能简述人工智能人机对战规则的实现游戏子系统模块名称功能简述应用程序对象游戏程序的加载、游戏对象的绘制、游戏规则的调用、玩家的键盘事件获取游戏对象各个游戏对象的抽象父类战机对象战机类敌机对象敌机类导弹对象导弹类炸弹对象炸弹类爆炸对象爆炸类文字对象文字类物品对象物品类类体系 系统对象类图UML产生敌机并绘制敌机流程图 3.2.3 详细设计与编码 BOOL CXxView:PreCreateWindow(CREATESTRUCT& cs)/ TODO: Modify the Window class or styles here by modifying/ the CREATESTRUCT csreturn CView:PreCreateWindow(cs);/ CXxView drawingvoid CXxView:OnDraw(CDC* pDC)CXxDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/*/CDC* pDC=GetDC();static int x=0;RECT rc;GetClientRect(&rc);/获得窗体的尺寸CBitmap bmp1;bmp1.LoadBitmap(IDB_BITMAP9); /创建位图 CBrush brush;brush.CreatePatternBrush(&bmp1); CBrush *pbrush=pDC-SelectObject(&brush); /将刷子选入pDCpDC-Rectangle(&rc);pDC-SelectObject(pbrush);/回复原来的刷子,规则 /* CDC* m_pMemDC1;/为绘图提供成员函数m_pMemDC1 = new CDC;/为绘图申请内存空间m_pMemDC1-CreateCompatibleDC(pDC);CBitmap bmp1;/*bmp1.LoadBitmap(IDB_BITMAP11); /创建位图m_pMemDC1-SelectObject(&bmp1);pDC-BitBlt(0,0,480,644,m_pMemDC1,0,0,SRCCOPY);DeleteObject(bmp1);delete m_pMemDC1;/释放内存*/ /*myplane.Draw(pDC,0);enemy.Draw(pDC,0); ball.Draw(pDC,0);bomb.Draw(pDC,0);explosion.Draw(pDC,0);*/ TODO: add draw code for native data here/ CXxView printingBOOL CXxView:OnPreparePrinting(CPrintInfo* pInfo)/ default preparationreturn DoPreparePrinting(pInfo);void CXxView:OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)/ TODO: add extra initialization before printingvoid CXxView:OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)/ TODO: add cleanup after printing/ CXxView diagnostics#ifdef _DEBUGvoid CXxView:AssertValid() constCView:AssertValid();void CXxView:Dump(CDumpContext& dc) constCView:Dump(dc);CXxDoc* CXxView:GetDocument() / non-debug version is inlineASSERT(m_pDocument-IsKindOf(RUNTIME_CLASS(CXxDoc);return (CXxDoc*)m_pDocument;#endif /_DEBUG/ CXxView message handlers int fireflag=0;void CXxView:OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) / TODO: Add your message handler code here and/or call defaultif(nChar=VK_RIGHT) /VK_LEFT、VK_DOWN、VK_UPmyplane.SetHorMotion(1);if(nChar=VK_LEFT) /VK_LEFT、VK_DOWN、VK_UPmyplane.SetHorMotion(-1);if(nChar=VK_UP) /VK_LEFT、VK_DOWN、VK_UPmyplane.SetVerMotion(1);if(nChar=VK_DOWN) /VK_LEFT、VK_DOWN、VK_UPmyplane.SetVerMotion(-1);if(nChar=VK_SPACE)fireflag=1;CView:OnKeyDown(nChar, nRepCnt, nFlags);void CXxView:OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags) / TODO: Add your message handler code here and/or call default if(nChar=VK_RIGHT | nChar=VK_LEFT | nChar=VK_UP | nChar=VK_DOWN) /VK_LEFT、VK_DOWN、VK_UPif(nChar=VK_RIGHT) /VK_LEFT、VK_DOWN、VK_UPmyplane.SetHorMotion(0);if(nChar=VK_LEFT) /VK_LEFT、VK_DOWN、VK_UPmyplane.SetHorMotion(0);if(nChar=VK_UP) /VK_LEFT、VK_DOWN、VK_UPmyplane.SetVerMotion(0);if(nChar=VK_DOWN) /VK_LEFT、VK_DOWN、VK_UPmyplane.SetVerMotion(0); / TODO: Add your message handler code here and/or call default if(nChar=VK_SPACE) fireflag=0; CView:OnKeyUp(nChar, nRepCnt, nFlags);int CXxView:OnCreate(LPCREATESTRUCT lpCreateStruct) if (CView:OnCreate(lpCreateStruct) = -1)return -1;/ TODO: Add your specialized creation code here/安装定时器SetTimer(2,45,NULL);/*MyPlane:LoadImage();Enemy:LoadImage();Bomb:LoadImage();Ball:LoadImage();Explosion:LoadImage();*/1是定时器的标示符,30ms的间隔,NULL表示让窗体接受消息,而不是函数return 0;void CXxView:OnTimer(UINT nIDEvent) / TODO: Add your message handler code here and/or call defaultCXxDoc* pDoc = GetDocument();ASSERT_VALID(pDoc); CDC* pDC=GetDC();static int x=0;CRect rc;/定义客户区GetClientRect(&rc);/获得窗体的尺寸 CDC cdc;/设备环境对象CBitmap bitmap1;/内存位图cdc.CreateCompatibleDC(pDC);/建立与位图相应的内存设备上下文bitmap1.CreateCompatibleBitmap(pDC,rc.Width(),rc.Height();CBitmap *pOldBit = cdc.SelectObject(&bitmap1);cdc.FillSolidRect(rc,RGB(51,255,255);/绘制蓝天/创建一个蓝色的刷子/*CBrush brush;brush.CreateSolidBrush(RGB(84,142,239);CBrush *pbrush=pDC-SelectObject(&brush); /将刷子选入pDCpDC-Rectangle(&rc);pDC-SelectObject(pbrush);/回复原来的刷子,规则*/ CBitmap bmp1;bmp1.LoadBitmap(IDB_BITMAP8); /创建位图 CBrush brush;brush.CreatePatternBrush(&bmp1); CBrush *pbrush=pDC-SelectObject(&brush); /将刷子选入pDCpDC-Rectangle(&rc);pDC-SelectObject(pbrush);/回复原来的刷子,规则/*if(life!=0)myplane.Draw(pDC,0);*/static int life = 10;static int score = 0;/-绘制战机-/if(life!=0)myplane.Draw(pDC,0);/*enemy.Draw(pDC,0);bomb.Draw(pDC,0);ball.Draw(pDC,0);explosion.Draw(pDC,0);*/-绘制敌机-/ if(life!=0)static int m=0;if(mDraw(pDC,0)listenemy.RemoveAt(penemy2);delete enemy;int x=rand()%40;/子弹距离if(x=1)listball.AddTail(new Ball(enemy-GetPoint().x+12,enemy-GetPoint().y,enemy-GetMontion(); /-添加战机导弹-/if(fireflag=1)PlaySound(H:xx1FIRE,NULL,SND_FILENAME|SND_ASYNC); listbomb.AddTail(new Bomb(myplane.GetPoint().x+10,myplane.GetPoint().y); listbomb.AddTail(new Bomb(myplane.GetPoint().x+30,myplane.GetPoint().y);POSITION pbomb1=NULL,pbomb2=NULL;pbomb1=listbomb.GetHeadPosition();while(pbomb2=pbomb1)!=NULL)bomb=(Bomb *)listbomb.GetNext(pbomb1);if(!bomb-Draw(pDC,0)listbomb.RemoveAt(pbomb2);delete bomb;/-添加敌机子弹-/ if(life != 0) POSITION posball=listball.GetHeadPosition();while(posball!=NULL)ball=(Ball *)listball.GetNext(posball);/返回链表元素if(!ball-Draw(pDC, 0) listball.RemoveAt(posball);delete ball; /-添加爆炸效果-/ POSITION explosion1=NULL,explosion2=NULL; explosion1=listexplosion.GetHeadPosition(); while(explosion2=explosion1)!=NULL) explosion=(Explosion *)listexplosion.GetNext(explosion1); if(!explosion-Draw(pDC,0) listexplosion.RemoveAt(explosion2); delete explosion; /-导弹炸掉敌机-/POSITION b1=NULL,b2=NULL;b1=listbomb.GetHeadPosition();/GetHeadPosition while(b2=b1)!=NULL) bomb=(Bomb *) listbomb.GetNext(b1); CRect brect=bomb-GetRect();/获取导弹区域 POSITION e1=NULL,e2=NULL; e1=listenemy.GetHeadPosition(); while(e2=e1)!=NULL) enemy=(Enemy *)listenemy.GetNext(e1);/GetNext获取循环链表中下一个元素 CRect erect=enemy-GetRect();/获得敌机区域 CRect beRect;/定义一个区域,该区域作用为获得导弹和敌机区域的交集 if(beRect.IntersectRect(&brect,erect)/若导弹和敌机有交集,添加爆炸效果,删除导弹和敌机 score+=10; listexplosion.AddTail(new Explosion(erect.left, erect.top); listbomb.RemoveAt(b2);/RemoveAt 从列表中删除指定位置的元素 delete bomb; listenemy.RemoveAt(e2); delete enemy; break;PlaySound(H:xx1Explode,NULL,SND_FILENAME|SND_ASYNC); /-敌机子弹炸掉战机-/POSITION ba1=NULL,ba2=NULL;CRect prect=myplane.GetRect();if(life!=0)for(ba1=listball.GetHeadPosition();(ba2=ba1)!=NULL;)ball=(Ball *)listball.GetNext(ba1);CRect barect=ball-GetRect();CRect baprect;if(baprect.IntersectRect(barect,prect)listexplosion.AddTail(new Explosion(prect.left,prect.top);listball.RemoveAt(ba2);delete ball;life-;/break;PlaySound(H:xx1Explode,NULL,SND_FILENAME|SND_ASYNC);/*if(life = 0)/delete myplane; /myplane = NULL;*/if(life = 0)AfxMessageBox(Game Over!,0,0);break;/-敌机与战机相撞后销毁-/ POSITION bPos1 = NULL,bPos2 = NULL; CRect mRect = myplane.GetRect();/获得战机区域 if(life!=0) for(bPos1=listenemy.GetHeadPosition();( bPos2 = bPos1 ) != NULL;) enemy = (Enemy*)listenemy.GetNext(bPos1);CRect eRect = enemy-GetRect();/获得敌机区域CRect tmpRect;if(tmpRect.IntersectRect(&eRect,mRect)/敌机区域与战机区域相交score += 10; life -= 1;/添加炸弹效果listexplosion.AddTail(new Explosion(mRect.left,mRect.top); /删除敌机listenemy.RemoveAt(bPos2);delete enemy; PlaySound(H:xx1resExplode,NULL,SND_FILENAME|SND_ASYNC); if(life = 0) AfxMessageBox(Game Over!,0,0); break; /-导弹与子弹互撞后销毁-/ POSITION bomPos1=NULL,bomPos2=NULL;if(life!=0)for(bomPos1=listbomb.GetHeadPosition();(bomPos2 = bomPos1) != NULL;) bomb = (Bomb*)listbomb.GetNext(bomPos1);CRect bombRect = bomb-GetRect();POSITION balPos1=NULL,balPos2=NULL;for(balPos1=listball.GetHeadPosition();(balPos2 = balPos1)!=NULL;)ball = (Ball*)listball.GetNext(balPos1);CRect b
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度郑州工程技术学院招聘高层次人才81名考前自测高频考点模拟试题及完整答案详解1套
- 2025江苏宿迁市泗洪县卫健系统面向社会招聘工作人员5人考前自测高频考点模拟试题及1套完整答案详解
- 行政文件归档与存档标准指南
- 中信银行泉州市石狮市2025秋招半结构化面试题库及参考答案
- 兴业银行呼和浩特市和林格尔县2025秋招英文面试题库及高分回答
- 2025年浙江台州天台县事业单位招聘63人笔试备考题库及完整答案详解1套
- 华夏银行深圳市坪山区2025秋招结构化面试经典题及参考答案
- 浦发银行湖州市长兴县2025秋招笔试英语题专练及答案
- 兴业银行厦门市同安区2025秋招无领导模拟题角色攻略
- 民生银行衡水市桃城区2025秋招笔试热点题型专练及答案
- 人教版三年级上册《生命.生态.安全》全册教案(及计划)
- 2024年污水管道维修协议书范文范本
- 新人教版《海水的性质》课件
- 雪糕车租赁合同三篇
- 绘画劳务合同
- 苗木供应质量保证措施方案
- 无人机辅助通信系统研究
- Java 8函数式编程(完整版)
- 司机安全责任协议书
- 代发客户如何做经营分析
- 冠状动脉搭桥手术后的运动康复指导与介绍
评论
0/150
提交评论