程序设计综合实践实习报告学院名称专业班级学生姓名学号指导教师山东科技大学一、实习题目:飞机大战游戏的设计与实现二、实习时间:18周~ 19周实习地点:三、实习任务:1.基本功能要求:飞机大战游戏必须运用透明贴图、按键处理、定时控制、双缓冲技术等技术实现战机(玩家)和敌机(计算机)对战功能2.扩展功能:在完成基本功能基础上可以增加双人对战、游戏积分制、声音效果、多种子弹类型、客机类型、游戏关卡设计、多种类型敌机、游戏中间结果存贮等功能四、小组分工说明:自己完成五、实习成绩六、指导教师对实习的评语:指导教师(签章):2015年月日目录1.概述 (4)1.1实训项目简介 (4)1.2实训项目功能说明 (4)2.相关技术 (5)2.1透明贴图技术 (5)2.2 获取矩形区域并判断两个矩形区域是否相撞 (5)2.3鼠标控制我方战机 (5)2.4 Windows定时器技术 (6)2.5 CObList链表 (6)2.6对话框的应用 (7)2.7双缓冲技术 (7)3.需求分析 (7)3.1功能需求分析 (7)3.2 数据需求分析 . (7)3.3 行为需求分析 (7)3.4 其他需求 (7)4.总体设计与详细设计 (8)4.1 系统模块划分 (8)4.2 主要功能模块 (8)4.2.1系统主要类图 (8)4.2.2飞机大战游戏设计执行流程图 (8)4.3 扩展功能设计思路 (9)4.4 软件结构设计体会 (9)5.编码实现 (10)5.1绘制游戏背景位图的程序 (10)5.2各个游戏对象的绘制 (10)5.3我方战机位置的动态控制 (12)5.4各个游戏对象碰撞的实现 (13)5.5游戏界面输出当前游戏信息 (15)6.测试情况说明 (17)6.1主要模块测试情况 (17)6.2 主要功能测试情况 (18)7. 实训中遇到的主要问题及解决方法 (19)8.实训收获与体会 (19)1. 概述1.1实训项目简介本次实训项目是应用MFC编程完成一个界面简洁、运行流畅、操作简单、易于上手的飞机大战。
该飞机大战项目运用的主要技术是MFC编程中的一些函数、链表、贴图技术。
1.2实训项目功能说明1.2.1基本功能(1)设定我方战机有速度初值,可通过键盘方向键控制我方战机位置,空格键控制我方战机发射导弹。
(2)游戏界面中敌机出现的位置、敌机导弹的发射是随机的,敌机有不同的速度。
(3)敌机以及敌机发射的导弹,一旦超出游戏界面边界,则删除出界对象。
(4)敌机导弹击中我方战机、我方战机导弹击中敌机、我方战机与敌机碰撞均会产生爆炸效果。
并且产生爆炸效果后,敌机、敌机导弹、我方战机、我方战机导弹消失,我方战机生命值减一,得分加五分。
1.2.2附加功能(1)为游戏界面添加了背景图片。
(2)为游戏设置积分制,每击落一架敌机或与敌机相撞得分加5分。
(3)敌机从游戏界面上界和下界随机飞出。
(4)为游戏设置关卡制,每得分增加100分自动进入下一关,每进入新的一关,通过减缓我方战机速度来逐渐增加游戏难度。
(5)添加无敌模式,当得分达到1000分后,按“Z”键即可开启无敌模式。
开启无敌模式后,我方战机生命值增加到999,并且被敌方战机击中或与敌方战机相撞生命值不减少,击落敌机分数继续增加。
(6)游戏界面显示当前游戏信息,游戏界面左上角分别显示“我的分数、战机生命值、开启无敌模式还需杀敌的数量、关数”,右上角显示“是否开启了无敌模式”,当达到开启无敌模式的条件后,右上角显示“按Z键开启无敌模式”,开启无敌模式后,右上角变为“无敌模式已开启”,右下角显示开启无敌模式需达到的条件,当每进入新的一关,游戏界面中心显示“玩的不错,进入第X关”。
(7)增加鼠标左键控制我方战机发射导弹的功能。
(8)当我方战机炸毁后,弹出对话框提示玩家是否重新开始游戏。
2. 相关技术2.1 透明贴图技术绘制透明位图的关键就是创建一个“掩码”位图(mask bitmap),这个“掩码”位图是一个单色位图,它是位图中图像的一个单色剪影。
(1)DDB可以用MFC中的CBitmap来表示,而DDB一般储存在资源文件中,在加载时只需通过资源ID号就可以将图形装入。
(2)BOOL CBitmap::LoadBitmap(UINT nIDResource)可以装入指定DDB,但是在绘制时必须借助另一个和当前绘图DC兼容的内存DC来进行。
(3)通过CDC::BitBLT()绘制图形,同时指定光栅操作的类型。
2.2 获取矩形区域并判断两个矩形区域是否相撞首先,使用CRect定义一个对象,然后使用GetRect(&对象名)函数,获取界面的矩形区域rect.Width() 为矩形区域的宽度,rect.Height()为矩形区域的高度。
使用IntersectRect(&,&))函数来判断两个源矩形是否有重合的部分。
如果有不为空,则返回非零值;否则,返回0。
2.3鼠标控制我方战机WM_LBUTTONDOWN(鼠标左键被按下)对应的函数为OnLButtonDown (UINT nFlags,CPoint point)当鼠标左键被按下时,我方战机两翼开始发射导弹。
void CPlaneGameView::OnLButtonDown(UINT nFlags, CPoint point){// TODO: 在此添加消息处理程序代码和/或调用默认值CView::OnLButtonDown(nFlags, point);if( is_Pause == 0){CBomb *BombOne=new CBomb( myplane->GetPoint().x+10,myplane->GetPoint().y+35,1);ListBomb.AddTail(BombOne);CBomb *BombTwo=new CBomb( myplane->GetPoint().x+70,myplane->GetPoint().y+35,1);ListBomb.AddTail(BombTwo);}}2.4 Windows定时器技术Windows定时器是一种输入设备,它周期性地在每经过一个指定的时间间隔后就通知应用程序一次。
程序将时间间隔告诉Windows,然后Windows给您的程序发送周期性发生的WM_TIMER消息以表示时间到了。
本程序中使用多个定时器,分别控制不同的功能。
在MFC 的API函数中使用SetTimer()函数设置定时器,设置系统间隔时间,在OnTimer()函数中实现响应定时器的程序。
2.5 CObList链表MFC类库中提供了丰富的CObList类的成员函数,在CPlaneGameView.h文件中声明各游戏对象与游戏对象链表:(1)创建各游戏对象://创建各游戏对象CMyPlane *myplane;CEnemy *enemy;CBomb *bomb;CBall *ball;CExplosion *explosion;(2)创建储存各游戏对象的游戏链表://创建存储游戏对象的对象链表CObList ListEnemy;CObList ListMe;CObList ListBomb;CObList ListBall;CObList ListPeople;CObList ListExplosion;2.6对话框的应用当我方战机炸毁时,弹出是否重新开始游戏的对话框。
对话框的应用过程如下:(1)资源视图下,添加Dialog对话框。
然后添加使用到的控件,并修改控件的ID。
(2)为对话框添加类,在对话框模式下,点击项目,添加类。
(3)在类视图中,为对话框类添加成员变量(控件变量)。
设置变量的名称、类型、最值等信息。
(4)在资源视图菜单中,选择相应的菜单项,右击添加时间监听程序,设置函数处理程序名称。
(5)在处理程序函数中添加相应的信息。
2.7双缓冲技术当数据量很大时,绘图可能需要几秒钟甚至更长的时间,而且有时还会出现闪烁现象,为了解决这些问题,可采用双缓冲技术来绘图。
双缓冲即在内存中创建一个与屏幕绘图区域一致的对象,先将图形绘制到内存中的这个对象上,再一次性将这个对象上的图形拷贝到屏幕上,这样能大大加快绘图的速度。
双缓冲实现过程如下:1、在内存中创建与画布一致的缓冲区2、在缓冲区画图3、将缓冲区位图拷贝到当前画布上4、释放内存缓冲区3.需求分析● 3.1功能需求分析基本功能:键盘控制战机移动、发射导弹,战机、敌机爆炸拓展功能:游戏界面背景,鼠标控制战机发射导弹,积分制,过关制,对话框弹出,无敌模式● 3.2 数据需求分析我的分数、战机生命值、击落敌机数目、关数实时显示。
● 3.3 行为需求分析键盘方向键控制战机移动,空格键控制战机发射导弹,鼠标左键控制战机发射导弹,键位之间互不冲突,战机移动不卡顿。
● 3.4 其他需求游戏界面简洁,游戏操作简单易于上手。
4.总体设计与详细设计4.1 系统模块划分游戏系统模块模块名称功能简介应用程序对象游戏程序的加载、游戏对象的绘制、游戏规则的调用、玩家的键盘事件获取我方战机对象战机类敌机对象敌机类我方战机导弹对象我方战机导弹类敌机炸弹对象敌机炸弹类爆炸对象爆炸类4.2 主要功能模块4.2.1系统主要类图4.2.2飞机大战游戏设计执行流程图. 除实现最基本的人工智能对战功能之外,还增加人性化的设计,使游戏的可玩性更高。
4.3 扩展功能设计思路1、为游戏添加背景,是游戏更加美观。
2、为使画面更能实时显示当前游戏信息,为游戏界面添加“我的分数”、“战机生命”、“关数”等实时变化的信息。
3、为使游戏更具可玩性,为游戏添加无敌模式。
4.4 软件结构设计体会软件结构设计部分是软件工程开发过程的重要部分,设计内容的好坏关系到整个软件的优劣,在这次飞机大战项目开发中,对结构设计中出现的种种问题以及解决方法,加深了对软件结构设计方法的理解,熟悉了对其的应用,从宏观和细节处展示了整个软件的体系结构,使整个软件更具层次感。
5. 编码实现5.1绘制游戏背景位图的程序CDC *pDC = GetDC();//获得矩形区域对象CRect rect;GetClientRect(&rect);//设备环境对象类----CDC类。
CDC cdc;//内存中承载临时图像的位图CBitmap bitmap1;//该函数创建一个与指定设备兼容的内存设备上下文环境(DC)cdc.CreateCompatibleDC(pDC);//该函数创建与指定的设备环境相关的设备兼容的位图。
bitmap1.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height());//该函数选择一对象到指定的设备上下文环境中,该新对象替换先前的相同类型的对象。