C++实训报告——飞机大战
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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 系统模块划分
实现。 2.7 全部代码测试并改进,尽可能好的完善项目。
3.实习过程
3.1 技术准备 提高程序编写能力,提高程序调试能力,资料检索、阅读能力,强大的
自学能力,加深对面向对象程序设计的理解。具体说来,需要掌握指针的安 全和类型转换,继承和组合的区别、继承的使用,多态的使用,GDI 的应用 以及 UML 建模,了解游戏编程架构、Win32 API 编程。再具体来说:
3.1.1 透明贴图实现技术 绘制透明位图的关键就是创建一个“掩码”位图(mask bitmap),这
个“掩码”位图是一个单色位图,它是位图中图像的一个单色剪影。 在详细介绍实现过程之前先介绍下所使用的画图函数以及函数参数
所代表的功能;整个绘制过程需要使用到 BitBlt()函数。整个功能的实现 过程如下:
游戏规则子系统Biblioteka Baidu
模块名称
功能简述
人工智能
人机对战规则的实现
游戏子系统
模块名称
功能简述
应用程序对象
游戏程序的加载、游戏对象的绘制、游戏规则的调用、玩
家的键盘事件获取
游戏对象
各个游戏对象的抽象父类
战机对象 敌机对象 导弹对象 炸弹对象 爆炸对象 文字对象 物品对象
类体系
战机类 敌机类 导弹类 炸弹类 爆炸类 文字类 物品类
当数据量很大时,绘图可能需要几秒钟甚至更长的时间,而且有时还 会出现闪烁现象,为了解决这些问题,可采用双缓冲技术来绘图。 双缓冲实现过程如下:
在内存中创建与画布一致的缓冲区 在缓冲区画图
将缓冲区位图拷贝到当前画布上 释放内存缓冲区 下面给出实现的程序,同样是在 OnDraw(CDC *pDC)中: CDC MemDC; //定义一个显示设备对象 CBitmap MemBitmap;//定义一个位图对像 MemDC.CreateCompatibleDC(NULL);
3.2.2.2 主要功能模块 系统对象类图
飞机大战游戏执行流程图:
产生敌机并绘制敌机流程图:
3.2.3 详细设计与编码
// PlaneGameView.cpp : implementation of the CPlaneGameView class //
#include "stdafx.h"
#include "PlaneGame.h" #include "PlaneGameDoc.h" #include "PlaneGameView.h"
(1) 创建一张大小与需要绘制图像相同的位图作为“掩码”位图; (2) 将新创建的“掩码”位图存储至掩码位图的设备描述表中; (3) 把位图设备描述表的背景设置成“透明色”,不需要显示的颜 色; (4) 复制粘贴位图到“掩码”位图的设备描述表中,这个时候“掩 码”位图设备描述表中存放的位图与位图设备描述表中的位图一样; (5) 把需要透明绘制的位图与对话框绘图相应区域的背景进行逻辑 异或操作绘制到对话框上; (6) 把“掩码”位图与这个时候对话框相应区域的背景进行逻辑与 的操作; (7) 重复步骤 5 的操作,把需要透明绘制的位图与对话框绘图相应区 域的背景进行逻辑异或操作绘制到对话框上; (8) 最后把系统的画笔还给系统,删除使用过的 GDIObject,释放非 空的指针,最后把新建的设备描述表也删除。 BOOL CGameObject::LoadImage(CImageList& imgList,UINT bmpID,
在 VC/MFC 用 CDC 绘图时,频繁的刷新,屏幕会出现闪烁的现象,CPU 时间占用率相当高,绘图效率极低,很容易出现程序崩溃。及时的释放程 序所占用的内存资源是非常重要的。在程序中使用到的链表、刷子等占用 内存资源的对象都要及时的删除。Delete Brush,List.removeall()等。 3.1.4 双缓冲技术
} 3.1.2 CObList 链表
在本程序中我使用了 CObList 链表来分别存储敌机,炸弹,导弹,爆 炸效果和掉落物品。CobList 类似于一个双向链表,POSITION 类型的变量 为链表的键。使用 POSITION 变量,既可以作为链表循环中的循环变量, 也可以作为标记某个位置的标签。我们可以通过获得某元素的 POSITION 来访问它。本程序中主要用到的函数有:GetHeadPosition() ——获取链表首元素的 POSITION,AddTail()——向链表尾部添加新的 元素,GetNext( POSITION& rPosition )——返回当前 rPosition 指向的 元素,并使 rPosition 指向下一个元素。 3.1.3 内存释放
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)
软件开发生产 实习报告
姓名 班级 实习地点 实习成绩
XXX XXXX XXX
学号 项目名称 实习时间 指导教师签字
XXXXXX 飞机大战游戏
XXX
信息科学与工程学院
2014 年 10 月 6 日
软件开发生产实习报告
1. 实习目的
1.1 使学生全面了解软件项目实施的过程,理解软件企业对于程序员的基本 素质和技术能力要求。 1.2 使学生掌握 C++及 Window 程序设计的基本技术,能够运用 MFC 技术及其 开发环境进行小型项目的开发。 1.3 重点培养学生的独立创新精神和查阅资料能力,提高其口头和书面的沟 通能力。 1.4 使学生掌握快速学习新知识、新技术方法,培养良好的分析问题和解决 问题的能力 1.5 重点提高学生的编程能力,使学生建立正确的编程理念,养成规范的编 程习惯。
#ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif
static int init; int lvl[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,2 2733,23558,24383,25208}; ////////////////////////////////////////////////////////////////////////// /// // CPlaneGameView
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.由玩家通过键盘控制(方向键控制位置、默认开启炸弹、空格键 发射清屏导弹)战机
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;
#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 中与多媒体有关的大多数接口,用于播放声音。 #pragma comment(lib, "WINMM.LIB")
END_MESSAGE_MAP()
2. 实习计划
2.1 C++语言知识复习,尤其是指针的安全和类型转换继承的使用、多态的 使用。 2.2 项目技术学习:Windows 窗体消息机制、透明绘图、游戏对象的面向对 象分析和设计、API 使用,参考相应的书籍详尽的学习。 2.3 Windows API 编程基础练习,实现简单的透明贴图,即把战机图片贴 到屏幕上。 2.4 读懂老师给的游戏项目技术架构设计、游戏对象的面向对象分析和设 计、UML 建模,同时把其余的图片包括敌机、子弹、爆炸效果登都贴到屏幕 上。 2.5 项目编码、测试(包括讲师演练)、完成基本功能,主要实现战机的控 制移动、敌机的随机出现并移动和敌机发射子弹等。 2.6 项目迭代,完成扩展功能,把本项目的功能(尤其是人工智能部分)