软件开发生产实习报告

  • 格式:doc
  • 大小:252.50 KB
  • 文档页数:19

软件开发生产实习报告姓名李瑜学号1201050614班级信息管理与信息系统2012-1项目名称飞机大战实习地点J13-232 实习时间2014.9.20-2014.9.30实习成绩指导教师签字信息科学与工程学院2014 年10 月15 日软件开发生产实习报告1.实习目的1.1使学生全面了解软件项目实施的过程,理解软件企业对于程序员的基本素质和技术能力要求。

1.2使学生掌握C++及Window程序设计的基本技术,能够运用MFC技术及其开发环境进行小型项目的开发。

1.3重点培养学生的独立创新精神和查阅资料能力,提高其口头和书面的沟通能力。

1.4使学生掌握快速学习新知识、新技术方法,培养良好的分析问题和解决问题的能力1.5重点提高学生的编程能力,使学生建立正确的编程理念,养成规范的编程习惯。

2.实习计划一、9.20-9.211、认识MFC的基本功能,实现在windows窗体上的贴图功能;2、初步利用brush绘制背景的颜色,进而掌握添加背景图片的技术;3、设置定时器进行刷屏;二、9.22-9.251、把握游戏的整体架构,了解各个类之间的继承与多态关系,对父类进行编码;2、对游戏对象进行透明贴图,并实现具体的功能;三.9.26-9.281、建立各个游戏对象的链表,并定义对象;2、实现用键盘控制战机的移动,实现战机与战机导弹的链接;3、实现其他游戏对象的移动与速度的设定;4、实现战机导弹与敌机、子弹与战机矩形区域的重合的功能,并清除链表中需要清除的对象;5、释放定时器和内存;四、9.29-9.301、与游戏的功能与界面进行完善,添加文字显示和生命条等;2、对游戏进行调试与改进。

3.实习过程4.1 技术准备(1)、透明贴图函数LoadImage(CImageList& imageList,UINT bmpID,COLORREF crMask ,int cx,int cy,int nInitial)//可用于从 BMP 文件加载位图,主要用于将图片放入图像链表imageList中。

m_Images.Draw(pDC,0,m_ptPos,ILD_TRANSPARENT)//此函数主要是将链表中的图像显示在pDC这个句柄中。

(2)、CObList链表CObList list_ball;//主要是定义一个CObList类的一个链表对象用于存储所有的此种相关对象,易于后续的添加删除和提取数据。

POSITION posball=NULL; //定义指针posBall=list_ball.GetHeadPosition();//指针读取头结点pBall=(CBall *)list_ball.GetNext(posBall);//指针读取下一个结点(3)、设置定时器定时器告诉WINDOWS一个时间间隔,然后WINDOWS以此时间间隔周期性触发程序。

本程序中使用多个定时器,分别控制不同的功能。

使用SetTimer()函数设置定时器,设置系统间隔时间,在OnTimer()函数中实现响应定时器的程序。

(4)、双缓冲技术关于双缓冲技术主要就是利用缓存的原理进行将所有的东西都先存在一个缓冲得虚拟的区域,然后再一次性的将所有的虚拟缓存中的东西都放入实在的存储器中。

(5)、内存释放技术在此次实训项目中有太多的对象的生成和运用,造成了内存的极度的紧张,当游戏进行到一定的程度的时候就会出现内存溢出现象。

内存释放技术的实现主要是通过释放各个满足一定条件的对象和链表来实现的,list_bomb.RemoveAt(B2);//RemoveAt从列表中删除指定位置的元素delete pBomb;//删除敌机(6)、获取矩形区域函数CRect rc; //定义GetClientRect(&rc); //获取其矩形区域获取结果为:rc.Width() //矩形区域的宽度rc.Height() //矩形区域的高度CRect tmpRect;tmpRect.IntersectRect(&bRect,eRect))//判断两个矩形是否有交接4.2 项目实施4.2.1 功能需求1、战机数量为1,战机的位置可通过键盘进行控制。

可通过空格键控制战机进行发导弹,导弹具有一定的速度。

2、2、敌机出现的时间和位置均为随机,敌机的速度也是随机的,敌机发射子弹的时间也是随机的,子弹的发射具有延时性,子弹的速度具有随机性。

3、3、导弹和子弹及敌机碰撞爆炸同时销毁碰撞的物体,战机和子弹及敌机碰撞爆炸同时销毁碰撞的子弹及敌机,战机则判断生命,为0时销毁否则不销毁。

与此同时进行分数和生命的变化同时进行文本的显示提示。

4、4、背景图片的添加。

为游戏提供相关背景。

5、主要的攻击规则如下:敌机可在战机的上方或者下方进行将子弹进行射向战机,同时战机也可根据玩家的指示进行向上或者向下进行发射导弹进行反攻。

6、主要的碰撞规则如下:1)、导弹和敌机的矩形区域或子弹和敌机的矩形区域相交时,表示其相互发生碰撞表示其相互爆炸,销毁游戏对象。

2)、战机生命为0,战机被炸,战机被销毁,游戏结束。

3)、敌机被炸毁,将其进行销毁同时进行分数的相应的增加,并且出现文字提示。

7、实现对战机的生命的增减,战机基本生命值为5,战机射击增加生命值,当其被击中后其生命就-1,每销毁一架敌机加10分,销毁累计10架敌机,战机的生命值加一,生命为0时游戏结束。

8、实现控制战机速度的功能主要是用于在键盘控制战机位置时。

9、实现双缓冲技术进行解决刷屏时屏闪的问题。

4.2.2 总体设计1、系统模块划分飞机大战游戏主要模块可以说是有几个重要的类组成的。

首先是老师给出的CGameObject 类,以及在其派生下的BOMB,BALL,ENEMY,MYPLANE等等。

如图:2、主要功能模块主要功能是在飞机大战View类中,OnTimer函数中实现,将各个类调用,随机产生敌机,子弹的输出,爆炸的实现等等。

它的实现图可以如下实现:4.2.3 详细设计与编码#include "stdafx.h"#include "飞机大战.h"#include "飞机大战Doc.h"#include "飞机大战View.h"#include"MyPlane.h"#include"explosion.h"#include"ball.h"#include"enemy.h"#include"bomb.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endifvoid CMyView::OnDraw(CDC* pDC){CMyDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);}void CMyView::OnTimer(UINT nIDEvent){CDC* pDC=GetDC();CRect rc;GetClientRect(&rc);//双缓存CDC memDC;//定义一个显示设备对象CBitmap bmp;//定义一个位图对象memDC.CreateCompatibleDC(NULL);//建立与屏幕显示兼容的内存显示设备.bmp.CreateCompatibleBitmap(pDC,rc.Width(),rc.Height());CBitmap*oldBit=memDC.SelectObject(&bmp);//设置背景图CBitmap bitmap;CBrush brush;bitmap.LoadBitmap(beijing);brush.CreatePatternBrush(&bitmap);CClientDC dc(this);memDC.FillRect(&rc,&brush);CRect rect;GetClientRect(&rect);//------------------------------static int life=5;static int score=0;/****画战机******************************************/if(pMyPlane!=NULL){pMyPlane->Draw(&memDC,0,rc);memDC.SetBkMode(TRANSPARENT);//透明memDC.SetTextColor(RGB(255,255,20));//文字颜色memDC.TextOut(20,150,"分数:");memDC.TextOut(100,150,itoa(score,new char,10));//itoa:把int转为char字符串memDC.TextOut(20,180,"剩余生命:");memDC.TextOut(150,180,itoa(life,new char,10));//显示生命线CBrush brush1;brush1.CreateSolidBrush(RGB(255,0,0));//创建画刷memDC.SelectObject(brush1);//选择画刷memDC.Rectangle(rect.Width()/2-100,10, rect.Width()/2+life*60-100,30);}else{memDC.SetBkMode(TRANSPARENT);memDC.SetTextColor(RGB(255,255,20));memDC.TextOut(300,300,"GAME OVER");}/*******************添加战机导弹************************/POSITION posBomb=NULL;posBomb=list_bomb.GetHeadPosition();while(posBomb!=NULL){pBomb= (CBomb *)list_bomb.GetNext(posBomb);pBomb->Draw(&memDC,0,rc);}/******************添加敌机*********************/ static int n=0;if(n<=0){n=rand()%40;list_enemy.AddTail(new CEnemy);}n--;POSITION pEnemy1=NULL,pEnemy2=NULL;pEnemy1=list_enemy.GetHeadPosition();//GetHeadPosition 返回列表中首元素的位置while((pEnemy2=pEnemy1)!=NULL){pEnemy=(CEnemy*)list_enemy.GetNext(pEnemy1);if(!pEnemy->Draw(&memDC,0,rc)){list_enemy.RemoveAt(pEnemy2);delete pEnemy;}int x=rand()%40;if(x==1){list_ball.AddTail(newCBall(pEnemy->GetPoint().x+12,pEnemy->GetPoint() .y+25,pEnemy->GetMontion()));}}/************************添加敌机子弹*******************************/ POSITION posBall=NULL;posBall=list_ball.GetHeadPosition();while(posBall!=NULL){pBall=(CBall *)list_ball.GetNext(posBall);pBall->Draw(&memDC,0,rc);}/****************添加爆炸效果**************************/POSITION posExplosion=NULL;for(posExplosion=list_explosion.GetHeadPosition();posExplosion !=NULL;)//GetHeadPosition返回列表中首元素的位置{pExplosion=(CExplosion*)list_explosion.GetNext(posExplosion);//GetNext获取循环遍历中的下一个元素pExplosion->Draw(&memDC,0,rc);}/*****************战机子弹炸掉敌机***********************/if(pMyPlane!=NULL){POSITION B1=NULL,B2=NULL;B1=list_bomb.GetHeadPosition();while((B2=B1)!=NULL)//GetHeadPosition 返回列表中首元素的位置{pBomb= (CBomb*)list_bomb.GetNext(B1);//GetNext获取循环遍历中的下一个元素CRect bRect = pBomb->GetRect();//获得导弹区域POSITION E1=NULL,E2=NULL;E1=list_enemy.GetHeadPosition();while((E2=E1)!=NULL){pEnemy=(CEnemy*)list_enemy.GetNext(E1);CRect eRect=pEnemy->GetRect();//获得敌机区域CRect enRect;//定义一个区域,该区域作用为获得导弹和敌机区域的交集。