当前位置:文档之家› 飞机大战程序设计报告

飞机大战程序设计报告

程序设计综合实践实习报告一、实习题目:飞机大战游戏二、实习时间: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、9.20—9.21先建立CGameObject 类,利用继承机制,根据此类进行依次的派生。

2、9.22—9.25再建立派生类:Bomb,Ball,Enemy,MyPlane,Explosion等,并实现各自功能。

3、9.26—9.29在xxView.cpp中的OnTimer中实现背景的设置,对敌机,导弹,敌机子弹,爆炸效果的绘制,以及敌机子弹和战机,导弹和敌机的碰撞检验,并添加爆炸效果4、9.29—9.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:\\xx1\\Explode",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->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){return DoPreparePrinting(pInfo);}void CXxView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) {// TODO: add extra initialization before printing}void CXxView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) {// TODO: add cleanup after printing}///////////////////////////////////////////////////////////////// // CXxView diagnostics#ifdef _DEBUGvoid CXxView::AssertValid() const{CView::AssertValid();}void CXxView::Dump(CDumpContext& dc) const{CView::Dump(dc);}CXxDoc* CXxView::GetDocument() // non-debug version is inline{ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CXxDoc)));return (CXxDoc*)m_pDocument;}#endif //_DEBUG///////////////////////////////////////////////////////////////// // CXxView message handlersint fireflag=0;void CXxView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) {// TODO: Add your message handler code here and/or call default if(nChar==VK_RIGHT) //VK_LEFT、VK_DOWN、VK_UP{myplane.SetHorMotion(1);}if(nChar==VK_LEFT) //VK_LEFT、VK_DOWN、VK_UP{myplane.SetHorMotion(-1);}if(nChar==VK_UP) //VK_LEFT、VK_DOWN、VK_UP{myplane.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 defaultif(nChar==VK_RIGHT || nChar==VK_LEFT || nChar==VK_UP || nChar==VK_DOWN) //VK_LEFT、VK_DOWN、VK_UP{if(nChar==VK_RIGHT) //VK_LEFT、VK_DOWN、VK_UP{myplane.SetHorMotion(0);}if(nChar==VK_LEFT) //VK_LEFT、VK_DOWN、VK_UP{myplane.SetHorMotion(0);if(nChar==VK_UP) //VK_LEFT、VK_DOWN、VK_UP{myplane.SetVerMotion(0);}if(nChar==VK_DOWN) //VK_LEFT、VK_DOWN、VK_UP{myplane.SetVerMotion(0);}}// TODO: Add your message handler code here and/or call defaultif(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);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); //将刷子选入pDC pDC->Rectangle(&rc);pDC->SelectObject(pbrush);//回复原来的刷子,规则*/CBitmap bmp1;bmp1.LoadBitmap(IDB_BITMAP8); //创建位图CBrush brush;CBrush *pbrush=pDC->SelectObject(&brush); //将刷子选入pDC pDC->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(m<=0){m=rand()%40;listenemy.AddTail(new Enemy);}m--;POSITION penemy1=NULL,penemy2=NULL;//POSITION是一个空结构体的指针POSITION类型的变量为链表的键。

相关主题