C++实训报告飞机大战.docx

上传人:b****3 文档编号:11167292 上传时间:2023-05-29 格式:DOCX 页数:40 大小:145.49KB
下载 相关 举报
C++实训报告飞机大战.docx_第1页
第1页 / 共40页
C++实训报告飞机大战.docx_第2页
第2页 / 共40页
C++实训报告飞机大战.docx_第3页
第3页 / 共40页
C++实训报告飞机大战.docx_第4页
第4页 / 共40页
C++实训报告飞机大战.docx_第5页
第5页 / 共40页
C++实训报告飞机大战.docx_第6页
第6页 / 共40页
C++实训报告飞机大战.docx_第7页
第7页 / 共40页
C++实训报告飞机大战.docx_第8页
第8页 / 共40页
C++实训报告飞机大战.docx_第9页
第9页 / 共40页
C++实训报告飞机大战.docx_第10页
第10页 / 共40页
C++实训报告飞机大战.docx_第11页
第11页 / 共40页
C++实训报告飞机大战.docx_第12页
第12页 / 共40页
C++实训报告飞机大战.docx_第13页
第13页 / 共40页
C++实训报告飞机大战.docx_第14页
第14页 / 共40页
C++实训报告飞机大战.docx_第15页
第15页 / 共40页
C++实训报告飞机大战.docx_第16页
第16页 / 共40页
C++实训报告飞机大战.docx_第17页
第17页 / 共40页
C++实训报告飞机大战.docx_第18页
第18页 / 共40页
C++实训报告飞机大战.docx_第19页
第19页 / 共40页
C++实训报告飞机大战.docx_第20页
第20页 / 共40页
亲,该文档总共40页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

C++实训报告飞机大战.docx

《C++实训报告飞机大战.docx》由会员分享,可在线阅读,更多相关《C++实训报告飞机大战.docx(40页珍藏版)》请在冰点文库上搜索。

C++实训报告飞机大战.docx

C++实训报告飞机大战

软件开发生产

实习报告

姓名

XXX

学号

XXXXXX

班级

XXXX

项目名称

飞机大战游戏

实习地点

XXX

实习时间

XXX

实习成绩

指导教师签字

信息科学与工程学院

2014年10月6日

软件开发生产实习报告

1.实习目的

1.1使学生全面了解软件项目实施的过程,理解软件企业对于程序员的基本素质和技术能力要求。

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

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

1.4使学生掌握快速学习新知识、新技术方法,培养良好的分析问题和解决问题的能力

1.5重点提高学生的编程能力,使学生建立正确的编程理念,养成规范的编程习惯。

2.实习计划

2.1C++语言知识复习,尤其是指针的安全和类型转换继承的使用、多态的使用。

2.2项目技术学习:

Windows窗体消息机制、透明绘图、游戏对象的面向对象分析和设计、API使用,参考相应的书籍详尽的学习。

2.3WindowsAPI编程基础练习,实现简单的透明贴图,即把战机图片贴到屏幕上。

2.4读懂老师给的游戏项目技术架构设计、游戏对象的面向对象分析和设计、UML建模,同时把其余的图片包括敌机、子弹、爆炸效果登都贴到屏幕上。

2.5项目编码、测试(包括讲师演练)、完成基本功能,主要实现战机的控制移动、敌机的随机出现并移动和敌机发射子弹等。

2.6项目迭代,完成扩展功能,把本项目的功能(尤其是人工智能部分)实现。

2.7全部代码测试并改进,尽可能好的完善项目。

3.实习过程

3.1技术准备

提高程序编写能力,提高程序调试能力,资料检索、阅读能力,强大的自学能力,加深对面向对象程序设计的理解。

具体说来,需要掌握指针的安全和类型转换,继承和组合的区别、继承的使用,多态的使用,GDI的应用以及UML建模,了解游戏编程架构、Win32API编程。

再具体来说:

3.1.1透明贴图实现技术

绘制透明位图的关键就是创建一个“掩码”位图(maskbitmap),这个“掩码”位图是一个单色位图,它是位图中图像的一个单色剪影。

在详细介绍实现过程之前先介绍下所使用的画图函数以及函数参数所代表的功能;整个绘制过程需要使用到BitBlt()函数。

整个功能的实现过程如下:

(1)创建一张大小与需要绘制图像相同的位图作为“掩码”位图;

(2)将新创建的“掩码”位图存储至掩码位图的设备描述表中;

(3)把位图设备描述表的背景设置成“透明色”,不需要显示的颜色;

(4)复制粘贴位图到“掩码”位图的设备描述表中,这个时候“掩码”位图设备描述表中存放的位图与位图设备描述表中的位图一样;

(5)把需要透明绘制的位图与对话框绘图相应区域的背景进行逻辑异或操作绘制到对话框上;

(6)把“掩码”位图与这个时候对话框相应区域的背景进行逻辑与的操作;

(7)重复步骤5的操作,把需要透明绘制的位图与对话框绘图相应区域的背景进行逻辑异或操作绘制到对话框上;

(8)最后把系统的画笔还给系统,删除使用过的GDIObject,释放非空的指针,最后把新建的设备描述表也删除。

BOOLCGameObject:

:

LoadImage(CImageList&imgList,UINTbmpID,

COLORREFcrMask,intcx,intcy,intnInitial)

{

CBitmapbmp;

if(!

bmp.LoadBitmap(bmpID))

returnFALSE;

if(!

imgList.Create(cx,cy,ILC_COLOR24|ILC_MASK,nInitial,0))

returnFALSE;

imgList.Add(&bmp,crMask);

returnTRUE;

}

3.1.2CObList链表

在本程序中我使用了CObList链表来分别存储敌机,炸弹,导弹,爆

炸效果和掉落物品。

CobList类似于一个双向链表,POSITION类型的变量

为链表的键。

使用POSITION变量,既可以作为链表循环中的循环变量,

也可以作为标记某个位置的标签。

我们可以通过获得某元素的

POSITION来访问它。

本程序中主要用到的函数有:

GetHeadPosition()——获取链表首元素的POSITION,AddTail()——向链表尾部添加新的元素,GetNext(POSITION&rPosition)——返回当前rPosition指向的元素,并使rPosition指向下一个元素。

3.1.3内存释放

在VC/MFC用CDC绘图时,频繁的刷新,屏幕会出现闪烁的现象,CPU时间占用率相当高,绘图效率极低,很容易出现程序崩溃。

及时的释放程序所占用的内存资源是非常重要的。

在程序中使用到的链表、刷子等占用内存资源的对象都要及时的删除。

DeleteBrush,List.removeall()等。

3.1.4双缓冲技术

当数据量很大时,绘图可能需要几秒钟甚至更长的时间,而且有时还会出现闪烁现象,为了解决这些问题,可采用双缓冲技术来绘图。

双缓冲实现过程如下:

在内存中创建与画布一致的缓冲区  

在缓冲区画图  

将缓冲区位图拷贝到当前画布上  

释放内存缓冲区

下面给出实现的程序,同样是在OnDraw(CDC*pDC)中:

 CDCMemDC;//定义一个显示设备对象   

CBitmapMemBitmap;//定义一个位图对像

MemDC.CreateCompatibleDC(NULL);

MemBitmap.CreateCompatibleBitmap(MemDC,nWidth,nHeight);//将位图选入到内存显示设备中

CBitmap*pOldBit=MemDC.SelectObject(&MemBitmap);

MemDC.FillSolidRect(0,0,nWidth,nHeight,RGB(255,255,255));    

MemDC.MoveTo(……); 

MemDC.LineTo(……); 

pDC->BitBlt(0,0,nWidth,nHeight,&MemDC,0,0,SRCCOPY);

MemDC.SelectObject(pOldBit);

MemBitmap.DeleteObject(); 

MemDC.DeleteDC(); 

3.1.5键盘对战机的控制

添加OnKeyDown()和OnKeyUp()函数,用GetKeyState()函数来判断按下了哪个键,通过修改战机的相应参数来实现对战机的控制,如上下左右运动,发射子弹等等。

如果战机此时已处于屏幕边缘,则控制战机飞出屏幕的按键信息无效。

3.2项目实施

按照项目实施计划和技术准备一步一步去实现项目。

3.2.1功能需求

本程序为飞机大战游戏,飞机大战游戏作为PC中一款桌面游戏,界面简洁流畅、游戏方式简单,玩起来易于上手。

主要实现的功能如下:

1.战机数量为1

2.由玩家通过键盘控制(方向键控制位置、默认开启炸弹、空格键发射清屏导弹)战机

3.导弹释放存在间隔,有一定的运行速度

4.导弹遇到敌机发生爆炸,敌机被炸毁,导弹消失,玩家得分,当得分到达一定数目就进入下一关

5.由计算机控制敌机自动向战机发动攻击,击中时战机掉血,初始20条命

6.敌机数量随机,计算机生成敌机时随机选择类别

7.敌机从游戏区域的上端进入,左右位置随机

8.敌机行驶期间,不左右移动,不反向移动

9.当敌机位于战机后方时发射炸弹对战机进行攻击

10.敌机运行线路为直线,方向为从下至上,或从下至上,不可左右移动,纵向由发射位置起至游戏区域结束

11.敌机与敌机炸弹均具有一定的速度,且随着关卡难度的增大,数量和速度均增加

12.炸弹遇到战机时发生爆炸,战机生命数量减少1,炸弹消失,游戏结束炸弹运行时有速度限制

13.游戏过程中会随机掉落物品,得到后可以变换子弹或者得到全屏炸弹

14.根据菜单可以选择重新开始游戏,Esc键可以暂停游戏

15.可以在选择关卡处选择关卡

16.在游戏界面输出当前游戏进行信息,包括当前得分、当前关卡以及剩余生命数量

17.游戏过程中添加了声效

3.2.2总体设计

3.2.2.1系统模块划分

游戏规则子系统

模块名称

功能简述

人工智能

人机对战规则的实现

游戏子系统

模块名称

功能简述

应用程序对象

游戏程序的加载、游戏对象的绘制、游戏规则的调用、玩家的键盘事件获取

游戏对象

各个游戏对象的抽象父类

战机对象

战机类

敌机对象

敌机类

导弹对象

导弹类

炸弹对象

炸弹类

爆炸对象

爆炸类

文字对象

文字类

物品对象

物品类

类体系

3.2.2.2主要功能模块

系统对象类图

飞机大战游戏执行流程图:

 

产生敌机并绘制敌机流程图:

3.2.3详细设计与编码

//PlaneGameView.cpp:

implementationoftheCPlaneGameViewclass

//

#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"Setlvl3.h"

#include"mmsystem.h"//windows中与多媒体有关的大多数接口,用于播放声音。

#pragmacomment(lib,"WINMM.LIB")

#ifdef_DEBUG

#definenewDEBUG_NEW

#undefTHIS_FILE

staticcharTHIS_FILE[]=__FILE__;

#endif

 

staticintinit;

intlvl[31]={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};

/////////////////////////////////////////////////////////////////////////////

//CPlaneGameView

IMPLEMENT_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()

/////////////////////////////////////////////////////////////////////////////

//CPlaneGameViewconstruction/destruction

CPlaneGameView:

:

CPlaneGameView():

m_pMe(NULL),lifeNum_Me(20),Score_Me(0),Lvl_Me

(1),Nuke_Me(5),setlvl

(1)

{

//TODO:

addconstructioncodehere

}

CPlaneGameView:

:

~CPlaneGameView()

{

}

BOOLCPlaneGameView:

:

PreCreateWindow(CREATESTRUCT&cs)

{

//TODO:

ModifytheWindowclassorstylesherebymodifying

//theCREATESTRUCTcs

returnCView:

:

PreCreateWindow(cs);

}

/////////////////////////////////////////////////////////////////////////////

//CPlaneGameViewdrawing

 

voidCPlaneGameView:

:

OnDraw(CDC*pDC)

{

CPlaneGameDoc*pDoc=GetDocument();

ASSERT_VALID(pDoc);//断定宏

if(!

pDoc)//如果不是文档类指针

return;

//绘制游戏开始界面

CDC*m_pMemDC1;//为绘图提供成员函数

m_pMemDC1=newCDC;//为绘图申请内存空间

m_pMemDC1->CreateCompatibleDC(pDC);

CBitmapbmp1;

bmp1.LoadBitmap(IDB_start);//创建位图

m_pMemDC1->SelectObject(&bmp1);

pDC->BitBlt(0,0,480,644,m_pMemDC1,0,0,SRCCOPY);

DeleteObject(bmp1);

deletem_pMemDC1;//释放内存

}

/////////////////////////////////////////////////////////////////////////////

//CPlaneGameViewprinting

BOOLCPlaneGameView:

:

OnPreparePrinting(CPrintInfo*pInfo)

{

//defaultpreparation

returnDoPreparePrinting(pInfo);

}

voidCPlaneGameView:

:

OnBeginPrinting(CDC*/*pDC*/,CPrintInfo*/*pInfo*/)

{

//TODO:

addextrainitializationbeforeprinting

}

voidCPlaneGameView:

:

OnEndPrinting(CDC*/*pDC*/,CPrintInfo*/*pInfo*/)

{

//TODO:

addcleanupafterprinting

}

/////////////////////////////////////////////////////////////////////////////

//CPlaneGameView诊断

#ifdef_DEBUG

voidCPlaneGameView:

:

AssertValid()const

{

CView:

:

AssertValid();

}

voidCPlaneGameView:

:

Dump(CDumpContext&dc)const

{

CView:

:

Dump(dc);

}

CPlaneGameDoc*CPlaneGameView:

:

GetDocument()//非调试版本是内联的

{

ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CPlaneGameDoc)));

return(CPlaneGameDoc*)m_pDocument;

}

#endif//_DEBUG

 

voidCPlaneGameView:

:

OnStart()

{

//TODO:

在此添加命令处理程序代码

if(!

init)

{

InitGame();

init=1;

}

}

voidCPlaneGameView:

:

OnRestart()//重新开始

{

//TODO:

在此添加命令处理程序代码

if(init==0)

{

OnStart();

}

else

{

KillTimer

(1);

m_pMe=newMyPlane;//重新申请内存空间

Score_Me=0;

lifeNum_Me=20;

Lvl_Me=1;

Nuke_Me=5;

for(inti=0;i<7;i++)

m_ObjList[i].RemoveAll();//删除链表中所有的元素

SetTimer(1,30,NULL);

}

}

voidCPlaneGameView:

:

OnInitialUpdate()

{

CView:

:

OnInitialUpdate();

//TODO:

在此添加专用代码和/或调用基类

//初始化游戏

}

voidCPlaneGameView:

:

StopGame()//清除指针

{

deletem_pMe;

deletem_pMemDC;

deletem_pDC;

deletem_pMemBitmap;

}

BOOLCPlaneGameView:

:

InitGame()//初始化游戏

{

CRectrc;

GetClientRect(rc);

//产生随机数种子

srand((unsigned)time(NULL));

//建立设备DC

m_pDC=newCClientDC(this);

//建立内存DC

m_pMemDC=newCDC;

m_pMemDC->CreateCompatibleDC(m_pDC);

//建立内存位图

m_pMemBitmap=newCBitmap;

m_pMemBitmap->CreateCompatibleBitmap(m_pDC,GAME_WIDTH,GAME_HEIGHT);//将位图选入到内存显示设备中

//将位图选入内存DC

m_pMemDC->SelectObject(m_pMemBitmap);

MyPlane:

:

LoadImage();

Enemy:

:

LoadImage();

Enemy1:

:

LoadImage();

Bomb:

:

LoadImage();

Ball:

:

LoadImage();

Explosion:

:

LoadImage();

Nuke:

:

LoadImage();

Newbomb:

:

LoadImage();

//产生主角(战机)

m_pMe=newMyPlane;

//启动游戏

SetTimer(1,30,NULL);

pause=0;//暂停标志:

0->继续1->暂停

returntrue;

}

intmy=0;//移动背景标志

voidCPlaneGameView:

:

UpdateFrame(CDC*pDC)

{

wchar_tlifeleft[20];//存储剩余生命

wchar_tScore[20];//存储分数

wchar_tLvl[20];//存储关卡

wchar_tNuke[20];//存储导弹

//绘制背景

CBitmapbmp;

if(m_pMe!

=NULL)

{

intpn=(Lvl_Me)%5+1;

switch(pn)

{

case1:

bmp.LoadBitmap(IDB_background1);//创建位图

break;

case2:

bmp.LoadBitmap(IDB_background2);

break;

case3:

bmp.LoadBitmap(IDB_background3);

break;

case4:

bmp.LoadBitmap(IDB_background4);

break;

case5:

bmp.LoadBitmap(IDB_background5);

break;

}

m_pMemDC->SelectObject(&bmp);

pDC->BitBlt(0,0,480,644,m_pMemDC,10,my,SRCCOPY);

if(my>0)

my--;

elseif(my<=0)

my=644;

}

else

{

if(Lvl_Me<31)

{

bmp.LoadBitmap(IDB_win);

}

else

{

bmp.LoadBitmap(IDB_win);

}

m_pMemDC->SelectObject(&bmp);

my=0;

pDC->BitBlt(0,0,480,644,m_pMemDC,10,my,SRCCOPY);

}

//绘制我方战机

if(m_pMe!

=NULL)

{

m_pMe->Draw(m_pMemDC,FALSE);

pDC->SetBkMode(TRANSPARENT);//透明文字背景

pDC->SetTextColor(RGB(0,255,0));

pDC->TextOut(10,10,"生命值:

");

wsprintfW(lifeleft,L"%d",lifeNum_Me);

pDC->SetTextColor(RGB(255,0,0));

pDC->TextOut(80,10,lifeleft);

pDC->SetTextColor(RGB(0,255,0));

pDC->TextOut(10,35,"得分:

");

wsprintfW(Score,L"%d",Score_Me);

pDC->SetTe

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 小学教育 > 语文

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2