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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

飞机大战游戏设计与实现.docx

1、飞机大战游戏设计与实现程序设计综合实践报告姓名学号班级项目名称飞机大战游戏设计与实现实习地点计算机实验室实习时间2015-12-9至2015-12-19实习成绩指导教师签字信息科学与工程学院 2015年 12月20日 1. 概述项目:飞机大战主要功能有以下几点:1.1 关卡设置本次飞机大战游戏中共设置了四个关卡,第一关的难度设置较低,仅有敌机对其进行攻击;第二关在原有的基础上增加一些补血的小道具,当积分达到一定的时候便会出现该道具,并且敌机出现的频率也比第一关高;第三关在第二关的基础上新出现了小boss,并增加了其他的道具;第四关在第三关的基础上再新出现大boss,当积分达到要求以及大boss

2、被消灭后通关成功。1.2 敌机设置小敌机随机出现,炮弹也随机发射,当小敌机与战机相撞或被战机的子弹击中时,小敌机消失。当达到一定积分时,小boss出现并随机发射出与小敌机一样的炮弹,但是炮弹分三个方向发射出。当小boss被战机的子弹击中或与战机相撞时失去5滴血。当到达四关并且积分足够多时出现大boss,同小boss一样,当大boss与战机相撞或被战机子弹击中时失去1滴血。除此之外,小boss和大boss上方都有血条显示,当血条消失时意味着生命消失,大boss和小boss消失。小boss会在屏幕上随机出现和走动出了屏幕后会在屏幕的任意地方再随机出现,直至血量为0消失。大boss则在屏幕中随机走动

3、不出屏幕,直至血量为0消失。1.3 战机设置战机初始有五条生命,每条命的血量为50,所获得的积分以及其生命值、血条都在窗口的左上角显示。在第一、二关时,按空格键战机会出现两个向上发射的炮弹,到第三、四关的时候,按空格键战机会发射三个不同方向的炮弹。战机吃到药瓶道具时血量会增加20,但不可以超过50;吃到闪电道具时,便可放大招,放大招的次数为15。当战机被敌方的炮弹击中或与敌方相撞时,血量减少,减少为0时生命值减1,直至生命值为0。1.4 游戏设置进入游戏时,会有背景音乐,窗口左上角显示战机所得积分及其生命值。根据积分情况进入不同的关卡。游戏通关时屏幕清空,并显示通关成功,按Y可重新开始游戏。当

4、战机的血量以及生命值为0时,游戏失败,屏幕清空并显示游戏结束,按Y即可重新开始游戏。2. 相关技术2.1 Windows定时器技术Windows定时器是一种输入设备,它周期性地在每经过一个指定的时间间隔后就通知应用程序一次。程序将时间间隔告诉windows,然后windows给你的程序发送周期性发生的WM_YIMER消息以表示时间到了。本程序在OnCreate()函数中使用了编号为1的定时器,控制了每30毫秒刷新一次。2.2 双缓冲技术在内存中创建一个与屏幕绘图区域一致的对象,先将图形绘制到内存这个对象上,再一次性将这个对象上的图形拷贝到屏幕上,这样即可解决图片闪烁问题。本程序在绘制滚动背景以

5、及飞机,敌机等中用到了该技术。2.3 获取矩形区域用CRect定义一个对象,利用这个对象得到要用到的矩形区域,用IntersectRect函数来判断两个源矩形是不是有重合的部分。3. 总体设计与详细设计3.1 系统模块划分飞机大战游戏主要模块可以说是有几个重要的类组成的。首先是老师给出的CGameObject类,以及在其派生下的Bomb,Ball,Enemy,MyPlane,Explosion,AddBlood等等此处不一一列举。另外还有CObject派生的BackGround类。如下图:3.2 主要功能模块主要功能是在飞机大战View类中,OnTimer函数中实现,将各个类调用,随机产生敌机

6、,子弹的输出,爆炸的实现等等。它的实现图可以如下实现:本程序所包含的功能和类模块:游戏子系统模块名称功能简述应用程序对象游戏程序的加载、游戏对象的绘制、玩家的键盘事件获取游戏对象各个游戏对象的抽象父类(CGameObject)战机对象战机类(MyPlane)敌机对象敌机类(Enemy, LittleBoss,Boss)导弹对象导弹类(Bomb,Bomb2)炸弹对象炸弹类(Ball,BossBall)爆炸对象爆炸类(Explosion)道具对象道具类(AddBlood,AddBomb)4. 编码实现4.1 初始准备模块名称应用程序对象功能描述游戏程序的加载、游戏对象的绘制、玩家的键盘事件获取数据

7、结构与算法CflyfightView:CflyfightView() / TODO: 在此处添加构造代码 flag=0; flag2=0; level=1; bossblood=100;CflyfightView:CflyfightView()BOOL CflyfightView:PreCreateWindow(CREATESTRUCT& cs) / TODO: 在此处通过修改 / CREATESTRUCT cs 来修改窗口类或样式 return CView:PreCreateWindow(cs);/ CflyfightView 绘制void CflyfightView:OnDraw(CDC*

8、 pDC) CflyfightDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; / TODO: 在此处为本机数据添加代码/ CflyfightView 打印BOOL CflyfightView:OnPreparePrinting(CPrintInfo* pInfo) / 默认准备 return DoPreparePrinting(pInfo);void CflyfightView:OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) / TODO: 添加额外的打

9、印前进行的初始化过程void CflyfightView:OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) / TODO: 添加打印后进行的清理过程/ CflyfightView 诊断#ifdef _DEBUGvoid CflyfightView:AssertValid() const CView:AssertValid();void CflyfightView:Dump(CDumpContext& dc) const CView:Dump(dc);CflyfightDoc* CflyfightView:GetDocument() const

10、 / 非调试版本是内联的 ASSERT(m_pDocument-IsKindOf(RUNTIME_CLASS(CflyfightDoc); return (CflyfightDoc*)m_pDocument;#endif /_DEBUG/ CflyfightView 消息处理程序int CflyfightView:OnCreate(LPCREATESTRUCT lpCreateStruct) if (CView:OnCreate(lpCreateStruct) = -1) return -1; / TODO: 在此添加专用代码和/或调用基类 PlaySound(LPCTSTR)IDR_WAVE

11、1, AfxGetInstanceHandle(), SND_RESOURCE | SND_ASYNC|SND_LOOP); SetTimer(1, 30, 0); CMyPlane:LoadImage(); CEnemy:LoadImage(); CExplosion:LoadImage(); CBomb:LoadImage(); CBall:LoadImage(); CAddBlood:LoadImage(); CAddBomb:LoadImage(); CBomb2:LoadImage(); CLittleBoss:LoadImage(); CBoss:LoadImage(); CBos

12、sBall:LoadImage(); return 0;void CflyfightView:OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags) / TODO: 在此添加消息处理程序代码和/或调用默认值 if(nChar=VK_DOWN|VK_UP) myPlane.SetVerMotion(0); if(nChar=VK_RIGHT|VK_LEFT) myPlane.SetHorMotion(0); CView:OnKeyUp(nChar, nRepCnt, nFlags);补充说明4.2 战机对象模块名称战机对象功能描述战机移动、战机导弹的发射数据

13、结构与算法short key=GetKeyState(VK_RIGHT);short key1=GetKeyState(VK_LEFT);short key2=GetKeyState(VK_UP);short key3=GetKeyState(VK_DOWN); if (key&0x80)!=0) myPlane.SetHorMotion(1); else if (key1&0x80)!=0) myPlane.SetHorMotion(-1); else if (key2&0x80)!=0) myPlane.SetVerMotion(-1); else if (key3&0x80)!=0) m

14、yPlane.SetVerMotion(1);void CflyfightView:OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags) / TODO: 在此添加消息处理程序代码和/或调用默认值 if(nChar=VK_DOWN|VK_UP) myPlane.SetVerMotion(0); if(nChar=VK_RIGHT|VK_LEFT) myPlane.SetHorMotion(0); CView:OnKeyUp(nChar, nRepCnt, nFlags);void CflyfightView:OnKeyDown(UINT nChar, UI

15、NT nRepCnt, UINT nFlags) / TODO: 在此添加消息处理程序代码和/或调用默认值 if(nChar=VK_SPACE) if(myPlane.Fired() if(flag=0&(level=1|level=2) listBomb.AddTail(new CBomb(myPlane.GetPoint().x+10,myPlane.GetPoint().y+20,0,12); listBomb.AddTail(new CBomb(myPlane.GetPoint().x+30,myPlane.GetPoint().y+20,0,12); else if(flag=0&(

16、level=3|level=4) listBomb.AddTail(new CBomb(myPlane.GetPoint().x+10,myPlane.GetPoint().y+20,5,12); listBomb.AddTail(new CBomb(myPlane.GetPoint().x+30,myPlane.GetPoint().y+20,0,12); listBomb.AddTail(new CBomb(myPlane.GetPoint().x+30,myPlane.GetPoint().y+20,-5,12); if(flag2!=0) listBomb2.AddTail(new C

17、Bomb2(myPlane.GetPoint().x+10,myPlane.GetPoint().y+20,10,10); listBomb2.AddTail(new CBomb2(myPlane.GetPoint().x+40,myPlane.GetPoint().y+20,5,10); listBomb2.AddTail(new CBomb2(myPlane.GetPoint().x+20,myPlane.GetPoint().y+20,0,10); listBomb2.AddTail(new CBomb2(myPlane.GetPoint().x+40,myPlane.GetPoint(

18、).y+20,-5,10); listBomb2.AddTail(new CBomb2(myPlane.GetPoint().x+40,myPlane.GetPoint().y+20,-10,10); flag2-; if(flag2GetPoint(); if(rand()%60=1) listBall.AddTail(new CBall(point2.x+10,point2.y+10,0,-12); poslboss=listlboss.GetHeadPosition(); while(poslboss!=NULL) CLittleBoss *plboss=(CLittleBoss*)li

19、stlboss.GetNext(poslboss); CPoint point3=plboss-GetPoint(); if(rand()%50=1) listBall.AddTail(new CBall(point3.x+10,point3.y+10,-5,-12); listBall.AddTail(new CBall(point3.x+10,point3.y+10,0,-12); listBall.AddTail(new CBall(point3.x+10,point3.y+10,5,-12); posboss=listboss.GetHeadPosition(); while(posb

20、oss!=NULL) CBoss *pboss=(CBoss*)listboss.GetNext(posboss); CPoint point4=pboss-GetPoint(); if(rand()%40=1) listbossball.AddTail(new CBossBall(point4.x+45,point4.y+90,-5,-12); listbossball.AddTail(new CBossBall(point4.x+45,point4.y+90,0,-12); listbossball.AddTail(new CBossBall(point4.x+45,point4.y+10

21、,5,-12); /大Boss血条显示CBrush brush;brush.CreateSolidBrush(RGB(255,0,0);pDC-SelectObject(brush);pDC-Rectangle(m_ptPos.x,m_ptPos.y,m_ptPos.x+bblood*0.9,m_ptPos.y-5);/小Boss血条显示CBrush brush;brush.CreateSolidBrush(RGB(255,0,0);pDC-SelectObject(brush);pDC-Rectangle(m_ptPos.x,m_ptPos.y,m_ptPos.x+lblood,m_ptPo

22、s.y-5);补充说明4.4 道具对象模块名称道具对象功能描述积分达到一定的时候出现道具,战机吃掉道具,道具消失,战机补血或获得技能数据结构与算法if(myPlane.score%510=0) listAddblood.AddHead(new CAddBlood(); if(myPlane.score%900=0&level!=1) listaddbomb.AddHead(new CAddBomb();/*加血药瓶*/ POSITION posaddblood=listAddblood.GetHeadPosition(); POSITION pos4; for(posaddblood;(pos

23、4=posaddblood)!=NULL;) CAddBlood *paddblood=(CAddBlood*)listAddblood.GetNext(posaddblood); paddblood-Draw(&m_mDC,FALSE); CRect rect; int section=rect.IntersectRect(paddblood-GetRect(),myPlane.GetRect(); if(section!=0) if(myPlane.bloodDraw(&m_mDC,FALSE); CRect rect; int section=rect.IntersectRect(pad

24、dbomb-GetRect(),myPlane.GetRect(); if(section!=0) flag=1; flag2=15; listaddbomb.RemoveAt(pos5); delete paddbomb; break; 补充说明4.5 主要内容模块名称主要内容功能描述战机导弹击中敌机和大小Boss,战机与敌机和大小Boss相撞,敌机和大小Boss发射的炮弹击中战机数据结构与算法/战机导弹击中敌机POSITION pos1 = NULL;/删除敌机POSITION pos2 = NULL,pos3=NULL;/删除导弹for (posBomb = listBomb.GetHe

25、adPosition(); (pos2=posBomb)!= NULL;) CBomb *pBomb = (CBomb*)listBomb.GetNext(posBomb); for (posEnemy = listEnemy.GetHeadPosition(); (pos1=posEnemy ) != NULL;) CRect intersectRect; CEnemy *pEnemy = (CEnemy*)listEnemy.GetNext(posEnemy); int intersectSection = intersectRect.IntersectRect(pEnemy-GetRec

26、t(), pBomb-GetRect(); if (intersectSection != 0) CRect eRect; eRect=pEnemy-GetRect(); listExplosion.AddTail(new CExplosion(eRect.left, eRect.top); myPlane.score+=30; if(myPlane.score%510=0) listAddblood.AddHead(new CAddBlood(); if(myPlane.score%900=0&level!=1) listaddbomb.AddHead(new CAddBomb(); if(myPlane.score%600=0&level!=1&level!=2) listlboss.AddHead(new CLittleBoss(); if(myPlane.score=3630) listboss.AddHead(new CBoss(); listEnemy.RemoveAt(p

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

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