为了正常的体验网站,请在浏览器设置里面开启Javascript功能!
首页 > 基于VC 的桌面小游戏的研究与开发(游戏画面与动态效果的实现)

基于VC 的桌面小游戏的研究与开发(游戏画面与动态效果的实现)

2017-09-26 43页 doc 94KB 15阅读

用户头像

is_482581

暂无简介

举报
基于VC 的桌面小游戏的研究与开发(游戏画面与动态效果的实现)基于VC 的桌面小游戏的研究与开发(游戏画面与动态效果的实现) 基于VC++的桌面小游戏的研究与开发(游戏画面与动态 效果的实现) 基于 VC++ 的桌面小游戏的研究与开发 摘 要 Visual C++6.0 是微软公司推出的基于 C/C++ 的集成开发环境,它可以实现可视 化编程和支持面向对象的编程技术,是当今最流行的软件开发工具之一。本论文是 利用程序开发工具 Visual C++6.0 来开发桌面游戏“连连看”中的界面和动态效果 部分,其中详细介绍了 Visual C++6.0 的功能及使用方法,并结合其特...
基于VC  的桌面小游戏的研究与开发(游戏画面与动态效果的实现)
基于VC 的桌面小游戏的研究与开发(游戏画面与动态效果的实现) 基于VC++的桌面小游戏的研究与开发(游戏画面与动态 效果的实现) 基于 VC++ 的桌面小游戏的研究与开发 摘 要 Visual C++6.0 是微软公司推出的基于 C/C++ 的集成开发环境,它可以实现可视 化编程和支持面向对象的编程技术,是当今最流行的软件开发工具之一。本是 利用程序开发工具 Visual C++6.0 来开发桌面游戏“连连看”中的界面和动态效果 部分,其中详细介绍了 Visual C++6.0 的功能及使用方法,并结合其特点完成游戏代 码的编写。游戏以生成界面、生成位图起始,然后再进行菜单设计,包 括游戏 中的基本选项如难度选择、功能选择等,最后在进行了动态效果的编译工作,运行 后实现了预期的计划。由于编程目是属于游戏设计,因此在设计的同时注 意了游 戏以娱乐为主的特点,增加了游戏的娱乐性。从整体上说,这款游戏的设计 基本上 提供给游戏时玩家的需求。 关键词:Visual C++ 界面设计 菜单设计 动态效果 III 基于 VC++ 的桌面小游戏的研究与开发 Abstract Visual C++6.0 is based on Microsoft's launch of the C/C++ integrated development environment, It can achieve visual programming and support of object-oriented programming techniques, is the most popular software development tool. I graduated in the design, I studied the problem is that procedures for the use development tools Visual C++6.0 to develop desktop game, "Lianlian Kan" in the part of the interface and dynamic effects. This paper describes the Visual C++6.0 functions and the use of methods, with its features of the game code to complete the preparation. Start with the game interface, generating interface to generate bitmap, and then design a menu, including the game's basic options such as the difficulty of choice, selection of features, finally in the dynamic effects of the compiler work, running the basic realization of the anticipated plan. Because programming is the topic of game design, so we designed the game to pay attention to the entertainment-oriented features, and increase of game entertainment. Viewed as a whole, the game is basically designed for the needs of game players. Keywords: Visual C++6.0 Interface Design Menu design Dynamic results IV 基于 VC++ 的桌面小游戏的 研究与开发 目 录 第一章 前 言................................................................................................................... 1 1.1 设计背景及意 义................................................................................................... 1 1.2 游戏设计项目简 介............................................................................................... 2 1.3 研究内 容................................................................... ............................................ 3 第二章 利用VISUAL C++6.0 进行编 程........................................................................ 4 2.1 VISUAL C++6.0 简介及其特 点 ............................................................................ 4 2.2 VISUAL C++6.0 语言的基本元 素 ........................................................................ 5 主函数、语句和语句 块 .................................................................................................5 标识符与关键 字 .............................................................................................................6 变量与常 量 .....................................................................................................................6 数据类型和运算 符 .........................................................................................................7 2.3 VISUAL C++6.0 可视化编 程 ................................................................................ 8 Windows消息与事件驱 动 ..............................................................................................8 消息与映 射 .....................................................................................................................8 2.4 初识 MFC ................................................................. ............................................. 9 第三章 游戏设计总体介 绍........................................................................................... 12 3.1 需求分 析............................................................................................................. 12 功能描 述 .......................................................................................................................12 游戏特性分 析 ...............................................................................................................12 3.2 游戏设计思 路..................................................................................................... 13 游戏界面设计规 划 .......................................................................................................15 位图的生 成 ...................................................................................................................23 游戏动态效果实 现 .......................................................................................................26 V 基于 VC++ 的桌面小游戏的研 究与开发 3.3 游戏设计流 程..................................................................................................... 33 3.4 游戏具体功能介 绍............................................................................................. 35 第四章 游戏代码测 试................................................................................................. 37 4.1 游戏整体代码测 试............................................................................................. 37 4.2 局部功能代码测 试............................................................................................. 38 第五章 结论及展 望.................................................................................................... 41 5.1 结 论................................................................... .................................................. 41 5.2 设计展 望............................................................................................................. 41 参 考 文 献 ................................................................................................................... 42 附 录................................................................................................................................. 44 致 谢 ................................................................................................................................. 54 声 明 ................................................................................................................................. 55 VI 基于 Visual C++ 的桌面游戏设计 第一章 前 言 1.1 设计背景及意义 C 语言是在 70 年代初问世的。一九七八年由美国电话电报公司贝尔 实验室正式发表了 C 语言。同时由 ighan 和 hit 合著 了著名的“THE C PROGRAMMING LANGUAGE”一书。通常简称为《K&R》, 也有人称之为《K&R》标准。但是,在《K&R》中并没有定义一个完整的 标准 C 语言,后来由美国国家标准学会在此基础上制定了一个 C 语言标 准,于一九八三年发表。通常称之为 ANSI C。 早期的 C 语言主要是用于 UNIX 系统。由于 C 语言的强大功能和各 方 面的优点逐渐为人们认识,到了八十年代,C 开始进入其它操作系统, 并很快在各类大、中、小和微型计算机上得到了广泛的使用。成为当代 最优秀的程序设计语言之一。 C 语言是一种结构化语言。它层次清晰,便于按模块化方式组织程 序,易于调试和维护。C 语言的表现能力和处理能力极强。它不仅具有 丰富的运算符和数据类型,便于实现各类复杂的数据结构。它还可以直 接访问内存的物理地址,进行位 bit 一级的操作。由于 C 语言实现了对 硬件的编程操作,因此 C 语言集高级语言和低级语言的功能于一体。既 可用于系统软件的开发,也适合于应用软件 的开发。此外,C 语言还具 有效率高,可移植性强等特点。因此广泛地移植到了各类型计算机上, 从而形成了多种版本的 C 语言。 在 C 的基础上,一九八三年又由贝尔实验室的 Bjarne Strou-strup 推出了 C++。 C++进一步扩充和完善了 C 语言,成为一种面向 对象的程 序设计语言。C++目前流行的最新版本是 Borland C++4.5,Symantec C++6.1,和 Microsoft VisualC++ 2.0。C++提出了一些更为深入的概念, 它所支持的这些面向对象的概念容易将 问题空间直接地映射到程序空 间,为程序员提供了一种与传统结构程序设计不同的思维方式和编程方 法。因而也增加了整个语言的复杂性,掌握起来有一定难度。 在我所研究的课题中,主要目的是能够将休闲游戏“连连看”的游 戏界面和游戏中的动态效果进行实现,并尽量饱满、丰富的表现出来, - 1 - 基于 Visual C++ 的桌面游戏设计 使游戏者在进行游戏时被其吸引并对其产生较为浓厚的兴趣。在游戏中 还回提供一些挑战,能给予游戏者新的惊喜并使游戏更具感染力,增加 游戏的可玩性。 1.2 游戏设计项目简介 Visual C++6.0 具有强大的编程功能,它为使用者在编写代码时提供 了很大的便利。在我的毕业设计论文中,主要进行对桌面游戏“连连看” 的动态效果代码部分的编写工作。由于和另一位同学合作编写,我在设 计中主要研究的问题是如何实现“连连看”游戏的界面和动态效果。 这 部分的代码编写灵活多变,实现一个功能的有时可以有很多种的写法, 但总体来说是要将代码尽量简洁,套路尽量清晰的编写出来,另一方面 也是为了方便其他人借鉴,如果写的过于散乱尤其是在定义变量和创建 类等时将变量名或类名定义的过于随意 , 就会让别人甚至于自己都感到 迷茫。其实,在编程时养成好的编码习惯对整个程序都是有好处的。 “连连看”几乎是一款尽人皆知的经典游戏,主要是考验游戏者的 眼力和反应速度。游戏规则十分简单:在一定的时间范围内,通过鼠标 操作将游戏界面中的图片以两两相对的方式连接,每连接两幅相同的图 片就会使其随即消失,最后消除所有的图片 即为胜利并进入更高难度的 关卡。 “连连看”这款游戏的优点在于会让玩家享乐于其中,但又不至于 到达痴迷的境界,游戏采用回合制的方式进行,所以很容易控制。但毕 竟这是一款游戏,它的设计涉及一个置于所有其它要素的中心的东西― ―这就是交互性,使游戏从其它的创造性的媒介中分离出来的这一要素 可以在游戏者同游戏的交互中体现,对于游戏这种媒介的驱动力量来自 于游戏者的决策。设计时必须创造一个使人们去玩的产品,同时还要提 供情绪感染、真实的声音和其它创造性的媒介给予的特性,这是比较高 的要求。 玩游戏就意味着决策。因此,我的游戏需要创造让游戏者不得不决 定做什么的情境,这样,他才能执行所要求 的行为。在一些情况下,决 策越具有挑战性,这个游戏就越具有感染力 。因此,在游戏设计时有必 - 2 - 基于 Visual C++ 的桌面游戏设计 要在其中加入一些具有挑战性的内容来吸引玩家的参与。比如,加大关 于关之间的难度差异,而且不设置接关的选项;在游戏结束时,会弹出 记录最高分的对话框以便玩家留下自己的名字,使玩家想不断挑战自己, 超越自己。 1.3 研究内容 有了以上对此游戏的介绍,我在编写游戏代码时的设计思路就十分 的明朗了。首先点击开始游戏,会出现一个游戏界面,然后根据玩家的 对游戏难度的不同选择会出现不同的游戏画面。玩家对图片进行点击, 算法判断是否可以消除,并有相应的声音效果作为提示。游戏的过程其 实很简单,就是不停的点击、判断、消除,至于消除的部分可以通过刷 新屏幕来实现。游戏中还需要设计菜单选项 ,这是非常必要的,从菜单 中玩家可以看到游戏所有的功能以及这些功能的快捷键的使用,从整体 上介绍了游戏的特点。 在游戏设计中还存在几个难点,例如游戏的背景变化,这需要考虑 到在游戏生成图片时的顺序问题,如果顺序不对就有可能看不到游戏界 面了。为了使游戏的效果更加突出,还可以为游戏增加背景音乐,但这 同样也是一个问题。我所知道的音乐播放形式有两种,WAVE 和 MP3,但 请教老师才知道 WAVE 文件只实用于点击时的音效,并不适合于游戏背景 音乐播放。MP3 的音乐格式可用,但 MFC 中不具备播放 MP3 的能力,需 要在连接中新添加一个控件,在这可能要花些时间。 - 3 - 基于 Visual C++ 的桌面游戏设计 第二章 利用 Visual C++6.0 进行编程 2.1 Visual C++6.0 简介及其特点 C++语言是当今最流行的面向对象的程序设计语言,可视化与面向 对象程序设计是当今最流行的编程技术,Visual C++就是 Microsoft 公 司开发的、基于 Windows 操作系统的 C++语言程序的可视化编程工具。 C/C++语言并非起源于 Microsoft 公司,在 Windows3.0 出现之前, 最好的 C/C++编程工具是 Borland 公司的 Turbo C/C++系列。随着 Windows3.0,Microsoft 推出了 Microsoft C/C++7.0,首次采用了 MFC (微 软基础类库)。正是由于 MFC 的出现,让 C++程序员的工作变的更加高效, 也使得今天的 Visual C++得以成为优秀的主流编程工具。 此时,由于 Visual Basic 在 Windows 平台上的成功,Microsoft 决 意把 Microsoft C/C++的下一个版本 Microsoft C/C++8.0 改名为 Visual C++,这就是 Visual C++1.0。 其后的各个 Visual C++的版本,如同 Microsoft 的其他工具软件, 随 Windows 平台的变化而有了不同的改变。随着 Windows 98/2000 操作 系统功能的增强,相对于前一个版本,Visual C++6.0 增加了支持 IE4 的控件和类、增强了对 OLEDB 的支持、完善了 DHTML 的以及提供了独立 的 MSDN 帮助系统等,同时,集成环境内部工具的性能也得到了相应的提 升。而随着 Visual C++功能的不断提升和完善,可以提供给人们更多、 更便利的代码来进行编程。 在初学 Visual C++6.0 时,可能是 因为在名字上与 Visual Basic 相似,会产生一些误解,认为 Visual C++6.0 是一个完全可视化的编程 工具。虽然 Visual C++的集成环境提供一个快速编程的框架,很大地提 高了编程效率,但是,要真正地掌握 Visual C++,还必须对 C/C++语言 编程有深入的了解,更要理解 MFC 库和 Windows 下的编程方法。大量的 代码及其功能更加复杂的使用方法成为初学 Visual C++6.0 的一大难题, 学习是不仅要尽量的记住代码,而且还要理解其含义,熟练使用。 在 Windows 下编程,通常是调用 Windows API(应用程序编程接口) 得以实现。Visual C++6.0 将大量的 Windows API 以 C++的格式进行封装, - 4 - 基于 Visual C++ 的桌面游戏设计 通过 MFC 方式提供给开发人员,大大简化了开发人员的编程工作,提高 了工作效率。因而,要学好 Visual C++,掌握 MFC 十分重要。 在 Visual C++6.0 中,提供给编程人员两个功能强大的编程工具: AppWizard(应用程序向导)和 ClassWizard(类向导)。 利用 Visual C++6.0 中的 AppWizard,编程人员可以在很短的时间内 创建出 Windows 应用程序的框架;而使用 ClassWizard,则可以在应用 程序框架之上迅速增加新的类、成员变量与函数,使 Windows 编程得以 快速实现,这两种功能的结合,让 Windows 下的编程变得非常简单。 2.2 Visual C++语言的基本元素 主函数 、语句和语句块 在初学 VC++6.0 时,对程序的元素或构造要有一个简单的认识,但 过长的程序在分析时相当困难,不利于理解,而其实有时候程序并不象我 想象中的那么复杂。 int main return 0; 这就是一个真正的程序,它虽然没有起到任何的作用,但它具有一 个真正的程序所需的必要元素。 每个 C++程序都由一个或多个函数构成,但必须有一个入口函数, 这就是主函数 main 。Main 函数是程序执行的入口,所有的 C++程序 都必须从这里开始执行。 “Int main ”说明程序从这里开始执行。Main 前面的 int 表示函 数的返回值;而后面的 是必不可少的,它代表了 main 是一个函数。第 二行为程序的主体,而且包括在“ ”之中。 语句“return 0;”表示函数的返回值为 0。C++程序语句总是以“;” 作为结束。 这个程序虽然什么也没做,但却非常直观的向我说明的程序中的基 本元素,随着学习的不断深入,我将会学到更完整的程序。 - 5 - 基于 Visual C++ 的桌面游戏设计 标识符 与关键字 在程序设计中,常用具有一定意义的名字来定义变量、函数、数组、 类、标号以及其他用户自定义的对象类型,方便在程序设计中按名字来 访问数据,这个名字就是标识符。 在 C++语言中,标识符有 1-32 个字符组成。构成标识符的字符只能 是下划线、数字和英文字母,并且标识符的第一字符只能是下划线或英 文字母。在定义标识符时还应注意字母的大小写,password 和 passWord 在 C++中就是两种不同的标识符。 在 C++程序中,还有一类特殊的标识符,它们仅供系统专用,不能 用来作为用户定义的标识符,称为关键字。关键字是有特殊含义的系统 保留标识符,不能作为用户程序 中定义的标识符。 变量与常量 变量是在程序运行过程中,值可以发生变化的量。在 C++语言中的 变量在使用之前都要求先进行定义。在定义 时,系统会为变量分配固定 的内存,依靠变量名对其进行访问。在定义变量时,应注意变量的命名 应符合名应符合标识符的命名规则。 变量的定义格式一般为: 类型 变量名; 例:int m1,a; //定义整形变量 char str; //定义字符型变量 float _val; //定义实型变量 在定义变量后,赋值是也应注意对号入座。 m1 100; a m1+1; str ‘a’; 变量的定义在 C++程序中是最基础的部分,在使用和调用时应注意 其不同的类型,稍有不慎就可能出现问题。 - 6 - 基于 Visual C++ 的桌面游戏设计 与变量相反,常量是指在程序运行过程中不能发生改变的量。常用 的变量有五种:整形、实型、字符型、字符串型和符号常量。C++中的常 量定义可以在变量定义前加上 const 关键字得到。 const 类型 常量名 值表达式; 此外,还可以使用 C 语言中的常用方法来进行定义: #define 常量名 值 例:const int F -1; const float PI 3.14; const char Flat ‘F’; #define NO 0 数据类型和运算符 Visual C++具有丰富的数据类型,可以分为三大类:基本类型、派 生类型和类类型。 在 Visual C++的基本类型中包括: int 整形,整形变量中用关键字 int 来定义,其值可以是十进制、 八进制或十六进制的数。 float 符点型,实型单精度类型,常用来表示小数或超出整形范围 的数值。 char 字符型,用于表示 ASCII 字符的数据类型。字符变量用关键字 char 来定义。 void 无值型。这是一类特殊的类型,常用在函数的定义中,表示函 数无返回值,此外还可以表示一个指向不同对象的指针。 此外,这 4 种基本类型还可以与 short,long,signed,unsigned 等修 饰符结合使用,构成新的类型。 派生的数据类型依赖于基本类型,它们包括:指针、数组、函数、 枚举、结构体等。 C++具有丰富的运算符,按运算类型可分为赋值运算符、算术运算符、 逻辑运算符、关系运算符、位运算符、指针运算符和取成员运算符等; 按运算对象的个数又可分为单目运算符、双目运算符和三目运算符。 - 7 - 基于 Visual C++ 的桌面游戏设计 表达式就是按照一定的规则,将运算对象用运算符连接起来的有意 义的式子。运算对象可以是常量、变量、函数,也可以是其他表达式。 在构成表达时,还应注意优先级和不同的结合方式。优先级决定不 同的级别的运算符的运算顺序,在编写是应该注意。 2.3 Visual C++6.0 可视化编程 dows 消息与事件驱动 Windows 下的程序设计与 DOS 最大的不同在于 Windows 程序是以 事 件驱动来执行,DOS 是以顺序的过程来执行. 事件包含程序执行过程中所发生的动作行为,如鼠标事件、键盘事 件等。事件驱动以非顺序的方法处理事件,程序启动后,就一直等待事 件的发生。当某一事件发生时,对其进行相应的处理。 消息就是事件发生时所产生的信息,如单击鼠标左键,Windows 将 产生一个 WM_LBUTTONDOWW 的消息,而释放鼠标左键将产生一个 WM_LBUTTONUP 的消息。而消息的来源很广泛,不仅有用户输入的鼠标、 键盘消息,也有程序自身的消、其他程序产生的消息、操作系统产生的 消息等。当事件发生时,Windows 就会将产生的消息分配到相关的程序 中进行处理。 消息的处理是通过专门的消息处理函数来执行的,消息处理函数通 常是一个类的成员函数,而且是 Visual C++中 MFC 编程的重点。消息处 理函数通常由消息的名称和两个参数(WPARAM 和 LPARAM)组成。参数中 包含了当前消息的重要信息,如鼠标消息,WPARAM 参数包含发生消息时 的 Shift,Ctrl 等组合功能键的状态,LPARAM 参数中包含了鼠标当前位 置的信息。 消息与映射 Windows 系统对大量的消息进行了预定义,这些消息都拥有一个形 象的字符串来标识的宏定义,消息的宏定义都有不同类型的前缀,不同消 息的前缀对应着不同的含义。 在 Windows 中有三种主要的消息类型:标准 Windows 消息、控制消 - 8 - 基于 Visual C++ 的桌面游戏设计 息和命令消息。 标准 Windows 消息由窗口和视图进行处理,这类消息通常含有用于 确定如何对消息进行处理的参数。最常见的鼠标消息、键盘消息、窗口 绘制消息、计时器消息都属于这类。除 WN_COMMAND 以外,所有以“WN_” 为前缀的消息都是标准 Windows 消息。 控制通知消息是由控件或子窗口产生,并传给父窗口的 WM_COMMAND 通知消息。不同控件的消息有不同的前缀,常用的控件消息有:文本编 辑控件消息(EM_)、列表框控件消息(LB_)、组合框控件消息(CB_)、 按钮控件消息(BM_)、滚动条控件消息(SBM_)。 命令消息是来自用户界面对象,如菜单命令、工具栏按钮等,和控 件消息一样,也是通过 WM_COMMAND 通知,由消息中包含的标识来决定由 哪些特定的对象来处理该消息。命令是作为特殊消息处理的,每个产生 的命令消息的对象都有一个 ID,通过给命令和对象分配同样的 ID,就能 将命令和对象联系起来。通常,命令 ID 是以其所表示对象的功能来命令 的。 消息映射是 MFC 中处理消息的一种机制,在 MFC 应用程序中,通过 宏将特定的消息映射到派生类的相应成员函数上。它的实质就是按映射 对应表将消息与处理消息的函数―对应,进行分析处理。 当用 AppWizard 创建应用程序后,AppWizard 自动为创建的每个命 令目标类―如派生的应用程序对象、文档、视图和边框窗口等编写消息 映射。这些消息映射在.H 文件中声明后,其消息映射表存放在相应 的.CPP 文件中。 2.4 初识 MFC 面向对象技术中最重要的就是“对象”的概念,它把现实世界中 的气球、自行车等客观实体抽象成程序中的“对象”。这种“对象”具有 一定的属性和方法,这里的属性指对象本身 的各种特性参数。如气球的 体积,自行车的长度等,而方法是指对象本身所能执行的功能,如气球 能飞,自行车能滚动等。一个具体的对象可 以有许多的属性和方法,面 向对象技术的重要特点就是对象的封装性,对于外界而言,并不需要知 - 9 - 基于 Visual C++ 的桌面游戏设计 道对象有哪些属性,也不需要知道对象本身 的方法是如何实现的,而只 需要调用对象所提供的方法来完成特定的功能。从这里我们可以看出, 当把面向对象技术应用到程序设计中时,程序员只是在编写对象方法时 才需要关心对象本身的细节问题,大部分的 时间是放在对对象的方法的 调用上,组织这些对象进行协同工作。 MFC的英文全称是Microsoft Fundation Classes,即微软的基本类 库,MFC的本质就是一个包含了许多微软公司已经定义好的对象的类库, 虽然要编写的程序在功能上是千差万别的,但从本质上来讲,都可以化 归为用户界面的设计,对文件的操作,多媒体的使用,数据库的访问等 等一些最主要的方面。这一点正是微软提供MFC类库最重要的原因,在这 个类库中包含了一百多个程序开发过程中最常用到的对象。在进行程序 设计的时候,如果类库中的某个对象能完成所需要的功能,这时我们只 要简单地 调用已有对象的方法就可以了。我们还可以利用面向对象技术 中很重要的“继承”方法从类库中的已有对象派生出我们自己的对象, 这时派生出来的对象除了具有类库中的对象 的特性和功能之外,还可以 由我们自己根据需要加上所需的特性和方法,产生一个更专门的,功能 更为强大的对象。当然,你也可以在程序中创建全新的对象,并根据需 要不断完善对象的功能。 MFC是Win API与C++的结合,API,即微软提供的WinOS下应用程序的 编程语言接口,是一种软件编程的,但不是一种程序开发语言本身, 可以允许用户使用各种各样的第三方的编程语言来进行对Win OS下应用 程序的开发,使这些被开发出来的应用程序能在 WinOS下运行,比如 VB,VC++,Java,Dehpi编程语言函数本质上全部源于API, 因此用它们开 发出来的应用程序都能工作在WinOS的消息机制和绘图里,遵守WinOS作 为一个操作系统的内部实现,这其实也是一种必要,微软如果不提供 API, 这个世上对Win编程的工作就不会存在,微软的产品就会迅速从时尚变成 垃圾,上面说到MFC是微软对API函数的专用C++封装,这种结合一方面让 用户使用微软的专业C++ SDK来进行Win下应用程序的开发变得容易,因 为MFC是对API的封装,微软做了大量的工作,隐藏了好多内节程序开发人 员在Win下用C++MFC编制软件时的大量内节。 - 10 - 基于 Visual C++ 的桌面游戏设计 正是由于MFC编程方法充分利用了面向对象技术的优点,它使得我们 编程时极少需要关心对象方法的实现细节, 同时类库中的各种对象的强 大功能足以完成我们程序中的绝大部分所需功能,这使得应用程序中程 序员所需要编写的代码大为减少,有力地保证了程序的良好的可调试性。 MFC类库在提供的对象的各种 属性和方法都是经过谨慎的编写和严 格的测试,可靠性很高,这就保证了使用MFC类库不会影响程序的可靠性 和正确性。 在对 Visual C++6.0 和 MFC 有了一个整体上的认识后,并对其编程 原理有了一定的了解,之后的具体工作就有 了一个比较明确的方向。但 就我的设计课题来讲是游戏的设计编程,我想不仅仅是将程序编写出来, 还要认识到对游戏本身的含义,比如说游戏在人们生活中所起到的作用, 应以休闲为主,让人们在繁忙的工作生活中找到一些乐趣。因此,在前期 的准备工作中应该注意到游戏设计的细节问题,确保设计出的游戏有一 定的可玩性。 - 11 - 基于 Visual C++ 的桌面游戏设计 第三章 游戏设计总体介绍 3.1 需求分析 功能描述 我所设计的“连连看”游戏,在整体上实现了游戏界面、操作界面、 声音效果等的功能,在局部上实现了图形重列、系统提示等相关操作。在 功能设计这个环节上,大多数优秀的“连连看”作品都基本上达到了相 同的效果。由于受到了游戏规则的限定,在设计需要考虑的问题并不是 很多。 当游戏正常进行时,游戏者依靠鼠标操作进行点击,当出现游戏界 面中的图片自身形成无法消除的情况时,系统弹出对话框会告知玩家“无 法消除”并自动重列;当玩家在游戏时遇到困难,可以通过菜单里的选 项或直接按下快捷键进行位图重列,也可以用相同的方式利用提示功能 来继续游戏,但这两种功能设计都是有次数限定的。游戏开始时即会有 音乐出现,伴随着美妙的音乐,玩家可以更加轻松的进行游戏。除此以 外,这个“连连看”游戏中,还包括级别选择、暂停游戏、游戏帮助等 辅助功能。 游戏特性分析 与其他游戏相比,这款“连连看”游戏的可玩性更好。不同于大型 游戏中复杂的游戏背景和漫长的游戏情节,“连连看”短小精悍的优点自 不用说,其回合制的游戏方式又比其他关卡式游戏玩的更加方便。它还 可以记录游戏时的最佳时间,并让更多的人尝试去超越(这个我已经试 过了),从而使它更耐玩。在闲暇之余,总是有人会忍不住想去创造更快 的时间,从这个角度讲,游戏这个功能的设计是成功的。从功能上去分 析这个“连连看”游戏的特性,可以看出它所拥有的功能还是比较齐全 的。上面已经介绍了该游戏的一些功能,而在这类游戏中所拥有的功能 已经基本上可以体现在这款游戏中,所以可以说这款“连连看”游戏应 该能够满足不同年龄段人们的娱乐要求,在繁忙的生活中有这样一个游 戏在您的身边,是很惬意的一件事情。 - 12 - 基于 Visual C++ 的桌面游戏设计 3.2 游戏设计思路 在设计“连连看”这款游戏时,首先要了解到其游戏规则:将游戏界面 中两幅符合算法条件的相同的图片连接起来,使其自动消除,并且在一 定的时间范围内消除所有的图片视为游戏胜利,再进入下一关进行游戏。 “连连看”这款游戏流传十分广泛,但随着其不断的发展,越来越多的 玩法也慢慢地出现。因此,为了使整个的游戏设计过程清晰、流畅,要 在设计游戏前对游戏的规则和功能事先有一个详细的安排,这样才会避 免在设计中期出现设计目标不明确的问题,影响进度。 关于“连连看”这个游戏是我和另外的一名同学共同来编写完成,我们 所编写的侧重点不同。我所编写的重点在于游戏画面与动态效果的实现, 所以我研究问题重点就是在界面设计和动态效果的方面,在游戏开始时 界面生成、游戏过程中功能和选项的使用,游戏结束时弹出的对话框内 容的设定是我主要完成的编程内容。如图 3-1 所示,为游戏整体设计流 程图。 - 13 - 基于 Visual C++ 的桌面游戏设计 开始 菜 单 选 退出 放 选择难度 初级 高级 中级 结束 进入游戏界面 消除图片 判 断 是 否 通 关 , 记录分数 图 3.1 整体设计流程 - 14 - 基于 Visual C++ 的桌面游戏设计 游戏界面设计规划 游戏的界面设计,即解决游戏区域问题,在生成窗口的时候可以在一个 特定的区域内获得一个的随机产生的图片的界面。这个问题最简单,但 是却是最花时间的。正所谓:万事开头难。刚开始的时候查阅了许多控 件实现,但由于可用的控件多而杂,而且使用起来差别较大,在选择的 时候不知道应用哪种最为直接简练,经过很长的时间解决了这个最早的 最简单的也是最头疼的问题。以下代码包括界面和菜单中相应选项的相 关内容: //后的内容为注释,算法部分见附录 如图 3-2 所示,为游戏中所包含的所有菜单选项。 图 3-2 游戏菜单设计 - 15 - 基于 Visual C++ 的桌面游戏设计 void CZLLKView::OnMenuFirst // TODO: Add your command handler code here int i,j; int temprand; CString str; CRect rect; //产生随机序列 srand unsigned time NULL ; for i 1;i ROW_NUMBER;i++ for j 1;j LINE_NUMBER;j++ while 1 temprand rand %15; // 产生 0-14 的随机数 if pic_number[temprand] 6 pic_number[temprand]++; llk_map [i][j].state 0; llk_map [i][j].event 0; llk_map[i][j].PicIndex temprand+1; // 1-15 break; //列出每幅图片所有的位置 ListPicPlace ; //初始化事件 InitEvent ; g_userscore 0; - 16 - 基于 Visual C++ 的桌面游戏设计 g_userlevel 1; g_usergate 1; //程序控制 bingame true; bfirst true; DrawRectangleHollow ; m_nUpper 0; DrawProgress m_nUpper ; // 总共 400 个时间 m_nSpeed 2; SetTimer 1,1200,0 ; DrawInfo 120,20,"剩余时间" ; DrawInfo 20,20,"级别:" ; DrawInfo 20,40,"关卡:" ; DrawInfo 20,60,"重列:" ; DrawInfo 20,80,"提示:" ; DrawInfo 540,20,"分数:" ; DrawInfo2 60,20,g_userlevel ; DrawInfo2 60,40,g_usergate ; DrawInfo2 60,60,m_sortnumber ; DrawInfo2 60,80,m_tishinumber ; DrawInfo2 560,40,g_userscore ; DrawMap ; //音效 //if m_soundeffect PlaySound MAKEINTRESOURCE IDR_WAVE_NEWGAME ,AfxGetResourceH andle ,SND_RESOURCE|SND_ASYNC ; - 17 - 基于 Visual C++ 的桌面游戏设计 提示信息 在这段代码中,主要介绍了游戏中的提示功能。当游戏者在游戏过程 中点击菜单栏中的提示选项或者直接按下快捷键时,在游戏界面中将会 使一组未被电击的图片变为点击之后的状况来提示玩家,提示的位置是 随机产生的,并有次数限制,在代码中还说明了将此功能连接到的快捷 键。当提示次数为 0 时,界面中会出现“提示已经用完”的对话框来告 知玩家。 void CZLLKView::BackPicPlace int i; CRect rect; ZYHLLK_PATH *pic NULL; ZYHLLK_PATH *Nextpic NULL; for i 1;i 15;i++ pic pic_place[i]; while pic! NULL Nextpic pic; while Nextpic- next! NULL Nextpic Nextpic- next; if CheckConnection pic- x,pic- y,Nextpic- x,Nextpic- y llk_map[pic- x][pic- y].state 1; llk_map[Nextpic- x][Nextpic- y].state 1; rect.top tiley pic- x ; rect.bottom rect.top+PIC_HEIGHT; rect.left tilex pic- y ; - 18 - 基于 Visual C++ 的桌面游戏设计 rect.right rect.left+PIC_WIDTH; InvalidateRect &rect,TRUE ; rect.top tiley Nextpic- x ; rect.bottom rect.top+PIC_HEIGHT; rect.left tilex Nextpic- y ; rect.right rect.left+PIC_WIDTH; InvalidateRect &rect,TRUE ; return; pic pic- next; return; void CZLLKView::OnMenuInfo // TODO: Add your command handler code here if bingame if m_tish inumber 0 m_tishinumber--; DrawInfo 60,80,m_tishinumber ; BackPicPlace ; else AfxMessageBox "提示已经用完" ; - 19 - 基于 Visual C++ 的桌面游戏设计 void CZLLKView ::OnUpdateMenuInfo CCmdUI* pCmdUI // TODO: Add your command update UI handler code here CString str; str.Format "提示 %d F5",m_tish inumber ; pCmdUI- SetText str ; if m_tish inumber 0 pCmdUI- Enable false ; 重列信息 在下面的这段代码中,主要介绍了游戏的重列功能。当游戏进行时, 如果程序的判断界面中的图片无法继续消除 的时候,会自动弹出提示来 告知玩家,并进行重列。玩家也可以通过菜单栏中的选项或快捷键来实 现这一功能,但有一定的次数限制。程序自动重列不记录次数之内。下 面的代码对此功能的编写、连接等做了相应的说。 void CZLLKView::SortPicPlace int i,j; CRect rect; CDWordArray arPic; for i 1;i ROW_NUMBER;i++ for j 1;j LINE_NUMBER;j++ llk_map[i][j].state 0; if llk_map[i][j].PicIndex 0 - 20 - 基于 Visual C++ 的桌面游戏设计 arPic.Add llk_map[i][j].PicIndex ; //int k 1;//初始化随机数发生器 //int divisor ROW_NUMBER*LINE_NUMBER - k+ 1;index rand % divisor+1 k++ int index; for i 1;i ROW_NUMBER;i++ for j 1;j LINE_NUMBER;j++ if llk_map[i][j].PicIndex 0 index int rand *001+rand *0.1+rand %arPic.GetSize ; llk_map[i][j].PicIndex arPic.GetAt index ; arPic.RemoveAt index ; //重新列出所有图片位置 for i 0;i 15;i++ pic_place[i+1] NULL; ListPicPlace ; //刷新屏幕 rect.top DRAW_TOP+BMP_HEIGHT; rect.bottom BMP_HEIGHT*ROW_NUMBER+DRAW_TOP+PIC_HEIGHT; rect.left DRAW_LEFT+BMP_WIDTH; - 21 - 基于 Visual C++ 的桌面游戏设计 rect.right BMP_WIDTH*LINE_NUMBER+DRAW_LEFT+PIC_WIDTH; InvalidateRect &rect,TRUE ; void CZLLKView::OnMenuSort // TODO: Add your command handler code here if bingame if m_sortnumber 0 m_sortnumber--; DrawInfo 60,60,m_sortnumber ; SortPicPlace ; else AfxMessageBox "重列次数已经用完" ; void CZLLKView ::OnUpdateMenuSort CCmdUI* pCmdUI // TODO: Add your command update UI handler code here CString str; str.Format "重列 %d F6",m_sortnumber ; pCmdUI- SetText str ; if m_sortnumber 0 pCmdUI- Enable false ; - 22 - 基于 Visual C++ 的桌面游戏设计 辅助信息 此段代码中主要讲解了在程序运行过程中的一些特殊情况。例如, 当玩家的游戏时间结束而并没有完成游戏的失败提示语以及菜单栏中的 帮助信息等。 void CZLLKView ::OnTimer UINT nIDEvent // TODO: Add your message handler code here and/or call default if m_nUpper 400 m_nUpper m_nUpper+m_nSpeed; DrawProgress m_nUpper ; else KillTimer 1 ; MessageBox _T "你的时间用完了,SORRY!" ,_T "ZYH 连连看 " ,MB_YESNO ; //调用排行榜 OnMenuBack ; CView::OnTimer nIDEvent ; void CZLLKView::OnMenuHelp // TODO: Add your command handler code here AfxMessageBox "还要帮助,\n 连连看这么流行了,是个人都知道怎 么玩吧\n 不好意思,说过分了,好好玩吧。\n 祝你好运了" ; 位图的生成 在游戏界面出现时,在此框架中要随即生成一个有 90 个图片的游戏 - 23 - 基于 Visual C++ 的桌面游戏设计 界面,图片产生的位置都是随机出现的,其链接都是在编程是导入到 Visual C++程序中的。 但首先,最基本的就是关于程序图片的位置怎么获取,以及如何控 制。这里采用最常用的方法――数组。考虑到图片是多行多列的格式。 所以采用二维数组(数组名为 flag[])的方式来控制比较直观,并统一 在不同过程中用名为 i 和 j 的变量来分别表示行列。程序开始时给数组 中的各个元素赋初值为 0,即表示没有图片。 然后数组控制整个游戏区域,游戏区域最外围为空白区域,即相关 元素的值为 0。这样就可以保证游戏刚开始后,第二层显示的图片之间 的相连路径处理时就没有阻碍了。 其中 flag[]数组具体控制图片的过程是,首先,由于每张图片显示 的宽度*高度为 62*68,所以整个控件设置为 620*612。而每张图片可以 用 flag[i,j] 来 表 示 , 它 在 image 内 部 的 位 置 为 x i*62 到 i+1 *62,y j*68到 j+1 *68 这样 image控件内的一点 M x,y 所对应的 图片就可以转化为数组 flag[i,j]的值来判断。 由于这个程序的界面并不是很复杂,所以用到的控件也不多,主要 核 心 内 容 还 是 后 台 的 代 码 设 计 。 图 片 的 随 机 生 成 主 要 是 用 到 一 个 random 函数将随机数赋值给 flag[]数组中的每个元素,然后根据数组 元素值,来显示图片。 游戏的整体界面由游戏界面、菜单选项工具条、时间进度条等部分 组成,其中对游戏界面的编写最为复杂。菜单的设计很直接,只需要在原 有生成的菜单栏中对 ID 做一些相应的改变,新的游戏菜单就完成了。而 像时间进度条等这一类特定的游戏界面来说 ,还需要在编写时创建新的 函数来定义,才可以实现。对于最为重要的游戏主界面的设计则需要一 系列相关的操作,例如对变量的定义、声明及其之后在 CPP 文件中的使 用都不能出现偏差,才能确保成功。 void CZLLKView::InitMap int i,j; for i 0;i VIRTUAL_ROW;i++ - 24 - 基于 Visual C++ 的桌面游戏设计 for j 0;j VIRTUAL_LINE;j++ llk_map[i][j].PicIndex 0; llk_map[i][j].state 0; llk_map[i][j].event 0; for i 0;i 15;i++ pic_number[i] 0; pic_place[i+1] NULL; void CZLLKView::InitEvent int i,x 0,y 0,tempx,tempy; int randevent,randplace; for i 0;i 5;i++ //总共 5 次事件 //随机计算 位置 randplace rand % ROW_NUMBER*LINE_NUMBER +1; tempy randplace%LINE_NUMBER; tempx randplace/LINE_NUMBER; if tempx! x&&tempy! y x tempx; y tempy; //随机事件 randevent rand %3+1; //4 为 事件总数 llk_map[tempx][tempy].event randevent; - 25 - 基于 Visual C++ 的桌面游戏设计 游戏动态效果实现 伴随着游戏开始,动态效果也会出现在玩家的眼前,比如当游戏者点 击两幅相同的图片时,有一条线路来连接这两个图片,并使图片消失,这 就是一种最简单的动态效果的实现。另外在游戏过程中,应根据图片不 同的点击情况发出不同的音效,并且在游戏伴有音乐,使玩家可以更加 的放松心情。 对于动态的效果部分程序的编写其实也是一个难点,原因在于制作 游戏对所呈现的效果达到怎样的期望。在借鉴了其他游戏的范例以后, 发现这部分代码的编写具有极大的灵活性,不同的想法会产生一样的效 果,而通常情况下一个位置只能插入一类代码,并存的效果只能使画面 显得更加的冗余,所以对动态效果的选择一方面要看编译后实现的具体 情况,另一方面注重在编写时尽量简练明了 ,这样同时也便于之后对代 码功能的测试。 void CZLLKView::OnLButtonDown UINT nFlags, CPoint point // TODO: Add your message handler code here and/or call default int iTop,iLeft,iRight,iBottom; CRect rect; iTop DRAW_TOP+BMP_HEIGHT; iBottom iTop+BMP_HEIGHT*ROW_NUMBER; iLeft DRAW_LEFT+BMP_WIDTH; iRight iLeft+BMP_WIDTH*LINE_NUMBER; //进入了游戏,并且鼠标在这个范围内 if bingame&&po int.x iLeft&&point.x iRight&&point.y iTop& &point.y iBottom if bsoundeffect PlaySound MAKEINTRESOURCE IDR_WAVE_DOWN ,AfxGetResourceHand - 26 - 基于 Visual C++ 的桌面游戏设计 le ,SND_RESOURCE|SND_ASYNC ; int tempx,tempy; // 地图中的行列值 int xtempindex,ytempindex; tempy point.x/BMP_WIDTH; tempx point.y/BMP_HEIGHT; xtempindex tempx-1; ytempindex tempy-2; CString str; //所点击图形编号大于 0 就是此位置有图像 if llk_map[xtempindex][ytempindex].PicIndex 0 if bSecondClicked //是第二次点击 //str.Format "%d,%d,%d,%d,%d,%d",xtempindex,ytempindex,xindex, yindex,llk_map[xtempindex][ytempindex].PicIndex,llk_map[xindex ][yindex].PicIndex ; //AfxMessageBox str ; //判断点击的是不是上次点击的图片 if xtempindex xindex && ytempindex yindex //如果 是 llk_map[xtempindex][ytempindex].state 0; rect.top tiley xtempindex ; rect.bottom rect.top+PIC_HEIGHT; rect.left tilex ytempindex ; rect.right rect.left+PIC_WIDTH; InvalidateRect &rect,TRUE ; - 27 - 基于 Visual C++ 的桌面游戏设计 //DrawFace xtempindex,ytempindex,llk_map[xtempindex][ytempi ndex].PicIndex,0 ; else//如果不是上次点击的图片 判断图片类型是否 相同 if llk_map[xtempindex][ytempindex].PicIndex llk_map[xindex ][yindex].PicIndex //如果图片类型相同:判断是否连通 xindex yindex xtempindex ytempindex bsuccess CheckConnection xindex,yindex,xtempindex,ytempinde x ; if bsuccess //如果连通 则消除 并且更 新 图片位置列表 //判断连击次数 newtime timeGetTime ; if newtime-oldtime 2000 m_dotNumber 0; else m_dotNumber++; oldtime newtime; //如果连击次数大于 0 //更新用户分数 g_userscore+ m_dotNumber*50; g_userscore+ 100; DrawInfo2 560,40,g_userscore ; - 28 - 基于 Visual C++ 的桌面游戏设计 // 更新连机次数 CString str; if m_dotNumber 0 str.Format "连击%d 次 ",m_dotNumber ; DrawInfo3 140,70,str ; //更新滚动条 m_nUpper+ 5; //更新图片位置列表 ReleasePicPlace llk_map[xindex][yindex].PicIndex,xindex,yin dex ; ReleasePicPlace llk_map[xtempindex][ytempindex].PicIndex,xt empindex,ytempindex ; if bsoundeffect PlaySound MAKEINTRESOURCE IDR_WAVE_OK ,AfxGetResourceHandle ,SND_RESOURCE|SND_ASYNC ; //把该位置图片号设为 0 llk_map[xtempindex][ytempindex].PicIndex 0; llk_map[xindex][yindex].PicIndex 0; rect.top tiley xtempindex ; rect.bottom rect.top+PIC_HEIGHT; rect.left tilex ytempindex ; rect.right rect.left+PIC_WIDTH; InvalidateRect &rect,TRUE ; - 29 - 基于 Visual C++ 的桌面游戏设计 //DrawFaceBlank xtempindex,ytempindex ; rect.top tiley xindex ; rect.bottom rect.top+PIC_HEIGHT; rect.left tilex yindex ; rect.right rect.left+PIC_WIDTH; InvalidateRect &rect,TRUE ; //DrawFaceBlank xindex,yindex ; //判断位置事件 if llk_map[xtempindex][ytempindex].event 1||llk_map[xindex ][yindex].event 1 m_tishinumber++; DrawInfo3 140,70," 将奖励提示 1 次 " ; else if llk_map[xtempindex][ytempindex].event 2||llk_map[xindex][yin dex].event 2 m_sortnumber++; DrawInfo3 140,70,"将奖重列 1 次 " ; else if llk_map[xtempindex][ytempindex].event 3||llk_map[xindex][y index].event 3 g_userscore+ 100; - 30 - 基于 Visual C++ 的桌面游戏设计 DrawInfo3 140,70,"将奖分数 100" ; else // 不连通 if bsoundeffect PlaySound MAKEINTRESOURCE IDR_WAVE_NO ,AfxGetResourceHandle ,SND_RESOURCE|SND_ASYNC ; llk_map[xindex][yindex].state 0; rect.top tiley xindex ; rect.bottom rect.top+PIC_HEIGHT; rect.left tilex yindex ; rect.right rect.left+PIC_WIDTH; InvalidateRect &rect,TRUE ; else //图片类型不同 if bsoundeffect PlaySound MAKEINTRESOURCE IDR_WAVE_NO ,AfxGetResourceHandle ,SND_RESOURCE|SND_ASYNC ; llk_map[xindex][yindex].state 0; rect.top tiley xindex ; rect.bottom rect.top+PIC_HEIGHT; rect.left tilex yindex ; rect.right rect.left+PIC_WIDTH; InvalidateRect &rect,TRUE ; - 31 - 基于 Visual C++ 的桌面游戏设计 //DrawFace xindex,yindex,llk_map[xindex][yindex].PicIndex,0 ; xindex -1; yindex -1; else //是第一次点击 llk_map[xtempindex][ytempindex].state 1; rect.top tiley xtempindex ; rect.bottom rect.top+PIC_HEIGHT; rect.left tilex ytempindex ; rect.right rect.left+PIC_WIDTH; InvalidateRect &rect,TRUE ; xindex xtempindex; yindex ytempindex; //判断是否消完,弹出对话框 纪录分数 if IsPicEmpty //已经消完 //PlaySound MAKEINTRESOURCE IDR_WAVE_WIN ,AfxGetResource Handle ,SND_RESOURCE|SND_ASYNC ; bingame false; KillTimer 1 ; //对话框 CAddDlg adddlg; if adddlg.DoModal IDOK - 32 - 基于 Visual C++ 的桌面游戏设计 OnMenuBack ; else // !IsPicEmpty //没有消完 //判断是否无解 if IsNoConnection AfxMessageBox "已经无法消除",MB_OK ; OnMenuBack ; bSecondClicked !bSecondClicked; CView::OnLButtonDown nFlags, point ; 3.3 游戏设计流程 图 3-3 中主要描述了游戏在运行时,进入逻辑判断的流程图,并通 过这些判断来执行图片的消除功能。 - 33 - 基于 Visual C++ 的桌面游戏设计 开始 y e 判断直 线 no 判断第一 个 y es no 判断第二 个折点 y es no 判断图片是
/
本文档为【基于VC 的桌面小游戏的研究与开发(游戏画面与动态效果的实现)】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索