软件开发生产实习报告.doc_第1页
软件开发生产实习报告.doc_第2页
软件开发生产实习报告.doc_第3页
软件开发生产实习报告.doc_第4页
软件开发生产实习报告.doc_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

软件开发生产实习报告姓名王子华学号1201050632班级信管2012-1项目名称飞机大战实习地点J13-232实习时间9.20-9.30实习成绩指导教师签字信息科学与工程学院 2014 年 10月 14日 软件开发生产实习报告1. 实习目的1.1使学生全面了解软件项目实施的过程,理解软件企业对于程序员的基本素质和技术能力要求。1.2使学生掌握C+及Window程序设计的基本技术,能够运用MFC技术及其开发环境进行小型项目的开发。1.3重点培养学生的独立创新精神和查阅资料能力,提高其口头和书面的沟通能力。1.4使学生掌握快速学习新知识、新技术方法,培养良好的分析问题和解决问题的能力1.5重点提高学生的编程能力,使学生建立正确的编程理念,养成规范的编程习惯。2. 实习计划 我们在之前学习过C语言、C+等,但是传统的理论学习对于这种操作性、适用性很强的技能来说是纸上谈兵,所以,为了深化对这些代码、语言以及开发的了解,我们开始了这次实训,也希望经过这次实训,让我们更加明白在实际应用中需要具备的能力3实习过程3.1 技术准备1.透明贴图功能的实现CDC imgDC, maskDC; /定义存储位图的位图设备描述表imgDC和存储掩 码位图的掩码位图CRect rcWnd, rcPic;imgDC.CreateCompatibleDC(NULL); /初始化设备描述表maskDC.CreateCompatibleDC(NULL); /初始化设备描述表CBitmap bmpMask;BITMAP bm;m_bmpSample.GetBitmap(&bm);GetClientRect(rcWnd);rcPic.left = (rcWnd.Width() - bm.bmWidth)/2;rcPic.right = rcPic.left + bm.bmWidth;rcPic.top = (rcWnd.Height() - bm.bmHeight)/2;rcPic.bottom = rcPic.top + bm.bmHeight;bmpMask.CreateBitmap(bm.bmWidth, bm.bmHeight, 1, 1, NULL); /初始化掩码位图CBitmap * pOldBmp = imgDC.SelectObject(&m_bmpSample); /存储位图至位图设备描述表CBitmap * pOldMaskBmp = maskDC.SelectObject(&bmpMask); /存储掩码位图至掩码位图imgDC.SetBkColor(RGB(255, 255, 0); /设置位图设备描述表的背景色为透明色maskDC.BitBlt(0, 0, bm.bmWidth, bm.bmHeight, &imgDC, 0, 0, SRCCOPY);dc.BitBlt(rcPic.left, rcPic.top, bm.bmWidth, bm.bmHeight, &imgDC, 0, 0, SRCINVERT);dc.BitBlt(rcPic.left, rcPic.top, bm.bmWidth, bm.bmHeight, &maskDC, 0, 0, SRCAND);dc.BitBlt(rcPic.left, rcPic.top, bm.bmWidth, bm.bmHeight, &imgDC, 0, 0, SRCINVERT);imgDC.SelectObject(pOldBmp);maskDC.SelectObject(pOldMaskBmp);bmpMask.DeleteObject();pOldBmp = NULL;pOldMaskBmp = NULL;DeleteDC(imgDC);DeleteDC(maskDC);/游戏对象中添加透明贴图BoolGameObject:LoadImage(CImageList&imgList,UINTbmpID,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;2. 设置定时器void CPlaneGameView:OnTimer(UINT_PTR nIDEvent)/刷新游戏帧画面: 在内存DC上绘图if(m_pMe!=NULL)if(m_pMe-CD0)m_pMe-CD-;UpdateFrame(m_pMemDC);/刷新句柄AI();CView:OnTimer(nIDEvent);SetTimer(1,30,NULL); /设置每30毫秒刷新一次定时器告诉WINDOWS一个时间间隔,然后WINDOWS以此时间间隔周期性出发程序。通常由两种方法来实现:发送WM_TIMER消息和调用应用程序定义的回调函数。3. 获取键盘信息GetKey(int nVirtKey)该函数检取指定虚拟键的状态。该状态指定此键是UP状态,DOWN状态,还是被触发的(开关每次按下此键时进行切换)for(i=0;iSetVerMotion(0);m_pMe-SetHorMotion(0);nMeMotion = GetKey(VK_UP);if(nMeMotion=1)m_pMe-SetVerMotion(1); nMeMotion = GetKey(VK_DOWN);if(nMeMotion=1)m_pMe-SetVerMotion(-1);nMeMotion = GetKey(VK_RIGHT);if(nMeMotion=1)m_pMe-SetHorMotion(1);nMeMotion = GetKey(VK_LEFT);if(nMeMotion=1)m_pMe-SetHorMotion(-1);4. 碰撞检测POSITION mPos1=NULL,mPos2=NULL;for(mPos1=m_ObjListenBomb.GetHeadPosition();(mPos2=mPos1)!=NULL;)Bomb* pBomb = (Bomb*)m_ObjListenBomb.GetNext(mPos1);CRect bRect = pBomb-GetRect();POSITION ePos1=NULL,ePos2=NULL;for(ePos1=m_ObjListenEnemy.GetHeadPosition();(ePos2=ePos1)!=NULL;)Enemy* pEnemy = (Enemy*)m_ObjListenEnemy.GetNext(ePos1);CRect mRect = pEnemy-GetRect();CRect tmpRect;使CRect等于两个现有矩形的交如果交不为空,则返回非零值;否则,如果交为空则返回0。3.2 项目实施 3.2.1 功能需求1.敌机从游戏区域的上下两端进入,左右位置随机2.由计算机控制敌机自动向战机发动攻击3.导弹或炸弹本身的矩形区域和敌机或战机的矩形区域相交时,表示导弹或炸弹射中了战机或敌机4.导弹遇见炸弹时发生爆炸,炸弹被炸毁,导弹和炸弹消失5.导弹遇见敌机时发生爆炸,敌机被炸毁,导弹和敌机消失,分数增加6.炸弹遇到战机时发生爆炸,战机被炸毁,炸弹消失,战机减去生命值,战机生命值为0时,生命数减1,生命数为0时,游戏结束 3.2.2 总体设计游戏功能模块:1.战机,敌机,爆炸效果,战机导弹以及敌机炮弹的贴图模块2.战机方向,速度,键盘控制模块3.战机导弹方向,速度,数量控制模块4.敌机方向,数量,速度控制模块5.敌机子弹方向,速度和数量控制模块6.敌机,子弹以及战机和导弹碰撞检测和爆炸模块7. 战机生命值,得分以及游戏结束控制模块游戏规则子系统模块名称功能简述人工智能人机对战规则的实现游戏子系统模块名称功能简述应用程序对象游戏程序的加载、游戏对象的绘制、游戏规则的调用、玩家的键盘事件获取游戏对象各个游戏对象的抽象父类战机对象战机类敌机对象敌机类导弹对象导弹类炸弹对象炸弹类爆炸对象爆炸类文字对象文字类主要功能是在PlaneView类中,OnTimer函数中实现,将各个类调用,随机产生敌机,子弹的输出,爆炸的实现等等。它的实现图可以如下实现:3.2.3详细设计与编码/ PlaneGameView.cpp : CPlaneGameView 类的实现#include stdafx.h#include PlaneGame.h#include PlaneGameDoc.h#include PlaneGameView.h#include MyPlane.h#include Enemy.h#include Enemy1.h#include Bomb.h#include Ball.h#include Explosion.h#include Nuke.h#include Newbomb.h#include Setlvl.h#include mmsystem.h#include #pragma comment(lib, WINMM.LIB)#ifdef _DEBUG#define new DEBUG_NEW#endifstatic int init;int lvl51=550,1100,2200,2933,3758,4583,5408,6233,7058,7883,8708,9533,10358,11183,12008,12833,13658,14483,15308,16133,16958,17783,18608,19433,20258,21083,21908,22733,23558,24383,25208,26033,26858,27683,28508,29333,30158,30983,31808,32633,33458,34283,35108,35933,36758,37583,38408,39233,40058,40883,41708 ;/ CPlaneGameViewIMPLEMENT_DYNCREATE(CPlaneGameView, CView)BEGIN_MESSAGE_MAP(CPlaneGameView, CView)/ 标准打印命令ON_COMMAND(ID_FILE_PRINT, &CView:OnFilePrint)ON_COMMAND(ID_FILE_PRINT_DIRECT, &CView:OnFilePrint)ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CView:OnFilePrintPreview)ON_WM_TIMER()ON_WM_KEYDOWN()ON_COMMAND(ID_START, &CPlaneGameView:OnStart)ON_COMMAND(ID_RESTART, &CPlaneGameView:OnRestart)ON_COMMAND(ID_SETLVL, &CPlaneGameView:OnSetlvl)END_MESSAGE_MAP()/ CPlaneGameView 构造/析构CPlaneGameView:CPlaneGameView():m_pMe(NULL),lifeNum_Me(10),HPNum_Me(100),Score_Me(0),Lvl_Me(1),Nuke_Me(3), setlvl(1)/ TODO: 在此处添加构造代码CPlaneGameView:CPlaneGameView()BOOL CPlaneGameView:PreCreateWindow(CREATESTRUCT& cs)/ TODO: 在此处通过修改/ CREATESTRUCT cs 来修改窗口类或样式return CView:PreCreateWindow(cs);/ CPlaneGameView 绘制void CPlaneGameView:OnDraw(CDC* pMemDC)CPlaneGameDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);if (!pDoc)return;CDC *m_pMemDC1;m_pMemDC1 = new CDC;m_pMemDC1-CreateCompatibleDC(pMemDC);CBitmap bmp1;bmp1.LoadBitmapW(IDB_START); /创建位图m_pMemDC1-SelectObject(&bmp1);pMemDC-BitBlt(0,0,480,644,m_pMemDC1,0,0,SRCCOPY);DeleteObject(bmp1);delete m_pMemDC1;/ TODO: 在此处为本机数据添加绘制代码/ CPlaneGameView 打印BOOL CPlaneGameView:OnPreparePrinting(CPrintInfo* pInfo)/ 默认准备return DoPreparePrinting(pInfo);void CPlaneGameView:OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)/ TODO: 添加额外的打印前进行的初始化过程void CPlaneGameView:OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)/ TODO: 添加打印后进行的清理过程/ CPlaneGameView 诊断#ifdef _DEBUGvoid CPlaneGameView:AssertValid() constCView:AssertValid();void CPlaneGameView:Dump(CDumpContext& dc) constCView:Dump(dc);CPlaneGameDoc* CPlaneGameView:GetDocument() const / 非调试版本是内联的ASSERT(m_pDocument-IsKindOf(RUNTIME_CLASS(CPlaneGameDoc);return (CPlaneGameDoc*)m_pDocument;#endif /_DEBUGvoid CPlaneGameView:OnStart()/ TODO: 在此添加命令处理程序代码if(!init)InitGame();init = 1;void CPlaneGameView:OnRestart()/ TODO: 在此添加命令处理程序代码KillTimer(1);m_pMe = new CMyPlane;Score_Me=0;lifeNum_Me=10; HPNum_Me=100; Lvl_Me=1;Nuke_Me=3; for(int i = 0; i CreateCompatibleDC(m_pDC);/建立内存位图m_pMemBitmap = new CBitmap;m_pMemBitmap-CreateCompatibleBitmap(m_pDC,GAME_WIDTH,GAME_HEIGHT);/将位图选入内存DCm_pMemDC-SelectObject(m_pMemBitmap);CMyPlane:LoadImage();CEnemy:LoadImage();CEnemy1:LoadImage();CBomb:LoadImage();CBall:LoadImage();CExplosion:LoadImage();CNUKE:LoadImage();CNEWBOMB:LoadImage();/产生主角(战机)m_pMe = new CMyPlane;/启动游戏SetTimer(1,30,NULL);pause = 0;return TRUE;int my = 0;void CPlaneGameView:UpdateFrame(CDC* pMemDC)wchar_t lifeleft20;/存储剩余生命wchar_t Score20;/存储分数wchar_t Lvl20;/存储关卡wchar_t Nuke20;/存储导弹/绘制背景CBitmap bmp;if(m_pMe!=NULL)int pn = (Lvl_Me)%5+1;switch(pn)case 1:bmp.LoadBitmapW(IDB_BACKGROUND1); /创建位图break;case 2:bmp.LoadBitmapW(IDB_BACKGROUND2);break;case 3:bmp.LoadBitmapW(IDB_BACKGROUND3);break;case 4:bmp.LoadBitmapW(IDB_BACKGROUND4);break;case 5:bmp.LoadBitmapW(IDB_BACKGROUND);break;else bmp.LoadBitmapW(IDB_BACKGROUND5);m_pMemDC-SelectObject(&bmp);pMemDC-BitBlt(0,0,480,644,m_pMemDC,10,my,SRCCOPY);if(my0)my-;else if(myDraw(m_pMemDC,FALSE); pMemDC-SetBkMode(TRANSPARENT); wsprintf(lifeleft, L生命值:%d 剩余命数:%d, HPNum_Me,lifeNum_Me ); pMemDC-SetTextColor( RGB(0, 108, 155) ); pMemDC-TextOutW(10,10, lifeleft, _tcslen(lifeleft); wsprintf(Score, L得分:%d, Score_Me ); pMemDC-SetTextColor( RGB(237, 28, 36) ); pMemDC-TextOutW(10,35, Score, _tcslen(Score); wsprintf(Lvl, L关卡:%d, Lvl_Me ); pMemDC-SetTextColor( RGB(137, 50, 66) ); pMemDC-TextOutW(10,60, Lvl, _tcslen(Lvl); wsprintf(Nuke, L导弹:%d, Nuke_Me ); pMemDC-SetTextColor( RGB(137, 50, 66) ); pMemDC-TextOutW(10,85, Nuke, _tcslen(Nuke);else /Game Over/绘制导弹、爆炸、敌机、子弹for(int i=0;iDraw(pMemDC,FALSE)m_ObjListi.RemoveAt(pos2);delete pObj;/复制内存DC到设备DCm_pDC-BitBlt(0,0,GAME_WIDTH,GAME_HEIGHT,m_pMemDC,0,0,SRCCOPY);void CPlaneGameView:AI()static int nCreator = rand() %5+10;if(m_pMe=NULL)return;/随机产生敌机for(int i=0;i=Lvl_Me/2;i+) if(nCreatorCD=0)int tpb = rand()%3;if(tpb%3=0) m_ObjListenNuke.AddTail(new CNUKE);else if(tpb%3=1)m_ObjListenNew.AddTail(new CNEWBOMB);m_pMe-CD = 300;/检测四个方向键,移动战机for(int i=0;iSetVerMotion(0);m_pMe-SetHorMotion(0);nMeMotion = GetKey(VK_UP);if(nMeMotion=1)m_pMe-SetVerMotion(1); nMeMotion = GetKey(VK_DOWN);if(nMeMotion=1)m_pMe-SetVerMotion(-1);nMeMotion = GetKey(VK_RIGHT);if(nMeMotion=1)m_pMe-SetHorMotion(1);nMeMotion = GetKey(VK_LEFT);if(nMeMotion=1)m_pMe-SetHorMotion(-1);/产生战机导弹/if(GetKey(VK_SPACE)=1)/按下了空格键/if(m_pMe!=NULL & m_pMe-Fired()CBomb *bommb = NULL;CPoint pt = m_pMe-GetPoint();switch( CBomb:BombType )case 0: bommb = new CBomb( pt.x + 10, pt.y );m_ObjListenBomb.AddTail(bommb);bommb = new CBomb( pt.x + 20, pt.y );m_ObjListenBomb.AddTail(bommb);bommb = new CBomb( pt.x + 30, pt.y );m_ObjListenBomb.AddTail(bommb);break;case 1: bommb = new CBomb( pt.x + 10, pt.y );bommb-toward = -1;m_ObjListenBomb.AddTail(bommb);bommb = new CBomb( pt.x + 20, pt.y );bommb-toward = 0;m_ObjListenBomb.AddTail(bommb);bommb = new CBomb( pt.x + 30, pt.y );bommb-toward = 1;m_ObjListenBomb.AddTail(bommb);break;PlaySound(LPCTSTR)IDR_WAVE2, AfxGetInstanceHandle(), SND_RESOURCE |SND_ASYNC);/敌机发射子弹CPoint PlanePt = m_pMe-GetPoint();for(POSITION ePos=m_ObjListenEnemy.GetHeadPosition();ePos!=NULL;) CEnemy* pEnemy = (CEnemy*)m_ObjListenEnemy.GetNext(ePos); if(!pEnemy-Fired() continue; CPoint ePt = pEnemy-GetPoint(); BOOL by=FALSE; /敌机在战机前面 if(pEnemy-GetMontion()=1 & ePt.yGetMontion()=-1 & ePt.yPlanePt.y) by= TRUE; if(by & ePt.x = PlanePt.x & ePt.xGetMontion(); /敌机发射子弹CPoint PlanePt1 = m_pMe-GetPoint();for(POSITION ePos=m_ObjListenEnemy1.GetHeadPosition();ePos!=NULL;) CEnemy1* pEnemy1 = (CEnemy1*)m_ObjListenEnemy1.GetNext(ePos); if(!pEnemy1-Fired() continue; CPoint ePt = pEnemy1-GetPoint(); BOOL by=FALSE; /敌机在战机前面 if(pEnemy1-GetMontion()=1 & ePt.yGetMontion()=-1 & ePt.yPlanePt1.y) by= TRUE; if(by & ePt.x = PlanePt1.x & ePt.xGetMontion(); /敌机子弹炸掉战机POSITION bPos1=NULL,bPos2=NULL;CRect mRect = m_pMe-GetRect();for(bPos1=m_ObjListenBall.GetHeadPosition();( bPos2 = bPos1 ) != NULL;)CBall* pBall = (CBall*)m_ObjListenBall.GetNext(bPos1);CRect bRect = pBall-GetRect();CRect tmpRect;if(tmpRect.IntersectRect(&bRect,mRect)/添加爆炸效果m_ObjListenExplosion.AddTail(new CExplosion(mRect.left,mRect.top);PlaySound(LPCTSTR)IDR_WAVE1, AfxGetInstanceHandle(), SND_RESOURCE |SND_ASYNC);/删除子弹m_ObjListenBall.RemoveAt(bPos2);delete pBall;/删除战机HPNum_Me -=5;if ( HPNum_Me GetRect();POSITION ePos1=NULL,ePos2=NULL;for(ePos1=m_ObjListenEnemy.GetHeadPosition();(ePos2=ePos1)!=NULL;)CEnemy* pEnemy = (CEnemy*)m_ObjListenEnemy.GetNext(ePos1);CRect mRect = pEnemy-GetRect();CRect tmpRect;if(tmpRect.IntersectRect(&bRect,mRect)/添加爆炸效果m_ObjListenExplosion.AddTail(new CExplosion(mRect.left,mRect.top);PlaySound(LPCTSTR)IDR_WAVE1, AfxGetInstanceHandle(), SND_RESOURCE |SND_ASYNC);/删除导弹m_ObjListenBomb.RemoveAt(mPos2);delete pBomb;/删除敌机m_ObjListenEnemy.RemoveAt(ePos2);delete pEnemy;Score_Me+=5 ;break;/战机导弹炸掉敌机POSITION qPos1=NULL,qPos2=NULL;for(qPos1=m_ObjListenBomb.GetHeadPosition();(qPos2=qPos1)!=NULL;)CBomb* pBomb = (CBomb*)m_ObjListenBomb.GetNext(qPos1);CRect bRect = pBomb-GetRect();POSITION ePos1=NULL,ePos2=NULL;for(ePos1=m_ObjListenEnemy1.GetHeadPosition();(ePos2=ePos1)!=NULL;)CEnemy1* pEnemy1 = (CEnemy1*)m_ObjListenEnemy1.GetNext(ePos1);CRect mRect = pEnemy1-GetRect();CRect tmpRect;if(tmpRect.IntersectRect(&bRect,mRect)/添加爆炸效果m_ObjListenExplosion.AddTail(new CExplosion(mRect.left,mRect.top); PlaySound(LPCTSTR)IDR_WAVE1, AfxGetInstanceHandle(), SND_RESOURCE |SND_ASYNC);/删除导弹m_ObjListenBomb.RemoveAt(qPos2);delete pBomb;/删除敌机m_ObjListenEnemy1.RemoveAt(ePos2);delete pEnemy1;Score_Me+=5 ;break;/导弹与子弹相撞互毁POSITION bomPos1=NULL,bomPos2=NULL;for(bomPos1=m_ObjListenBomb.GetHeadPosition();(bomPos2 = bomPos1) != NULL;)CBomb* pbBomb = (CBomb*)m_ObjListenBomb.GetNext(bomPos1);CRect bombRect = pbBomb-GetRect();POSITION balPos1=NULL,balPos2=NULL;for(balPos1=m_ObjListenBall.GetHeadPosition();(balPos2 = balPos1)!=NULL;)CBall* pbBall = (CBall*)m_ObjListenBall.GetNext(balPos1);CRect ballRect = pbBall-GetRect();CRect tmpRect;if(tmpRect.IntersectRect(&bombRect,ballRect)/添加爆炸效果m_ObjListenExplosion.AddTail(new CExplosion(bombRect.left,bombRect.top); PlaySound(LPCTSTR)IDR_WAVE1, AfxGetInstanceHandle(), SND_RESOURCE |SND_ASYNC);/删除导弹m_ObjListenBomb.RemoveAt(bomPos2);delete pbBomb;/删除子弹m_ObjListenBall.RemoveAt(balPos2);delete pbBall;break;/检测是否释放炸弹炸掉敌机if(GetKey(VK_SPACE)=1&Nuke_Me0)Nuke_Me-=1;CRect bRect;bRect.top = 0;bRect.left = 0;bRect.right = GAME_WIDTH;bRect.bottom = GAME_HEIGHT;POSITION ePos1=NULL,ePos2=NULL;for(ePos1=m_ObjListenEnemy.GetHeadPosition();(ePos2=ePos1)!=NULL;)CEnemy* pEnemy = (CEnemy*)m_ObjListenEnemy.GetNext(ePos1);CRect mRect = pEnemy-GetRect();CRect tmpRect;if(tmpRect.IntersectRect(&bRect,mRect)Score_Me += 5;/添加爆炸效果m_ObjListenExplosion.AddTail(new CExplosion(mRect.left,mRect.top); PlaySound(LPCTSTR)IDR_WAVE1, AfxGetInstanceHandle(), SND_RESOURCE |SND_ASYNC); /删除敌机m_ObjListenEnemy.RemoveAt(ePos2);delete pEnemy;Sleep(150);/检测是否释放炸弹炸掉敌机if(GetKey(VK_SPACE)=1&Nuke_Me0)CRect bRect;bRect.top

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论