计算机专业毕业论文-电脑游戏飞机大战的开发与设计

计算机专业毕业论文-电脑游戏飞机大战的开发与设计

2023年7月29日发(作者:)

毕业设计(论文)

题 目: 飞机大战游戏的设计与开发

学 院: 计算机科学学院

专业班级: 电子信息科学与技术11级1班

指导教师: 职称: 副教授

学生姓名:

学 号:

摘 要

飞机游戏是一款风靡全球的电视机游戏和掌上游戏机产品,曾几何时,它创造了一个无法企及的游戏巅峰,也曾影响了一代产业链。虽然它辉煌的业绩在历史的涡轮中渐渐远去,但这款游戏每每提及,总会令人爱不释手,魂牵梦绕。

这款游戏的名字叫做飞机大战,它是运行于Windows操作系统下的一款2D游戏,以C/C++为开发语言,构建于Microsoft Foundation Class Library(MFC)框架体系中,其中调用了部分的Win32API函数接口,在Visual Studio2010环境下开发的一款多媒体游戏。

随着硬件性能的不断提高,游戏的日益普及,使开发者不再需要过多的关注不同的硬件设备。本论文着眼于双缓冲绘图的运用,开发出仅用于理论研究的二维平面射击类游戏。

本文首先分析了电脑游戏的发展历史,然后分析了制作游戏的基本流程和游戏本身所要包含的几种元素以及游戏应具备的游戏层次。根据2D游戏的特点和游戏的角色,以及给用户呈现的游戏界面的特效,对2D图形技术,Windows 图形界面编程技术GDI,DirectDraw的显卡接口和DirectSound声卡接口以及MVC设计模式下的MFC框架等技术进行了比较仔细的研究。通过自定义一个游戏类CGame,封装了游戏元素的基本属性和行为,这样便于在用到游戏的行为操作是,只要轻松的产生CGame对象便可直接调用其方法,也有利于升级为双人游戏,乃至网络版时,只需要在该类中添加相应的行为便可。当我们向用户呈现游戏运行的界面时,通过Timer时钟控件,映射到相应的处理函数,使得游戏界面大约每2秒钟刷新一下界面,这样才能让一张位图背景图片具有动态效果。当使用DirectSound声卡接口时,我方和敌方相互射击所发出的声音,都是在时钟映射函数调用时处理的。

【关键词:】C/C++; VS 2010/MFC; 飞机大战游戏

I

ABSTRACT

Airplane game is a popular global TV game and handheld game products, once

upon a time, it creates a game out of reach peak, have influenced a generation of

industrial chain. Although it brilliant performance in the history of turbine faded

away, but the game is often mentioned always miss.

The game's name is , it is running on Windows operating systems, a 2 d

game, with C/C + + as development language, building on the Microsoft

Foundation Class Library MFC framework, which invokes the part Win32API

function interface, in the Visual Studio 2010 environment using DirectX software

development kit SDK to develop a multimedia game.

With the constant improvement of the hardware performance, the rising

popularity of the game, DirectX development kit update and perfect, make

developers don't need too much attention to different hardware devices. The use of

this thesis focus on DirectSound, DirectDraw, developed only due to the theoretical

research of two-dimensional plane shooting game.

This article first analyzes the development history of computer games, and

then analyze the basic process of making game and the game itself need to include

what kind of elements and the game should have level. According to the

characteristics of the 2 d game and game role, and to the user interface rendering

effects, the technology of 2 d graphics, the graphics interface and DirectSound

DirectDraw sound card interface and MFC framework of MVC design mode to

compare the careful research. Through a custom game CGame class, encapsulates

the basic attribute of game elements and behavior, so easy to use in the game

operation, as long as easy to produce the CGame object can be directly to call its

methods, but also to when upgraded to a double game, online version, just need

to add the proper behavior in the class. When we present game operation interface to

the user, by the Timer clock control that is mapped to the corresponding processing

function, makes the game about every 2 seconds refresh interface, in this way can

we make a bitmap background picture with dynamic effect. When using DirectSound

sound card interface, we and the noise made by enemy fire, are on the clock

whenprocessing the mapping function call.

KEY WORDS: C/C + +; VS 2010/MFC; plane war game

II 目 录

第1章 绪论........................................................ 1

1.1 系统研究的背景及意义........................................ 1

1.2 国内外的发展现状............................................ 1

1.4 本文的组织结构.............................................. 2

1.5 本章小结.................................................... 2

第2章 游戏的相关知识和系统开发平台的阐述........................... 3

2.1游戏基本流程概述 ............................................ 3

2.2游戏系统元素阐述 ............................................ 4

2.3开发环境和相关技术的概述 .................................... 5

2.3.1 开发环境.............................................. 5

2.3.2 相关技术.............................................. 5

2.4本章小结 ................................................... 10

第3章 游戏分析................................................... 11

3.1 用户功能需求分析........................................... 11

3.2 系统性能要求............................................... 12

3.3可行性分析 ................................................. 12

3.4本章小结 ................................................... 13

第4章 游戏设计................................................... 14

4.1游戏整体设计 ............................................... 14

4.1.1 整体结构............................................. 14

4.1.2 游戏对战规则......................................... 14

4.2游戏界面设计 ............................................... 15

4.2.1游戏起始界面设计 ..................................... 15

4.2.2游戏运行界面设计 ..................................... 17

4.2.3游戏结束界面设计 ..................................... 17

4.3游戏功能设计 ............................................... 18

4.3.1双缓冲绘图 ........................................... 19

4.3.2功能实现 ............................................. 19

4.4本章小结 ................................................... 26

第5章 系统测试................................................... 27

5.1软件测试基础理论 ........................................... 27I

5.1.1 软件测试定义......................................... 27

5.1.2 软件测试基本概念..................................... 27

5.2软件测试目的 ............................................... 27

5.3软件测试方法分类 ........................................... 28

5.3.1 静态测试与动态测试................................... 28

5.3.2 黑盒白盒与白盒测试................................... 28

5.3.3 单元测试、集成测试、系统测试、验证测试和确认测试..... 29

5.4论坛测试 ................................................... 29

5.4.1 测试用例设计要求..................................... 29

5.5测试用例 ................................................... 30

5.6测试结果 ................................................... 30

5.6本章小结 ................................................... 31

第6章 工作总结................................................... 32

致谢............................................................... 33

参考文献........................................................... 34

附录1 ............................................................. 35

I 第1章 绪论

第1章 绪论

1.1 系统研究的背景及意义

当今社会是一个信息社会,一个知识经济的年代。自从世界上第一台计算机ENIAC于1946年问世到现在,计算机业飞速发展。随着以全球信息网络普及和全球信息共享为标志的“全球信息网络革命”的蓬勃兴起,世界已然进入在计算机信息管理领域的激烈竞争的时代,计算机,自然而然的变成了人们生活中必不可少的一部分。

过去,人们只要是借助电影,电视,音乐等方式来娱乐。而今天,以游戏为代表的电子娱乐正成为主流娱乐方式。因为CPU以及显卡等设备的高速发展,为人们开发出更加炫目多彩的游戏提供了可能。时代的发展,社会的进步,科学技术正以日新月异的速度飞速的向前发展。计算机技术的发展更是迅速而且广泛。可以说,计算机已经涉及到现代绝大部分行业。目前纷繁复杂的游戏软件比比皆是,无论在线的网路游戏还是桌面游戏,二维的还是三维立体空间的,多由单机版游戏孕育而来。学习简单的单机版游戏的制作,有利于初学者了解到游戏制作的理念。目前不论是在国内还是世界范围内,游戏产业都如雨后的春笋,蓬勃发展,越来越多更具娱乐性的游戏产品被开发出来,这其中在众多的游戏开发工具中,Microsoft的Visual Studio系列被认为是当今世界最强大的游戏开发软件之一。其代表作:魔兽争霸系列、星际争霸系列、帝国时代系列等等等等,几乎所有的大作都有VS的功劳。因此掌握了VS的应用,不但是掌握了一种优秀的开发工具,对于今后参加大型团队的游戏项目开发也具有一定的帮助。本设计通过开发一个单机版的射击类游戏,有一定的娱乐性很值得一试。通过制作这样一个软件,可以加深对游戏设计思想的了解,也可以进一步熟悉编程工具的应用,更可以给我们的生活带来更多的趣味。通过该设计,我将更好的了解windows消息机制,更深的体会到利用Visual Studio/MFC开发windows程序的优越性。

1.2 国内外的发展现状

96,97年的国产游戏产品是单机版的游戏,在当时的市场上虽然品质和档次不如外来产品,但也占有一定的市场,例如《仙剑奇侠传》、《三国志》等系列带有鲜明中国特色与气息的游戏在市场上掀起了一波高潮。1998年联众与中国游1 西安工程大学学士学位论文

戏中心等老牌的游戏平台的推出标志着电脑游戏在中国的开荒与生根。但是到了1999年在没有形成主流产品的情况下,政策不明朗,包括开发资金出现问题等原因国产游戏开始走下坡路。一直到了2000年,网络游戏问世并且很快流行起来我国的游戏行业才又渐渐的复苏,但是由于投入差距太大,起步晚等原因与外国游戏相对而言并没有竞争力。

时至今日,网络游戏走入盛世,成为了一部分人休闲娱乐的主要行为。国内网易、腾讯、九城、完美等公司百花齐放,国产网游渐渐走入国际市场,而且基于网络的发展真正实现了网络全球化,网络游戏也是遍布全球,全球同玩一款游戏的现象比比皆是。大量海外游戏走入中国市场,电脑游戏百花纷呈,随着经济的进步,计算机科技的发展,这一现象将愈演愈烈。

1.4 本文的组织结构

第1章 绪论 本章主要介绍了课题的研究背景,课题研究的目的与意义,以及该项目所在领域国内外发展状况等,最后指出了本文工作内容及论文的组织结构。

第2章 游戏相关知识和系统开发平台的阐述 本章主要介绍了整个游戏中的流程表述和开发所用语言以及开发平台的介绍与说明。

第3章 游戏分析 本章主要分析了游戏的可行性,游戏对系统性能的要求以及用户对功能的需求。

第4章 游戏设计 本章是本文比较重要的章节,总体描述了游戏规则以及游戏开发中各项功能的实现方法,游戏界面的设计,最后对整个项目的包结构和项目资源路径做了简单的剖析和介绍。

第5章 系统测试 详细介绍了测试的概念,并对本项目进行测试。

第6章 总结。

1.5 本章小结

详细介绍了电脑游戏开发的国内外现状,以及本论文主要研究的方向和论文的整体结构,从本章中能够清楚的了解本论文的整体架构,对以后的各细节描述都有清晰的认识。

2 第2章 游戏的相关知识和系统开发平台的阐述

第2章 游戏的相关知识和系统开发平台的阐述

2.1游戏基本流程概述

一个游戏基本上是一个连续的循环,它完成一系列的逻辑操作,并在屏幕上绘制图像,具体流程如下:

(1)初始化:在这一步中,游戏程序执行标准初始化操作,如内存分配、资源采集、从磁盘载入数据等等,这和其他Windows应用程序一样。

(2)进入游戏循环:在这一步中,游戏代码将进入游戏主循环,此时各种游戏动作和情节开始运行,直到当接受到用户退出游戏的命令。

(3)获取玩家的输入信息: 在这一步中,游戏玩家的输入信息被处理或缓存,以备下一步人工智能和游戏逻辑使用。

(4)执行人工智能和游戏逻辑:这部分包括了游戏代码的主体,诸如执行人工智能、物理系统和常规的游戏逻辑,其结果用于渲染下一帧图像。

(5)渲染下一帧图像: 游戏的输入和第四步中游戏人工智能和游戏逻辑执行的结果,被用来产生游戏的下一帧。这个图像通常放在不可见的缓存区内,因此玩家不会看到它逐渐被渲染的过程随后该图像被迅速拷贝到显示存储器中并显示出来。

(6)同步显示:通常由于游戏复杂程序不同,游戏在计算机上运行的速度会不一。使用定时器和等待函数确保游戏和最大帧同步,通常认为30FPS(帧/秒)是可以接受的最低速率,而大多数动作玩家将他们的图形调整到不大于60FPS。

(7)循环:返回到游戏的入口并重新执行上述全部步骤。

(8)关闭:这一步游戏结束,表示将退出主程序或游戏循环,并回到操作系统。然而,在用户进行结束之前,用户必须释放所有的资源并清理系统。

游戏基本流程简图如下:

3 西安工程大学学士学位论文

初始化 ●分配内存 ●装载文件 ●构建表格退出?主事件循环调用窗口事件并初始化计时处理窗口事件清除 ●再分配 ●关闭文件获取玩家信息键盘循环返回操作系统主逻辑 ●人工智能 ●碰撞检测 ●物理系统时间同步锁定为30帧/秒后备画面内存●●●●○●●●●复制图像用以显示等待将下一帧画面渲染到后备缓存●●●●○●●●●

图2-1 游戏基本流程图

2.2游戏系统元素阐述

游戏元素是指各类游戏的基本构成要素,该项目主要是侧重射击类游戏,那么其中主要包括4中元素:

(1)游戏界面:人物造型、战斗场地、动画效果等,当玩家在进行游戏时,界面的效果,风格将会在第一时间告诉给玩家,这是游戏的大致轮廓,其中主要包括以下2点:图形技术:2D和3D图形技术;游戏视角:第一人称视角,第三人称视角,俯视角。

(2)游戏创意:游戏的创作意义,新奇,惊人,震撼,实效,有较突出的独立性。

(3)可玩性:有较强的可玩性,情绪 风格 精神这三个 方面 特征 。可玩性是玩家和乐趣之间的沟通桥梁,,不仅体现在单机玩家和电脑对抗中,也体现在4 西安工程大学学士学位论文

多人多角色的竞争中,良好的可玩性是游戏是否能够占领市场的作用之一。

(4)游戏声音:游戏声音常常用于渲染气氛,烘托游戏的乐趣,使得游戏不显得匮乏无力。用于给予听觉上的反馈,例如音效,背景音乐,对话等,高品质的音乐可以达到争强游戏的表现力的效果。

2.3开发环境和相关技术的概述

2.3.1 开发环境

操作系统:XP,Win7

程序语言:C++

开发包:MFC

IDE:Visual Studio 2010

2.3.2 相关技术

2.3.2.1 C++ 语言特点

C++是在C语言的基础上开发的一种通用编程语言.应用广泛。C++支持多种编程范式 --面向对象编程、泛型编程和过程化编程。最新正式标准C++14于2014年8月18日公布。其编程领域众广.常用于系统开发.引擎开发等应用领域.是至今为止最受广大受用的最强大编程语言之一.支持类:类、封装、重载等!

计算机诞生初期.人们要使用计算机必须用机器语言或汇编语言编写程序。世界上第一种计算机高级语言是诞生于1954年的FORTRAN语言。之后出现了多种计算机高级语言.其中使用最广泛、影响最大的当推BASIC语言和C语言。BASIC语言是1964年由 Dartmouth 学院 John G. Kemeny 与 Thomas E. Kurtz

两位教授在FORTRAN语言的基础上简化而成的. 适用于初学者设计的小型高级语言;C语言是1972年由美国贝尔实验室的e所开发.采用结构化编程方法.遵从自顶向下的原则。[2] 在操作系统和系统使用程序以及需要对硬件进行操作的场合.用C语言明显优于其它高级语言.但在编写大型程序时.C语言仍面临着挑战。

1983年.贝尔实验室的Bjarne Stroustrup在C语言基础上推出了C++[1] 。

C++进一步扩充和完善了C语言.是一种面向对象的程序设计语言。

C++这个名字是Rick Mascitti于1983年中所建议的.并于1983年12月首次5 西安工程大学学士学位论文

使用。更早以前.尚在研究阶段的发展中语言曾被称为“new C”.之后是“C with

Class”[3] 。在计算机科学中.C++仍被称为C语言的上层结构。它最后得名于C语言中的“++”操作符(其对变量的值进行递增)。而且在共同的命名约定中.使用“+”以表示增强的程序。Stroustrup说:“这个名字象征着源自于C语言变化的自然演进”。

注:C+是一个和C/C++无关的早期编程语言。

Rick Mascitti在1992年被非正式地问起名字的由来.他表示这是在半开玩笑中说出的。他从没想过C++会成为这门语言的正式名字。有一个关于C++名字的笑话.当你使用后缀++时.赋值发生在加运算之后(因此.它应该是++C.而不是C++.这个笑话是说时下某些程序员还在以使用C的方式使用C++.这通常被一些权威著作认为是不正确的)。

在“C with Class”阶段.研制者在C语言的基础上加进去的特征主要有:类及派生类、共有和私有成员的区分、类的构造函数和析构函数、友元、内联函数、赋值运算符的重载等。

1985年公布的C++语言1.0版的内容中又添加了一些重要特征:虚函数的概念、函数和运算符的重载、引用、常量(constant)等。

1989年推出的2.0版形成了更加完善的支持面向对象程序设计的C++语言.新增加的内容包括:类的保护成员、多重继承、对象的初始化与赋值的递归机制、抽象类、静态成员函数、const成员函数等。

1993年的C++语言3.0版本是C++语言的进一步完善.其中最重要的新特征是模板(template).此外解决了多重继承产生的二义性问题和相应的构造函数与析构函数的处理等。

1998年C++标准(ISO/IEC14882 Standard for the C++ Programming

Language)得到了国际标准化组织(ISO)和美国标准化协会(ANSI)的批准.标准C++语言及其标准库更体现了C++语言设计的初衷。名字空间的概念、标准模板库(STL)中增加的标准容器类、通用算法类和字符串类型等使得C++语言更为实用。此后C++是具有国际标准的编程语言.该标准通常简称ANSI C++或ISO C++ 98标准.以后每5年视实际需要更新一次标准。

后来又在2003年通过了C++标准第二版(ISO/IEC 14882:2003):这个新版本是一次技术性修订.对第一版进行了整理——修订错误、减少多义性等.但没有改变语言特性。这个版本常被称为C++03。[2]

此后.新的标准草案叫做C++ 0x。对于C++ 0x标准草案的最终国际投票已于2011年8月10日结束.并且所有国家都投出了赞成票.C++0x已经毫无疑义地成6 西安工程大学学士学位论文

为正式国际标准。先前被临时命名为C++0x的新标准正式定名为ISO/IEC

14882:2011.简称ISO C++ 11标准。C++ 11标准将取代现行的C++标准C++98和C++03。国际标准化组织于2011年9月1日出版发布《ISO/IEC 14882:2011》.名称是:Information technology -- Programming languages -- C++ Edition: 3。

虽然.C++到目前为止.已经出现了很多年.但由于它的稳定性和强大的功能等.在系统开发.引擎开发等应用领域.是至今为止最受广大受用的最强大编程语言之一。

2.3.2.2 MFC介绍

MFCMicrosoft Foundation Classes,是一个微软公司提供的类库(class

libraries),以C++类的形式封装了Windows的API,并且包含一个应用程序框架,以减少应用程序开发人员的工作量。其中包含的类包含大量Windows句柄封装类和很多Windows的内建控件和组件的封装类。MFC是WinAPI与C++的结合。API,即微软提供的Windows下应用程序的编程语言接口,是一种软件编程的规范,但不是一种程序开发语言本身,可以允许用户使用各种各样的第三方如我是一方,微软是一方,Borland就是第三方的编程语言来进行对Windows下应用程序的开发,使这些被开发出来的应用程序能在Windows下运行,比如VB、VC++、JAVA、Delhpi。编程语言函数本质上全部源于API,因此用它们开发出来的应用程序都能工作在Windows的消息机制和绘图里,遵守Windows作为一个操作系统的内部实现,这其实也是一种必要。微软如果不提供API,这个世上对Windows编程的工作就不会存在,微软的产品就会迅速从时尚变成垃圾。上面说到MFC是微软对API函数的专用C++封装,这种结合一方面让用户使用微软的专业C++

SDK来进行Windows下应用程序的开发变得容易,因为MFC是对API的封装,微软做了大量的工作,隐藏了好多程序开发人员在Windows下用C++ & MFC编制软件时的大量内节,如应用程序实现消息的处理、设备环境绘图,这种结合是以方便为目的的,必定要付出一定代价这是微软的一向作风,因此就造成了MFC对类封装中的一定程度的的冗余和迂回,但这是可以接受的。MFC是微软封装了的API。什么意思呢?Windows作为一个提供功能强大的应用程序接口编程的操作系统,的确方便了许多程序员,传统的win32开发(直接使用Windows的接口函数API)对于程序员来说非常的困难,因为,API函数实在太多了,而且名称很乱,从零构架一个窗口动辄就是上百行的代码。MFC是面向对象程序设计与Application framework的完美结合,它将传统的API进行了分类封装,并且为你创建了程序的一般框架。

7 西安工程大学学士学位论文

2.3.2.3 关于Visual Studio 2010

Visual Studio是微软公司推出的开发

环境.是目前最流行的Windows平台应用程序开发环境。Visual Studio 2010版本于2010年4月12日上市.其集成开发环境(IDE)的界面被重新设计和组织.变得更加简单明了。Visual Studio 2010同时带来了 NET Framework 4.0、Microsoft

Visual Studio 2010 CTP( Community Technology Preview--CTP).并且支持开发面向Windows 7的应用程序。除了Microsoft SQL Server.它还支持 IBM DB2和Oracle数据库。

发展溯源

Dev-C++灵活又小巧.C++ Builder开发效率高;Turbo C是万人迷.Visual

Studio的资格老。可如今.江湖上只剩下最后一个大佬Visual Studio了.其他几位不是支

持者渐少.不成气候.就是转投他人怀抱.中道衰落.让人难免生出几分遗憾。但是反过来.我们又对Visual Studio这位“江湖最后的大佬”增添了几分敬仰之情。据说这位老大又要出新的版本了.这些江湖八卦者.哪有错过的道理。要想深入的了解一个人.需要从他的童年开始。想了解Visual Studio.故事也就要从它的1.0开始。

Visual Studio 可以用来创建Windows平台下的 Windows应用程序和网络应用程序.也可以用来创建网络服务、智能设备应用程序和 Office插件。[1]

1992年4月.微软发布了革命性的操作系统Windows 3.1.把个人计算机引进了真正的视窗时代。微软在原有C++开发工具Microsoft C/C++ 7.0的基础上.开创性地引进了MFC(Microsoft Foundation Classes)库.完善了源代码.成为Microsoft

C/C++ 8.0.也就是Visual C++1.0.并于1992年发布。Visual C++ 1.0是真正意义上的Windows IDE.这也是Visual Studio的最初原型。虽然以现在的眼光来看.这个界面非常简陋和粗糙.但是它脱离了DOS界面.让用户可以在图形化的界面下进行开发.把软件开发带入了可视化(Visual)开发的时代。从此.大佬的时代开始了。

重大突破

1998 年.微软公司发布了 Visual Studio 6.0。所有开发语言的开发环境版本均升至 6.0。这也是 Visual Basic 最后一次发布.从下一个版本 (7.0) 开始.Microsoft Basic 进化成了一种新的面向对象的语言:Microsoft Basic. NET。由于微软公司对于 Sun 公司 Java 语言扩充导致与 Java虚拟机不兼容而 被Sun

告上法庭.微软在后续的 Visual Studio 中不再包括面向 Java 虚拟机的开发环境。

8 西安工程大学学士学位论文

2002 年.随着 .NET 口号的提出与 Windows XP / Office XP 的发布.微软发布了 Visual Studio .NET(内部版本号为 7.0)。在这个版本的 Visual Studio 中.微软剥离了 Visual FoxPro 作为一个单独的开发环境以 Visual FoxPro 7.0 单独销售.同时取消了 Visual InterDev。与此同时.微软引入了建立在 .NET 框架上(版本1.0)的托管代码机制以及一门新的语言 C# (读作 C Sharp.意为 C++++)。C# 是一门建立在 C++ 和 Java 基础上的现代语言.是编写 .NET 框架的语言。

.NET 的通用语言框架机制(Common Language Runtime. CLR).其目的是在同一个项目中支持不同的语言所开发的组件。所有 CLR 支持的代码都会被解释成为 CLR 可执行的机器代码然后运行。

Visual Basic、Visual C++ 都被扩展为支持托管代码机制的开发环境.且Visual

Basic .NET更是从 Visual Basic 脱胎换骨.彻底支持面向对象的编程机制。而Visual J++也变为 Visual J#。后者仅语法同 Java 相同.但是面向的不是 Java虚拟机.而是 .NET Framework。

2003 年.微软对 Visual Studio 2002 进行了部分修订.以 Visual Studio 2003

的名义发布(内部版本号为 7.1)。Visio 作为使用统一建模语言(UML)架构应用程序框架的程序被引入.同时被引入的还包括移动设备支持和企业模版。.NET

框架也升级到了 1.1。

2005 年.微软发布了 Visual Studio 2005。.NET 字眼从各种语言的名字中被抹去.但是这个版本的 Visual Studio 仍然还是面向 .NET 框架的(版本2.0)。它同时也能开发跨平台的应用程序.如开发使用微软操作系统的手机的程序等。总体来说是一个非常庞大的软件.甚至包含代码测试功能。

这个版本的 Visual Studio 包含有众多版本.分别面向不同的开发角色。同时还永久提供免费的 Visual Studio Express 版本。

使用Visual Studio 2005. 专业开发人员能够: 创建满足关键性要求的多层次的智能客户端、Web、移动或基于Microsoft Office的应用程序。

使用改进后的可视化设计工具、编程语言和代码编辑器.享受高效率的开发环境。

在统一的开发环境中.开发并调试多层次的服务器应用程序。

使用集成的可视化数据库设计和报告工具.创建SQL Server 2005解决方案。

使用Visual Studio SDK创建可以扩展Visual Studio IDE的工具。

Microsoft为单独工作或在小型团队中的专业开发人员提供了两种选择.Visual Studio 2005 Professional Edition和用于Microsoft Office系统的Visual

Studio 2005工具。每种版本都在标准版的特性上进行了扩展.包括用于远程服务9 西安工程大学学士学位论文

程序开发和调试、SQL Server2005开发的工具.以及完整的、没有限制的开发环境。每种产品都可以单独购买或打包定购。

专业开发人员喜欢自由的使用.NET Framework 2.0.它是一种稳健的、功能齐备的开发环境.支持创建扩展Visual Studio集成开发环境的工具。

2.4本章小结

本章主要介绍了游戏开发的基本流程和重要元素同时写明了本系统的技术构架,并简单的介绍了本项目开发所使用的语言以及平台。为以后的开发打下了坚实的基础。

10 第3章 游戏分析

第3章 游戏分析

3.1 用户功能需求分析

由于本程序简单易操作,交互性好,对用户没什么特别要求。一般用户经过几分钟练系都可以熟悉本游戏的规则如图3-1和3-2所示。

图3-1 游戏界面示例图

11 西安工程大学学士学位论文

图3-2 游戏界面示例图

3.2 系统性能要求

1.实时性

本应用为手机游戏因此对于用户的操作必须做出立即响应,否则本游戏即为失败。

2.易操作性

单机手机游戏的最大特点即为易操作性,用户在不看说明的情况下也能够玩,并且在玩过几遍之后即熟悉本游戏的规则。这是本应用对于操作性的要求。

3.3可行性分析

12 西安工程大学学士学位论文

1.技术可行性

本游戏以C/C++语言为基础,以Visual Studio 2010(简称vs)为开发平台。通过微软提供的MFC框架实现的飞机射击游戏。C++,是在C语言的基础上发展而来,C++保留了C语言的所有优点,增加了面向对象的机制。C++面向对象编程语言具有如下4个基本特征:抽象,继承,封装,多态。MFC,微软基础类Microsoft Foundation Classes,实际上是微软提供的,用于在C++环境下编写应用程序的一个框架和引擎,VC++是Windows下开发人员使用的专业程序C++ 开发包的SDK ,MFC就是挂在它之上的一个辅助软件开发包,MFC作为与VS血肉相连的部分MFC是Win API与C++的结合,API,即微软提供的WINDOWS下应用程序的编程语言接口,是一种软件编程的规范,但不是一种程序开发语言本身,可以允许用户使用各种各样的第三方。MFC是微软对API函数的专用C++封装,这种结合一方面让用户使用微软的专业C++ SDK来进行Win下应用程序的开发变得容易,因为MFC是对API的封装,微软做了大量的工作,隐藏了好多程序开发人员在Win下用C++ & MFC编制软件时的大量内节,如应用程序实现消息的处理,设备环境绘图,这种结合使得应用程序开发人员开发更加方便了,产品的开发周期大大降低,效率提高了。

2.操作可行性分析

本游戏以传统的C/S为体系结构,对用户的计算机硬件没有什么特别的要求,也不需要用户具有较高的计算机水平。只需一台安装了XP/win7等操作环境,声卡和显卡功能正常。

3.4本章小结

在本章,将项目对系统的需求,对玩家的需求以及项目的可行性进行了深入浅出的分析,确定本项目在技术上可行,在操作上也可行。

13 第4章 游戏设计

第4章 游戏设计

4.1游戏整体设计

4.1.1 整体结构

正方:玩家。具有自动打出的子弹,子弹打到敌机次数足够则摧毁敌机,击毁敌机越多,所得分数越高。如果与敌机发成碰撞则炸毁,结束游戏。

反方:电脑本身,即敌机。敌机分为大、中、小三种。其出现的位置是随机的,随着玩家得分的上涨,出现的频率加大。不同敌机生命值不同,体形越大的敌机具有生命值越多(即被子弹打中次数更多才会坠毁)。

背景:本游戏的背景设置是动态的,利用时钟控件,实现通过移动位图背景来映射飞机的前进飞行。

游戏的整体结构,如图4-1所示。

飞机大战正方(玩家)

反方(电脑)背景计分图4-1 游戏界面示例图

4.1.2 游戏对战规则

正方:

游戏开始后玩家通过电脑键盘按键↑↓和←→自由控制飞机飞行方向,飞机会以固定的时间间隔进行射击(射击间隔为0.2S),玩家通过击毁对面飞来的飞机(即敌机)来获取分数,如果与敌机发生碰撞则炸毁,结束游戏。

14 西安工程大学学士学位论文

反方:

由电脑本身进行控制,敌机会出现在靠上的随机位置(通过随机函数实现),当我方子弹击毁时会出现炸毁特效。小、中、大三款敌机出现频率由高到低,但是随着玩家分数的上升出现的频率会提高。三款飞机的生命值多少也不同,随着体积的增大生命值增多。击毁不同飞机玩家获得的分数也是按体积大小依次提升。

4.2游戏界面设计

4.2.1游戏起始界面设计

通过MFC的绘图功能将ps制作而成的素材以像素为坐标依次绘入界面。素材如下:

15 西安工程大学学士学位论文

项目运行后将自动进入起始界面,如图4-2所示。

16

图4-2进入起始界面图 西安工程大学学士学位论文

4.2.2游戏运行界面设计

选择开始游戏(start)后自进入游戏界面,并立即开始游戏,如图4-3所示。

图4-3界面运行图

4.2.3游戏结束界面设计

17 西安工程大学学士学位论文

当玩家操控的飞机炸毁时进入游戏结束界面,并显示玩家所得分数,如图4-4所示。

图4-4 游戏结束面图

4.3游戏功能设计

18 西安工程大学学士学位论文

4.3.1双缓冲绘图

双缓冲即在内存中创建一个与屏幕绘图区域一致的对象,先将图形绘制到内存中的这个对象上,再一次性将这个对象上的图形拷贝到屏幕上,这样能大大加快绘图的速度。

在图形图象处理编程过程中,双缓冲是一种基本的技术。我们知道,如果窗体在响应WM_PAINT消息的时候要进行复杂的图形处理,那么窗体在重绘时由于过频的刷新而引起闪烁现象。解决这一问题的有效方法就是双缓冲技术。因为窗体在刷新时,总要有一个擦除原来图象的过程OnEraseBkgnd,它利用背景色填充窗体绘图区,然后在调用新的绘图代码进行重绘,这样一擦一写造成了图象颜色的反差。当WM_PAINT的响应很频繁的时候,这种反差也就越发明显。于是我们就看到了闪烁现象。

我们会很自然的想到,避免背景色的填充是最直接的办法。但是那样的话,窗体上会变的一团糟。因为每次绘制图象的时候都没有将原来的图象清除,造 成了图象的残留,于是窗体重绘时,画面往往会变的乱七八糟。所以单纯的禁止背景重绘是不够的。我们还要进行重新绘图,但要求速度很快,于是我们想到了使用 BitBlt函数。它可以支持图形块的复制,速度很快。我们可以先在内存中作图,然后用此函数将做好的图复制到前台,同时禁止背景刷新,这样就消除了闪

烁。以上也就是双缓冲绘图的基本的思路。

4.3.2功能实现

1.自动出现敌机实现:

本游戏中敌机位置均从最上方开始,但横向位置随机出现,起实现过程如下(敌机的某一种实现过程):

if(m_time%m_flivverFallSpeed == 0) //随着游戏时间变长,敌机出现频率加快

{

i = 0;

while(m_flivverPoint[i].y<800 && i<60) //如果此对象代表的敌机已被击毁,则跳过

{

i++;

}

m_flivverPoint[i].x = 5+20*(rand()%22); //横向位置随机出现

m_flivverPoint[i].y = -30;

}

for(i=0; i<60; i++)

{

19 西安工程大学学士学位论文

if(m_flivverPoint[i].y < 800) //如果对象所代表的敌机在屏幕范围内则向下移动四个像素

{

m_flivverPoint[i].y += 4;

}

}

2.碰撞检测实现:

检测所有子弹的位置是否移动到敌机机身范围内,如果子弹已移动到机身范围内,则输出这个敌机爆炸的画面,并在得分上加上相应的分数,其实现过程如下:

for(i=0; i<10; i++)

{

for(j=0; j<60; j++)

{

if((m_cartridgePoint[i].x>=m_flivverPoint[j].x &&

m_cartridgePoint[i].x<=m_flivverPoint[j].x+50) &&

(m_cartridgePoint[i].y+20>=m_flivverPoint[j].y &&

m_cartridgePoint[i].y+20<=m_flivverPoint[j].y+30)) //检测子弹与1号敌机的碰撞

{

k = 0;

while(m_boomPoint1[k].y < 800)

{

k++;

}

m_boomPoint1[k].x = m_flivverPoint[j].x;

m_boomPoint1[k].y = m_flivverPoint[j].y;

m_boomFlag1[k] = 1;

m_flivverPoint[j].y = 800;

m_cartridgePoint[i].y = -10;

score += 1000;

}

}

if((m_cartridgePoint[i].x>=m_flivverPoint2.x &&

m_cartridgePoint[i].x<=m_flivverPoint2.x+90) &&

(m_cartridgePoint[i].y+20>=m_flivverPoint2.y &&

m_cartridgePoint[i].y+20<=m_flivverPoint2.y+110)) //检测子弹与2号敌机的碰撞

{

m_cartridgePoint[i].y = -10;

m_flvver2Flag ++;

}

20 西安工程大学学士学位论文

if(m_flvver2Flag == 25) //被击中25次则被击毁

{

k = 0;

while(m_boomPoint1[k].y < 800)

{

k++;

}

m_boomPoint1[k].x = m_flivverPoint2.x;

m_boomPoint1[k].y = m_flivverPoint2.y;

m_boomFlag1[k] = 1;

while(m_boomPoint1[k].y < 800)

{

k++;

}

m_boomPoint1[k].x = m_flivverPoint2.x;

m_boomPoint1[k].y = m_flivverPoint2.y + 50;

m_boomFlag1[k] = 1;

while(m_boomPoint1[k].y < 800)

{

k++;

}

m_boomPoint1[k].x = m_flivverPoint2.x + 45;

m_boomPoint1[k].y = m_flivverPoint2.y;

m_boomFlag1[k] = 1;

m_flivverPoint2.y = 800;

m_flvver2Flag = 0;

score += 5000;

}

if((m_cartridgePoint[i].x>=m_flivverPoint3.x &&

m_cartridgePoint[i].x<=m_flivverPoint3.x+110) &&

(m_cartridgePoint[i].y+20>=m_flivverPoint3.y &&

m_cartridgePoint[i].y+20<=m_flivverPoint3.y+170)) //检测子弹与3号敌机的碰撞

{

m_cartridgePoint[i].y = -10;

m_flvver3Flag ++;

}

if(m_flvver3Flag == 80) //被击中80次则被击毁

21 西安工程大学学士学位论文

k = 0;

while(m_boomPoint1[k].y < 800)

{

k++;

}

m_boomPoint1[k].x = m_flivverPoint3.x;

m_boomPoint1[k].y = m_flivverPoint3.y;

m_boomFlag1[k] = 1;

while(m_boomPoint1[k].y < 800)

{

k++;

}

m_boomPoint1[k].x = m_flivverPoint3.x + 60;

m_boomPoint1[k].y = m_flivverPoint3.y;

m_boomFlag1[k] = 1;

while(m_boomPoint1[k].y < 800)

{

k++;

}

m_boomPoint1[k].x = m_flivverPoint3.x;

m_boomPoint1[k].y = m_flivverPoint3.y + 50;

m_boomFlag1[k] = 1;

while(m_boomPoint1[k].y < 800)

{

k++;

}

m_boomPoint1[k].x = m_flivverPoint3.x + 60;

m_boomPoint1[k].y = m_flivverPoint3.y + 50;

m_boomFlag1[k] = 1;

while(m_boomPoint1[k].y < 800)

{

k++;

}

m_boomPoint1[k].x = m_flivverPoint3.x + 45;

m_boomPoint1[k].y = m_flivverPoint3.y + 100;

m_boomFlag1[k] = 1;

22

{

西安工程大学学士学位论文

}

}

m_flivverPoint3.y = 800;

m_flvver3Flag = 0;

score += 10000;

3.游戏画面绘制:

BITMAP pBitMap1,pBitMap2;

m_map(&pBitMap1);

m_map(&pBitMap2);

m_lidRect(rc,RGB(255,255,255)); 设置背景色

if(m_bgPlace <= 300) //绘制背景

{

m_hBlt(0,m_bgPlace*ht/300,(),(),&m_dcBg1,0,0,

h,(300-m_bgPlace)*ht/300,SRCCOPY);

//(100-m_bgPlace)/100*ht

m_(0,0,(),(),&m_dcBg2,0,(300-m_bgPlace)*ht/300,SRCCOPY);

}

else

{

m_hBlt(0,(m_bgPlace-300)*ht/300,(),(),&m_dcBg2,0,0,

h,(600-m_bgPlace)*ht/300,SRCCOPY);

//(100-m_bgPlace)/100*ht

m_(0,0,(),(),&m_dcBg1,0,(600-m_bgPlace)*ht/300,SRCCOPY);

}

m_(&m_dcMem,0,m_mePoint,ILD_TRANSPARENT); //绘制自己23

CRect rc;

GetClientRect(rc); //获取对话框大小 西安工程大学学士学位论文

战机

for(int i=0; i<10; i++)

{

m_imgCartridge[i].Draw(&m_dcMem,0,m_cartridgePoint[i],ILD_TRANSPARENT); //绘制子弹

}

for (int i = 0; i<60; i++)

{

m_imgFlivver[i].Draw(&m_dcMem,0,m_flivverPoint[i],ILD_TRANSPARENT);

//绘制1号敌机

}

m_(&m_dcMem,0,m_flivverPoint2,ILD_TRANSPARENT); //绘制2号敌机

m_(&m_dcMem,0,m_flivverPoint3,ILD_TRANSPARENT); //绘制3号敌机

for (int i = 0; i<20; i++)//绘制敌机爆炸画面

{

m_imgBoom1[i].Draw(&m_dcMem,0,m_boomPoint1[i],ILD_TRANSPARENT);

m_imgBoom2[i].Draw(&m_dcMem,0,m_boomPoint2[i],ILD_TRANSPARENT);

}

CString str;

(_T("%08d"),score);

m_tColor(RGB(128,128,128));

m_ode(TRANSPARENT);

TextOut(m_eHdc(),20,15,str,gth()); //在画面上显示得分

Invalidate(); //强制重绘

4.定时器的设计

在定时器中每隔30ms调用一次生成敌机函数、60ms发出一颗子弹、30ms移动一次背景、30ms检测一次子弹是否打中敌机、30ms检测一次游戏是否结束(自己有没有被撞毁)、30ms重绘一次,其实现过程如下所示:

24 西安工程大学学士学位论文

m_bgPlace = ++m_bgPlace%601; //移动背景,模拟飞机飞行场景

m_cartridgeFlag = ++m_cartridgeFlag%2;

int count = 0;

Game();

if(m_cartridgeFlag%2 == 1)//发出一个子弹

{

int k = 0;

while(m_cartridgePoint[k].y>-20)

{

k++;

}

if(k<10)

{

m_cartridgePoint[k].x = m_mePoint.x + 28;

m_cartridgePoint[k].y = m_mePoint.y + 20;

count++;

}

}

for(int i=0; i<10; i++) //子弹向前移动

{

if(m_cartridgePoint[i].y > -20)

{

m_cartridgePoint[i].y -= 40;

}

}

Flivver(); //产生1号敌机

m_time++;

Flivver2(); //产生2号敌机

Flivver3(); //产生3号敌机

Boom(); //击中敌机检测

if(m_time%100 == 0) //加快敌机产生速度

{

if(m_flivverFallSpeed > 5)

{

m_flivverFallSpeed--;

}

}

if(!m_game) //检测游戏是否结束

{

KillTimer(m_uTimer);

25 西安工程大学学士学位论文

}

DrawContent(); //重绘游戏画面

4.4本章小结

本章清晰的描述出了游戏的整体结构以及游戏规则,又将整个设计进行了深入剖析,同时详细的解释了项目中的核心技术内容和思想,并且将游戏中的各种功能的实现进行了分块描述。

26 第5章 系统测试

第5章 系统测试

5.1软件测试基础理论

5.1.1 软件测试定义

软件测试是根据软件开发各阶段的规格说明和程序的内部结构而精心设计的一批测试用例,并利用这些测试用例运行程序以及发现错误的过程,即执行测试步骤。

软件测试就是在软件投入运行前,对软件需求分析、设计规格说明和编码实现的最终审查,它是软件质量保证的关键步骤。

5.1.2 软件测试基本概念

1、测试的含义

所谓测试,首先是一项活动,在这项活动中某个系统或组成的部分将在特定的条件下运行,结果将被观察和记录,并对系统或组成部分进行评价。测试活动有两种结果:找出缺陷和故障,或显示软件执行正确。测试是一个或多个测试用例的集合。

测试用例:所谓测试用例是为特定的目的而设计的一组测试输入、执行条件和预期的结果;测试用例是执行测试的最小实体。

2、测试的步骤

测试步骤详细规定了如何设置、执行、评估特定的测试用例。

软件生命周期:一个软件生命周期包括制定计划、需求分析定义、软件设计、程序编码、软件测试、软件运行、软件维护、软件停用等8个阶段。

软件测试在软件生命周期中横跨两个阶段:

单元测试阶段:

即在每个模块编写出以后所做的必要测试

综合测试阶段:

即在完成单元测试后进行的测试,如集成测试、系统测试、验收测试。

5.2软件测试目的

测试是程序的执行过程,目的在于发现错误;不能证明程序的正确性,除非仅处理有限种情况。检查系统是否满足需求也是测试的期望目标。一个好的测试用例在于发现了还未曾发现的错误;一次成功的测试则是发现了错误的测试。

27 西安工程大学学士学位论文

5.3软件测试方法分类

软件测试技术按照不同的划分方法,有不同的分类:静态测试、动态测试;黑盒测试、白盒测试;单元测试、集成测试、回归测试、系统测试、验证测试以及确认测试。

5.3.1 静态测试与动态测试

按照软件测试分析与非分析方法而论,软件测试可以分静态测试和动态测试。

1、静态测试

指不实际运行软件,主要是对软件的编程格式、结构等方面进行评估。静态测试包括:代码检查 、静态结构分析、代码质量度量等。它可以由人工进行,也可以借助软件工具自动进行。

2、动态测试

动态测试方法是指计算机必须真正运行被测试的程序,通过输入测试用例,对其运行情况即输入与输出的对应关系进行分析,以达到检测的目的。

动态测试包括:功能确认与接口测试 ,覆盖率分析,性能分析,内存分析。

5.3.2 黑盒白盒与白盒测试

1、黑盒测试

按照软件测试用例的设计方法而论,软件测试可以分为白盒测试法和黑盒测试法。

若测试规划是基于产品的功能,目的是检查程序各个功能是否能够实现,并检查其中的功能错误,则这种测试方法称为黑盒测试(Black-box Testing)方法。

黑盒测试又称为功能测试、数据驱动测试和基于规格说明的测试。它是一种从用户观点出发的测试,一般被用来确认软件功能的正确性和可操作性。

黑盒测试主要根据规格说明书设计测试用例,并不涉及程序内部构造和内部特性,只依靠被测程序输入和输出之间的关系或程序的功能设计测试用例。

2、黑盒测试的特点

黑盒测试与软件的具体实现过程无关,在软件实现的过程发生变化时,测试用例仍然可以使用。

黑盒测试用例的设计可以和软件实现同时进行,这样能够压缩总的开发时间。

若测试规划基于产品的内部结构进行测试,检查内部操作是否按规定执行,软件各个部分功能是否得到充分使用,则这种测试方法称为白盒测试(White-box

Testing)方法。

28 西安工程大学学士学位论文

3、白盒测试

白盒测试又称为结构测试、逻辑驱动测试或基于程序的测试,一般用来分析程序的内部结构。

白盒测试要求是对某些程序的结构特性做到一定程度的覆盖,或者说这种测试是“基于覆盖率的测试”。通常的程序结构覆盖有:语句覆盖,判定覆盖,条件覆盖,判定/条件覆盖,路径覆盖。

5.3.3 单元测试、集成测试、系统测试、验证测试和确认测试

按照软件测试的策略和过程来分类,软件测试可分为单元测试、集成测试、系统测试、验证测试和确认测试。

测试中的错误分类:

A类错误:致命错误——引起程序异常中断或死机的错误等。

B类错误:功能错误——业务功能实现错误、程序执行结果错误等。

C类错误:功能缺陷——功能操作不方便、缺少操作提示等。

D类错误:界面缺陷——界面设计不符合本系统的界面设计规范等。

E类错误:测试正确——正确的测试项、测试结果与预期的一致等。

5.4论坛测试

本系统各部分模块,采黑白盒测试。

5.4.1 测试用例设计要求

一个好的测试用例,应该包含以下信息:

1、软件或项目的名称

2、软件或项目的版本(内部版本号)

3、功能模块名

4、测试用例的简单描述,即该用例执行的目的或方法

5、测试用例的参考信息(便于跟踪和参考)

6、本测试用例与其他测试用例间的依赖关系

7、本用例的前置条件,即执行本用例必须要满足的条件,如对数据库的访问权限

8、用例的编号(ID),如可以是:软件名称简写-功能块简写-NO.

9、步骤号、操作步骤描述、测试数据描述

10、预期结果(这是最重要的)和实际结果(如果有BUG管理工具,这条可以省略)

11、开发人员(必须有)和测试人员(可有可无)

12、测试执行日期

29 西安工程大学学士学位论文

5.5测试用例

测试用例表,如图5-1所示。

项目软件

功能模块

功能特性

测试目的

测试数据

操作步骤 操作描述

表6-1 输入测试用例

飞机大战游戏

程序版本

编制人

输入后立即得到响应

V1.0

徐明

验证键盘输入是否得到正确响应

键盘输入:↑,↓,←,→,space,ctrl

期望结果

按下键位:所控制飞机上移一个单位;长按时持续向上移动

按下键位:所控制飞机下一个单位;长按时持续向下动

按下键位:←所控制飞实际结果

按下键位:所控制飞机上移一个单位;长按时持续向上移动

按下键位:所控制飞机下移一个单位;时持续向下移动

按下键位:←所控制飞机左一个单位;长按时持续向左移动

按下键位:所控制飞机右移一个单位;长按时持续向右移动

游戏暂停

游戏继续

正常

正常

正常

正常

正常

正常

测试状态

1

按键↑,长按↑

2

按键↓,长按↓

3

按键←,长机左移一个单位;长按按←

时持续向左移动

按下键位:所控制飞机4

按键→,长右移一个单位;长按时按→

持续向右移动

游戏暂停

游戏继续

5

6

按下space

按下ctrl

5.6测试结果

本系统经过测试,各部分的功能基本正常,达到了预期的目的。

30 西安工程大学学士学位论文

5.6本章小结

通过对系统的全面测试,我学到了许多测试方面的知识,了解到测试方法、测试经验。通过本次设计,使我了解到测试的重要性。通过测试,可以使软件更满足用户的需求,更加稳定、可靠地运行。

31 第6章 工作总结

第6章 工作总结

本系统从构思,设计到代码的实现与测试历时近三个月,通过对项目的思考与编码实现,使我对C++有了更深层次的了解,自己也清楚的感觉到自己对知识掌握的局限,尤其是在开发方面还要投入更多的精力去学习。通过大量的查阅资料和书籍让我对软件开发的流程有了一定的掌握,明白了软件开发的原理、流程和模式。这次的项目设计开发为今后的学习和工作产生了积极的意义。由于还是初学者,在项目设计中还有欠缺和考虑不周的地方,游戏还有待进一步研究和改善。

自己完成了一个相对比较完整的电脑游戏,这对于之前一直想要从事开发的我来说真的是很大的一次激励。在这个项目之后,感觉自己在实习公司这种真实的开发环境下也很少能够体验到可以与该项目压力相当的需求了。

这个项目是我个人编程经历的一个节点,我感觉从这个项目之后,我才有自信正式进入公司真正的进入了IT这个行业。而这个项目所带给我的开发上的经验就是:无论当前的项目有多难,需求有多么复杂,时间有多么紧迫,一定要分析透需求,之后一点一点的按照常规的开发进行下去,遇到技术难点不要跳过,解决掉这个再进行下一步的开发,否则,问题越积越多你会对自己失去信心。对于未来,希望自己做一个技术比较过硬的IT编程人员,能够将设计模式融会贯通到自己的代码中,希望自己能够有一个让人一看就一目了然的编程风格。

32 致谢

致谢

论文完成之际,衷心感谢所有关心、帮助过作者的老师、同学、朋友们,尤其要向作者的导师史延科老师致以衷心的感谢。在项目运行和论文撰写工作中,史老师对作者严格要求,认真指导,给予了很多鼓励和帮助,并提供了很多指导性的意见。在史延科老师的亲切关怀和悉心指导下作者顺利的完成了的项目设计和论文撰写。他严肃的科学态度,严谨的治学精神,精益求精的工作作风,对学术一丝不苟的高尚品德和人格魅力深深地感染和激励着作者,今后也会成为作者生活和工作追求的标榜。

最终也要感谢在设计期间给予作者帮助的同学,他们帮助解答了许多技术上的问题。同时也感谢其他老师在此期间的关怀和帮助,以及学院为作者提供良好的毕业设计环境。33 参考文献

参考文献

[1] 孙鑫,余安萍 VC++深入详解 电子工业出版社,2006

[2] 欧阳志宏,董霖,钟骏华,MFC程序设计轻松入门,人民邮电出版社,2009

[3] 曾凡峰, 苗雨,MFC编程技巧与范例详解,清华大学出版社 ,2008

[4] 宋坤, 刘锐宁, 李伟明,MFC程序开发参考大全,人民邮电出版社, 2007

[5] 蔡明志,指针的编程艺术第2版,人民邮电出版社, 2013

[6] 毛星云,逐梦旅程:Windows游戏编程之从零开始,清华大学出版社,2013

[7] 谭浩强,C/C++程序设计第4版,高等教育出版社,2001

[8] Morison.M,游戏编程入门, 人民邮电出版社,2005

[9] 谢贤芬等编著,21天学通Visual C++(第2版),电子工业出版社,2011

[10] (美) Michael Dawson著 万千译,通过游戏编程实战教新手学C++编程,清华大学出版社,2011

[11] 朱峰社区编著,3ds Max/Photoshop游戏模型制作全攻略,人民邮电出版社,2014

[12] 谭浩强著,C程序设计教程(第2版),清华大学出版社,2013

[13] (美)Andre LaMothe 沙鹰译,Windows游戏编程大师技巧,人民邮电出版社,2012

34 附录

附录1

原代码如下:

BOOL CMyApp::InitInstance()

{

AfxEnableControlContainer();

// Standard initialization

// If you are not using these features and wish to reduce the size

// of your final executable, you should remove from the following

// the specific initialization routines you do not need.

CMyDlg dlg;

m_pMainWnd = &dlg;

int nResponse = l();

if (nResponse == IDOK)

{

// TODO: Place code here to handle when the dialog is

// dismissed with OK

}

else if (nResponse == IDCANCEL)

{

// TODO: Place code here to handle when the dialog is

// dismissed with Cancel

}

// Since the dialog has been closed, return FALSE so that we exit the

// application, rather than start the application's message pump.

return FALSE;

}

35 西安工程大学学士学位论文

class CAboutDlg : public CDialog

{

public:

CAboutDlg();

// Dialog Data

//{{AFX_DATA(CAboutDlg)

enum { IDD = IDD_ABOUTBOX };

//}}AFX_DATA

// ClassWizard generated virtual function overrides

//{{AFX_VIRTUAL(CAboutDlg)

protected:

virtual void DoDataExchange(CDataExchange* pDX);

//}}AFX_VIRTUAL

// Implementation

protected:

//{{AFX_MSG(CAboutDlg)

//}}AFX_MSG

DECLARE_MESSAGE_MAP()

};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)

{

}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

}

// DDX/DDV support

36

西安工程大学学士学位论文

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)

//{{AFX_MSG_MAP(CAboutDlg)

// No message handlers

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

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

// CMyDlg dialog

CMyDlg::CMyDlg(CWnd* pParent /*=NULL*/)

: CDialog(CMyDlg::IDD, pParent)

{

//{{AFX_DATA_INIT(CMyDlg)

// NOTE: the ClassWizard will add member initialization here

//}}AFX_DATA_INIT

// Note that LoadIcon does not require a subsequent DestroyIcon in Win32

m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

m_(64,72,ILC_COLOR24|ILC_MASK,0,1);

m_tmap(IDB_BITMAP_ME);

m_(&m_bmpMe,RGB(255,255,255));

for(int i=0; i<10; i++)

{

m_imgCartridge[i].Create(7,17,ILC_COLOR24|ILC_MASK,0,1);

m_bmpCartridge[i].LoadBitmap(IDB_BITMAP_CARTRIDGE);

m_imgCartridge[i].Add(&m_bmpCartridge[i],RGB(255,255,255));

m_cartridgePoint[i].x = 0;

m_cartridgePoint[i].y = -20;

}

for (int i = 0; i<60; i++)

37 西安工程大学学士学位论文

{

m_imgFlivver[i].Create(50,30,ILC_COLOR24|ILC_MASK,0,1);

m_bmpFlivver[i].LoadBitmap(IDB_BITMAP_FLIVVER);

m_imgFlivver[i].Add(&m_bmpFlivver[i],RGB(255,255,255));

m_flivverPoint[i].x = 0;

m_flivverPoint[i].y = 800;

}

m_(70,90,ILC_COLOR24|ILC_MASK,0,1);

m_tmap(IDB_BITMAP_FLIVVER2);

m_(&m_bmpFlivver2,RGB(255,255,255));

m_(110,170,ILC_COLOR24|ILC_MASK,0,1);

m_tmap(IDB_BITMAP_FLIVVER3);

m_(&m_bmpFlivver3, RGB(255, 255, 255));

m_imgStart[0].Create(170, 50, ILC_COLOR24 | ILC_MASK, 0, 1);

m_bmpStart[0].LoadBitmap(IDB_BITMAP_START1);

m_imgStart[0].Add(&m_bmpStart[0], RGB(0, 0, 0));

m_imgStart[1].Create(170, 50, ILC_COLOR24 | ILC_MASK, 0, 1);

m_bmpStart[1].LoadBitmap(IDB_BITMAP_START2);

m_imgStart[1].Add(&m_bmpStart[1], RGB(0, 0, 0));

m_imgExit[0].Create(170, 50, ILC_COLOR24 | ILC_MASK, 0, 1);

m_bmpExit[0].LoadBitmap(IDB_BITMAP_EXIT1);

m_imgExit[0].Add(&m_bmpExit[0], RGB(0, 0, 0));

m_imgExit[1].Create(170, 50, ILC_COLOR24 | ILC_MASK, 0, 1);

m_bmpExit[1].LoadBitmap(IDB_BITMAP_EXIT2);

m_imgExit[1].Add(&m_bmpExit[1], RGB(0, 0, 0));

38

西安工程大学学士学位论文

m_imgContinue[0].Create(170, 50, ILC_COLOR24 | ILC_MASK, 0, 1);

m_bmpContinue[0].LoadBitmap(IDB_BITMAP_CONTINUE1);

m_imgContinue[0].Add(&m_bmpContinue[0], RGB(0, 0, 0));

m_imgContinue[1].Create(170, 50, ILC_COLOR24 | ILC_MASK, 0, 1);

m_bmpContinue[1].LoadBitmap(IDB_BITMAP_CONTINUE2);

m_imgContinue[1].Add(&m_bmpContinue[1], RGB(0, 0, 0));

m_(340, 100, ILC_COLOR24 | ILC_MASK, 0, 1);

m_tmap(IDB_BITMAP_ICON);

m_(&m_bmpIcon, RGB(0, 0, 0));

m_(230, 160, ILC_COLOR24 | ILC_MASK, 0, 1);

m_tmap(IDB_BITMAP_GAMEOVER);

m_(&m_bmpGameOver, RGB(0, 0, 0));

for (int i = 0; i<20; i++)

{

m_imgBoom1[i].Create(40,43,ILC_COLOR24|ILC_MASK,0,1);

m_bmpBoom1[i].LoadBitmap(IDB_BITMAP_BOOM1);

m_imgBoom1[i].Add(&m_bmpBoom1[i],RGB(255,255,255));

m_boomPoint1[i].x = 0;

m_boomPoint1[i].y = 800;

m_boomFlag1[i] = 0;

m_imgBoom2[i].Create(41,39,ILC_COLOR24|ILC_MASK,0,1);

m_bmpBoom2[i].LoadBitmap(IDB_BITMAP_BOOM2);

m_imgBoom2[i].Add(&m_bmpBoom2[i],RGB(255,255,255));

m_boomPoint2[i].x = 0;

m_boomPoint2[i].y = 800;

m_boomFlag2[i] = 0;

}

39

西安工程大学学士学位论文

pMEPOINT = new CPoint[118]{CPoint(2, 36), CPoint(3, 35), CPoint(4, 34),

CPoint(5, 33), CPoint(6, 32), CPoint(7, 31), CPoint(8, 30), CPoint(9, 26), CPoint(10,

25), CPoint(11, 18), CPoint(12, 18), CPoint(13, 15), CPoint(14, 17), CPoint(15, 18),

CPoint(16, 23), CPoint(

17, 23), CPoint(18, 22), CPoint(19, 21), CPoint(20, 20), CPoint(21, 20),

CPoint(22, 17), CPoint(23, 16), CPoint(24, 15), CPoint(25, 14), CPoint(26, 12),

CPoint(27, 10), CPoint(28, 9), CPoint(29, 8), CPoint(30, 7), CPoint(31, 7),

CPoint(32, 7), CPoint(33, 8), CPoint(34, 9), CPoint(35, 10), CPoint(36, 12),

CPoint(37, 14), CPoint(38, 15), CPoint(39, 16), CPoint(40, 18), CPoint(41, 20),

CPoint(42, 20), CPoint(43, 21), CPoint(44, 22), CPoint(45, 23), CPoint(46, 23),

CPoint(47, 18), CPoint(48, 17), CPoint(49, 16), CPoint(50, 18), CPoint(51,

18), CPoint(52, 25), CPoint(53, 25), CPoint(54, 27), CPoint(55, 31), CPoint(56, 32),

CPoint(57, 33), CPoint(58, 34), CPoint(59, 45), CPoint(60, 36),

CPoint(2, 36), CPoint(3, 71), CPoint(4, 71), CPoint(5, 71), CPoint(6, 71),

CPoint(7, 71), CPoint(8, 71), CPoint(9, 71), CPoint(10, 71), CPoint(11, 71),

CPoint(12, 71), CPoint(13, 71), CPoint(14, 71), CPoint(15, 71), CPoint(16, 71),

CPoint(

17, 71), CPoint(18, 71), CPoint(19, 71), CPoint(20, 71), CPoint(21, 71),

CPoint(22, 71), CPoint(23, 71), CPoint(24, 71), CPoint(25, 71), CPoint(26, 71),

CPoint(27, 71), CPoint(28, 71), CPoint(29, 71), CPoint(30, 71), CPoint(31, 71),

CPoint(32, 71), CPoint(33, 71), CPoint(34, 71), CPoint(35, 71), CPoint(36,

71), CPoint(37, 71), CPoint(38, 71), CPoint(39, 71), CPoint(40, 71), CPoint(41, 71),

CPoint(42, 71), CPoint(43, 71), CPoint(44, 71), CPoint(45, 71), CPoint(46, 71),

CPoint(47, 71), CPoint(48, 71), CPoint(49, 71), CPoint(50, 71), CPoint(51,

71), CPoint(52, 71), CPoint(53, 71), CPoint(54, 71), CPoint(55, 71), CPoint(56, 71),

CPoint(57, 71), CPoint(58, 71), CPoint(59, 71), CPoint(60, 36)};

pFLIVVERPOINT = new CPoint[60]{CPoint(11, 16), CPoint(12, 17), CPoint(13,

17), CPoint(14, 17), CPoint(15, 17), CPoint(16, 18), CPoint(17, 18), CPoint(18, 18),

CPoint(19, 20), CPoint(20, 20), CPoint(21, 20), CPoint(22, 23), CPoint(23, 25),

CPoint(24, 27), CPoint(25, 28), CPoint(26, 27), CPoint(27, 25), CPoint(28,

23), CPoint(29, 20), CPoint(30, 20), CPoint(31, 20), CPoint(32, 18), CPoint(33, 18),

CPoint(34, 18), CPoint(35, 18), CPoint(36, 17), CPoint(37, 17), CPoint(38, 17),

CPoint(39, 16), CPoint(40, 16),

40 西安工程大学学士学位论文

CPoint(11, 16), CPoint(12, 0), CPoint(13, 0), CPoint(14, 0), CPoint(15, 0),

CPoint(16, 0), CPoint(17, 0), CPoint(18, 0), CPoint(19, 0), CPoint(20, 0), CPoint(21,

0), CPoint(22, 0), CPoint(23, 0),

CPoint(24, 0), CPoint(25, 0), CPoint(26, 0), CPoint(27, 0), CPoint(28, 0),

CPoint(29, 0), CPoint(30, 0), CPoint(31, 0), CPoint(32, 0), CPoint(33, 0), CPoint(34,

0), CPoint(35, 0), CPoint(36, 0), CPoint(37, 0), CPoint(38, 0), CPoint(39, 0),

CPoint(40, 16)};

pFLIVVER2POINT = new CPoint[128]{CPoint(4, 59), CPoint(5, 59), CPoint(6,

59), CPoint(7, 59), CPoint(8, 60), CPoint(9, 66), CPoint(10, 67), CPoint(11, 66),

CPoint(12, 66), CPoint(13, 66), CPoint(14, 66), CPoint(15, 60), CPoint(16, 59),

CPoint(17, 59),

CPoint(18, 61), CPoint(19, 61), CPoint(20, 62), CPoint(21, 77), CPoint(22,

78), CPoint(23, 79), CPoint(24, 80), CPoint(25, 80), CPoint(26, 80), CPoint(27, 80),

CPoint(28, 80), CPoint(29, 80), CPoint(30, 80), CPoint(31, 80), CPoint(32, 59),

CPoint(33, 59), CPoint(34, 59),

CPoint(35, 59), CPoint(36, 59), CPoint(37, 59), CPoint(38, 59), CPoint(39,

80), CPoint(40, 80), CPoint(41, 80), CPoint(42, 80), CPoint(43, 80), CPoint(44, 80),

CPoint(45, 80), CPoint(46, 79), CPoint(47, 79), CPoint(48, 78), CPoint(49, 77),

CPoint(50, 61),

CPoint(51, 61), CPoint(52, 61), CPoint(53, 59), CPoint(54, 59), CPoint(55,

60), CPoint(56, 66), CPoint(57, 66), CPoint(58, 66), CPoint(59, 66), CPoint(60, 66),

CPoint(61, 66), CPoint(62, 60), CPoint(63, 59), CPoint(64, 59), CPoint(65, 59),

CPoint(66, 59), CPoint(67, 59),

CPoint(4, 59), CPoint(5, 0), CPoint(6, 0), CPoint(7, 0), CPoint(8, 0),

CPoint(9, 0), CPoint(10, 0), CPoint(11, 0), CPoint(12, 0), CPoint(13, 0), CPoint(14,

0), CPoint(15, 0), CPoint(16, 0), CPoint(17, 0),

CPoint(18, 0), CPoint(19, 0), CPoint(20, 0), CPoint(21, 0), CPoint(22, 0),

CPoint(23, 0), CPoint(24, 0), CPoint(25, 0), CPoint(26, 0), CPoint(27, 0), CPoint(28,

0), CPoint(29, 0), CPoint(30, 0), CPoint(31, 0), CPoint(32, 0), CPoint(33, 0),

CPoint(34, 0),

CPoint(35, 0), CPoint(36, 0), CPoint(37, 0), CPoint(38, 0), CPoint(39, 0),

CPoint(40, 0), CPoint(41, 0), CPoint(42, 0), CPoint(43, 0), CPoint(44, 0), CPoint(45,

0), CPoint(46, 0), CPoint(47, 0), CPoint(48, 0), CPoint(49, 0), CPoint(50, 0),

41 西安工程大学学士学位论文

CPoint(51, 0), CPoint(52, 0), CPoint(53, 0), CPoint(54, 0), CPoint(55, 0),

CPoint(56, 0), CPoint(57, 0), CPoint(58, 0), CPoint(59, 0), CPoint(60, 0), CPoint(61,

0), CPoint(62, 0), CPoint(63, 0), CPoint(64, 0), CPoint(65, 0), CPoint(66, 0),

CPoint(67, 59)};

pFLIVVER3POINT = new CPoint[212]{CPoint(2, 96), CPoint(3, 102), CPoint(4,

109), CPoint(5, 111), CPoint(6, 122), CPoint(7, 124), CPoint(8, 125), CPoint(9, 126),

CPoint(10, 130), CPoint(11, 130), CPoint(12, 128), CPoint(13, 127), CPoint(14, 127),

CPoint(15, 127), CPoint(16, 129), CPoint(17, 128), CPoint(18, 128),

CPoint(19, 128), CPoint(20, 152), CPoint(21, 153), CPoint(22, 153), CPoint(23, 152),

CPoint(24, 151), CPoint(25, 150), CPoint(26, 140),

CPoint(27, 148), CPoint(28, 145), CPoint(29, 143), CPoint(30, 142),

CPoint(31, 139), CPoint(32, 137), CPoint(33, 136), CPoint(34, 136), CPoint(35, 132),

CPoint(36, 138), CPoint(37, 149), CPoint(38, 149),

CPoint(39, 148), CPoint(40, 148), CPoint(41, 148), CPoint(42, 150),

CPoint(43, 149), CPoint(44, 146), CPoint(45, 145), CPoint(46, 144), CPoint(47, 137),

CPoint(48, 137), CPoint(49, 136), CPoint(50, 136),

CPoint(51, 136), CPoint(52, 136), CPoint(53, 135), CPoint(54, 136),

CPoint(55, 136), CPoint(56, 136), CPoint(57, 136), CPoint(58, 136), CPoint(59, 136),

CPoint(60, 136), CPoint(61, 137), CPoint(62, 143),

CPoint(63, 146), CPoint(64, 146), CPoint(65, 148), CPoint(66, 150),

CPoint(67, 148), CPoint(68, 148), CPoint(69, 148), CPoint(70, 148), CPoint(71, 150),

CPoint(72, 150), CPoint(73, 136), CPoint(74, 135),

CPoint(75, 136), CPoint(76, 137), CPoint(77, 138), CPoint(78, 141),

CPoint(79, 144), CPoint(80, 145), CPoint(81, 147), CPoint(82, 149), CPoint(83, 150),

CPoint(84, 152), CPoint(85, 151), CPoint(86, 153),

CPoint(87, 153), CPoint(88, 153), CPoint(89, 152), CPoint(90, 128),

CPoint(91, 128), CPoint(92, 130), CPoint(93, 130), CPoint(94, 128), CPoint(95, 128),

CPoint(96, 128), CPoint(97, 130), CPoint(98, 130),

CPoint(99, 128), CPoint(100, 127), CPoint(101, 126), CPoint(102, 125),

CPoint(103, 123), CPoint(104, 109), CPoint(105, 102), CPoint(106, 99), CPoint(107,

91),

CPoint(2, 96), CPoint(3, 0), CPoint(4, 0), CPoint(5, 0), CPoint(6, 0),

CPoint(7, 0), CPoint(8, 0), CPoint(9, 0), CPoint(10, 0), CPoint(11, 0), CPoint(12, 0),

42 西安工程大学学士学位论文

CPoint(13, 0), CPoint(14, 0),

CPoint(15, 0), CPoint(16, 0), CPoint(17, 0), CPoint(18, 0), CPoint(19, 0),

CPoint(20, 0), CPoint(21, 0), CPoint(22, 0), CPoint(23, 0), CPoint(24, 0), CPoint(25,

0), CPoint(26, 0),

CPoint(27, 0), CPoint(28, 0), CPoint(29, 0), CPoint(30, 0), CPoint(31, 0),

CPoint(32, 0), CPoint(33, 0), CPoint(34, 0), CPoint(35, 0), CPoint(36, 0), CPoint(37,

0), CPoint(38, 0),

CPoint(39, 0), CPoint(40, 0), CPoint(41, 0), CPoint(42, 0), CPoint(43, 0),

CPoint(44, 0), CPoint(45, 0), CPoint(46, 0), CPoint(47, 0), CPoint(48, 0), CPoint(49,

0), CPoint(50, 0),

CPoint(51, 0), CPoint(52, 0), CPoint(53, 0), CPoint(54, 0), CPoint(55, 0),

CPoint(56, 0), CPoint(57, 0), CPoint(58, 0), CPoint(59, 0), CPoint(60, 0), CPoint(61,

0), CPoint(62, 0),

CPoint(63, 0), CPoint(64, 0), CPoint(65, 0), CPoint(66, 0), CPoint(67, 0),

CPoint(68, 0), CPoint(69, 0), CPoint(70, 0), CPoint(71, 0), CPoint(72, 0), CPoint(73,

0), CPoint(74, 0),

CPoint(75, 0), CPoint(76, 0), CPoint(77, 0), CPoint(78, 0), CPoint(79, 0),

CPoint(80, 0), CPoint(81, 0), CPoint(82, 0), CPoint(83, 0), CPoint(84, 0), CPoint(85,

0), CPoint(86, 0),

CPoint(87, 0), CPoint(88, 0), CPoint(89, 0), CPoint(90, 0), CPoint(91, 0),

CPoint(92, 0), CPoint(93, 0), CPoint(94, 0), CPoint(95, 0), CPoint(96, 0), CPoint(97,

0), CPoint(98, 0),

}

void CMyDlg::DoDataExchange(CDataExchange* pDX)

{

}

43

CPoint(99, 0), CPoint(100, 0), CPoint(101, 0), CPoint(102, 0), CPoint(103,

0), CPoint(104, 0), CPoint(105, 0), CPoint(106, 0), CPoint(107, 0)};

CDialog::DoDataExchange(pDX);

//{{AFX_DATA_MAP(CMyDlg)

// NOTE: the ClassWizard will add DDX and DDV calls here

//}}AFX_DATA_MAP 西安工程大学学士学位论文

BEGIN_MESSAGE_MAP(CMyDlg, CDialog)

//{{AFX_MSG_MAP(CMyDlg)

ON_WM_SYSCOMMAND()

ON_WM_PAINT()

ON_WM_QUERYDRAGICON()

ON_WM_DESTROY()

ON_WM_TIMER()

ON_WM_ERASEBKGND()

ON_WM_KEYDOWN()

//}}AFX_MSG_MAP

ON_WM_LBUTTONDOWN()

ON_WM_LBUTTONUP()

END_MESSAGE_MAP()

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

// CMyDlg message handlers

BOOL CMyDlg::OnInitDialog()

{

CDialog::OnInitDialog();

// Add "" menu item to system menu.

// IDM_ABOUTBOX must be in the system command range.

ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);

ASSERT(IDM_ABOUTBOX < 0xF000);

CMenu* pSysMenu = GetSystemMenu(FALSE);

if (pSysMenu != NULL)

{

CString strAboutMenu;

ring(IDS_ABOUTBOX);

44

发布者:admin,转转请注明出处:http://www.yc00.com/xiaochengxu/1690640948a383682.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信