毕业设计(论文)VC++城市之光游戏软件设计_第1页
毕业设计(论文)VC++城市之光游戏软件设计_第2页
毕业设计(论文)VC++城市之光游戏软件设计_第3页
毕业设计(论文)VC++城市之光游戏软件设计_第4页
毕业设计(论文)VC++城市之光游戏软件设计_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1 绪 论1.1 课题的意义及目的在这个发展的信息时代,游戏也随着社会科技的发展也发生了的形形色色的变化,最初的从一些纸牌游戏、棋盘游戏和一些非视频的游戏、逐步走向多元化,视频游戏的出现给了我们一个视觉的冲击,然而在我们注重视觉享受的时候渐渐的忘记了一些经典纸牌,棋盘游戏给我们带来的乐趣,当今的网游赤裸裸的停留在商业价值上,往往忽略了社会影响,对于心智没有完全成长的青少年造成不良影响,现在家长谈游戏色变,因此建立一个“寓教于乐”的游戏系统迫在眉睫,使得青少年在游戏的愉快过程中获得思维心智及沟通技能的成长,逐渐扭转社会对于游戏业的不信任,获得他们的认同。国内的游戏产业还停留在发展阶段、并不成熟,

2、对益智游戏方面的理论基础尚不扎实,虽说总有口号提出要制作有社会效应的游戏,但是由于缺乏理论支持而力不从心。我们明白不需要什么,但是不清楚我们需要什么样的游戏,所以我们要借助系统思考的工具,为我们提供足够的理论支持,我们要清楚我们需要什么。我们希望系统思考类游戏为所有的参与者提供了一个对战的舞台,它将游戏与学习有机的结合在一起,充分调动起参与者的兴趣与积极性,通过玩来锻炼参与者的思维逻辑能力,并能学习到一些相关知识,可谓有百利而无一害。同济思梯城市之光益智游戏是以系统动力学sd的系统思考理论为基础、计算机软件为辅的,旨在用实物牌提高玩家社会交往能力、想象力、英语会话能力、系统思考逻辑性的游戏系统

3、。该游戏系统打破了传统的益智游戏模式,是我国益智游戏开发领域的一次探索,而其中融入的系统动力学理论也为之注入了新的活力,让它在同类产品中更显突出。从本质上说,为系统思考游戏所设定的规则本身就是模拟现实的,是对现实生活某一局部规则的抽象和概括。所以对系统的抽象是游戏规则设定的关键所在,应该将复杂的社会的局部系统转化成为精辟的能够进行模拟的游戏系统。利用最简单的方式来描述较复杂的竞争过程是系统思考游戏开发的根本工作之一。1.2 系统思考游戏的理论基础本课题是基于系统动力学(system dynamics ,简称sd)的益智游戏系统,涉及计算机技术、控制技术、管理技术等交叉学科。系统动力学是创始于1

4、956年,是研究信息反馈的一门科学,是系统科学的一个分支,它在进行系统研究方面以微分方程作为理论工具,建立适合研究复杂系统的技术。 (1)系统动力学提出因果关系及流位流率系的反馈结构模型方法。(2)系统动力学具有专门的便于参数调试的系统动力学仿真语言1.3 本文所做的主要工作第二章介绍系统思考游戏的开发环境:vc+,着重介绍了在本次设计中经常用到的内容。第三章详细介绍了游戏设计前的整体构思,游戏主要数据结构的设计(包括如何建立和相关数据的操作),以及游戏中各种控件和函数的设计和实现。第四章详细介绍了如何把这个游戏的模型发展成通用的系统思考游戏模型,以提供发展,研究的使用。第五章对前几章做了总结

5、,介绍了设计时遇到的主要困难,并指出了游戏设计中的不足和改进的方向。一部分主要源程序作为附录,附在文章后面。2 系统思考游戏的开发环境城市之光系列iq快车的快速版(后成为快速版)游戏是以益智为目的逻辑性很强的游戏,涉及逻辑关系比较复杂。游戏画面以纸牌为主,所以他要用到的开发工具相对也不多。主要由vc+完成,以下就vc+集成开发环境中使用的一些主要工具的作用作一下简单的介绍,并介绍其中所用到的一些主要的功能。2.1 visual c+ 简介visual c+以c+语言为基础,支持面向对象的程序设计方法(object-oriented programming),支持mfc(microsoft fo

6、undation class)库类编程,有强大的集成开发环境developer studio(其中包括程序自动生成向导appwizard、向导类class wizard和各种资源编辑器,以及功能强大的调试器等可视化和自动编程辅导工具)visual c+可以用来开发各种类型、不同规模和复杂程度的应用程序,开发效率高,生成的应用软件代码品质优良。使得visual c+成为许多专业程序开发人员的首选。本游戏主要用visual c+ 6.0完成。2.2 面向对象的思想面向对象程序设计(object-oriented-programming,简称oop)是c+区别于c语言的主要特征面向对象的程序设计方法

7、是对面向过程设计方法的继承和发展,它吸取了面向过程程序设计方法的优点,同时又考虑到现实世界与计算机空间的关系。面向对象的程序设计方法认为,客观世界是由各种各样的实体组成的,这些实体就是面向对象方法中的对象。对象是包含显示世界物体特征的抽象实体,反应了系统为之保存信息和与之交换的能力。每个对象都有各自的内部属性和操作方法,整个程序由一系列相互作用的对象构成,对象之间的交互通过发送消息来实现。类是指具有相同属性和操作方法,并遵守相同规则的对象的集合。类是对象集合的抽象,规定了这些对象的公共属性和方法;对象是类的一个实例。2.2.1 面向对象的基本特征面向对象设计方法是迄今为止最符合人类认识问题的思

8、维过程的方法,具有4个基本特征:(1)抽象(abstract):抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象包括两个方面,一时数据抽象,二是代码抽象。(2)封装(encapsulation):封装是面向对象的特征之一,是对象和类概念的主要特征。封装保证了类具有较好的独立性,防止外部程序破坏类内部的数据,使得程序的维护修改较为容易。对应用程序的修改仅限于类的内部。(3)继承(inheritance):一个新类可以从现有的类中派生出来,这个过程称为继承。新类继承了原类的特征。(4)多态性(polymorphism):多态性是指允许不同的类的对象对同一消

9、息做出响应。2.2.2 类与对象(1)在c+中,使用类来声明对象前应该定义其结构,类是用保留字class来定义的 。其定义格式如下:class private:;protected:;public:;(2)成员函数的一般形式: : ()(3)对象是类的实例,对象也必须说明才可以使用。说明一个对象的一般形式: ,;2.3 visual c+集成开发环境简介visual c+集成开发环境developer studio 提供了大量支持可视化编程特性的使用工具。2.3.1 appwizard工具为了appwizard(应用程序向导)是visual c+提供的一个高级编程工具,它可以产生应用程序的c+

10、源代码框架。通过与另一个工具class wizard配合使用,可大大节省卡发应用程序的时间和精力。appwizard是一个标准的c+源代码生成器,她通过一系列对话框来提示用户所建程序的信息。用户还可以指定所建应用程序是否具有某些特性,如是否多文档界面或者是否带工具栏,是否支持数据库、ole等。设置完成后,appwizard生成一些构成应用程序的框架的文件。用户可以对它进行编译并运行。但是,这个程序不能完成任何工作,只是为了方便用户继续添加代码提供框架,节省时间。2.3.2 工程和工程工作区工程工作区是developer studio的一个重要组成部分,大部分工作都要在developer stu

11、dio完成。developer studio使用工程工作区来组织工程、元素以及工程信息在屏幕上出现的方法。在一个工程工作区中,可以处理;(1)一个工程和它包含的文件(2)一个工程的子工程(3)多个相互独立的工程(4)多个相互依赖的工程如图2.1所示:图2.1工程工作区窗口2.3.3 class wizard工具class wizard是一个交互式工具,用来建立新类,吧消息映射成类的成员函数,或者把控制框映射为类变量成员。在程序开发过程中,可以用class wizard建立程序所需的类,包括消息处理函数和消息映射函数。class wizard可以完成下列事情:(1)支持从许多应用程序框架基类中派

12、生新类;(2)为类添加消息映射函数;(3)查看和编辑消息处理函数;(4)创建新类时自动加入方法和属性等。如图2.2所示:图2.1class wizard工具2.3.4 wizard bar工具栏wizard bar是一个可停泊的工具栏,可与class wizard配合使用。她主要用于快速访问developer studio最使用额一些功能,比如class wizard或者clas view的一些功能。2.4 micorsoft基本类库与应用程序框架应用程序框架(application framework)是一个完整的程序模型,它具备了标准应用软件所需要的一切基本功能,以及这些功能的接口。由于w

13、indows操作系统是micorsoft的产品,而mfc也是micorsoft的产品,自然我们要选用mfc(micorsoft foundation class)这样的库类作为应用程序框架。mfc实现了对应用程序概念的封装,把类、类的继承、动态约束、类的关系和相互作用等封装起来。这样封装的结果对程序员来说,是一套开发模板(或者说模式)。针对不同的应用和目的,程序员采用不同的模板。mfc提供了一个windows应用程序开发模式,对程序的控制主要是由mfc框架完成的,而且mfc也完成了大部分的功能,预定义或实现了许多事件和消息处理,等等3 快速版(fast)的设计过程城市之光游戏快速版的设计,大致

14、分为3个过程:构思,主要类的设计和控件以及消息函数的设计。以下我将分别主要就这3个方面,对游戏的设计过程做一个较为详细的介绍。3.1 游戏规则整理与设计构想在设计游戏之前必须对游戏的规则进行整理,了解游戏规则后才能进行设计,本游戏是纸牌形式的游戏,但是和传统的纸牌有很大的差异,并不是以数字来衡量牌的大小,而是通过牌的颜色和能量形成石头剪子布的相互克制的关系,这是本游戏的最大特点,如下图3.1我们看到的牌的样式。 图3.1游戏牌样式(从左边起分别是 红,蓝,黄)游戏牌以红克制蓝、蓝克制黄、黄克制红为基本逻辑关系,并且有能量大小之分,牌右上角的是自身的颜色和能量数,左下角为它能阻止的颜色与能量数,

15、每张牌有自己的属性。每个玩家手中各有一副牌45张,每次出牌是进行行动,阻止行动,行动成功等状态,牌的状态分为已使用和未使用,未使用的又要分为手上的拍和待用的牌。设计时主要构思是处理如何识别牌的颜色并且进行运算,同时映射控件消息处理函数和处理画面的变化,其中牌的定义是核心的问题,只要定义好的牌的属性和参数,再映射控件就可以完成游戏的基本框架的构架。针对游戏规则游戏的设计结构,从顶层控件到底层的结构的框架设计,如下图3.2所示:3.2 游戏的体系结构设计游戏体系结构计划的关键在于概念性因素、艺术性因素或者游戏可玩性因素与技术需求联系在一起。如果将设计设想为游戏所要达到的一种完美形式。体系结构就是制

16、定将现实状态转化为完美形式的策略。一个完美的体系结构应试图达到:(1) 模块化 将项目分成完全封装的模块的好处是每个模块都可以独立测试、修改或被代替而不会影响系统的其他部分。(2) 重用性 每次都重新发明轮子毫无意义,应将模块设计成可扩展、可移植的,这样就可将它们插入到其他项目中。控件,7个控件,代表玩家手中的7张牌:card1 card2.card7玩家与电脑手中牌:*card_hand27玩家(1,2)的 各自 的总牌:card245由随即函数初始化洗牌未使用的牌:使用标识为true已用牌:使用标识为false新定义牌的类 card:要求包括所有纸牌的 信息,并且具有拓展更新的余地,如牌i

17、d号,对应的图片,颜色,使用标识等顶层底层一副牌的具体对象:定义各张牌从未使用牌里选取牌,把手中牌的指针指向未使用牌出牌确认后改变标识根据规则,通过某些函数改变标识,图3.2游戏结构设计框图(3)健壮性 只有建立的体系结构解放了模块间的互相依赖才能获得高效:他们可以在各种意想不到的环境下运行。(4)可追踪性 项目计划是直接从体系结构集成出来的,它产生进度表允许对项目过程进行实际的度量。本游戏的系统并不复杂,关键在于逻辑的设计上,基于上述观点,着重在重用性上要做好规划,要实现后面模型的提取和扩展使用,基础类的设计是至关重要的,下面就详细讲述设计思想与过程。3.2.1 游戏核心类的设计过程类是实体

18、的抽象,分析纸牌的特点,每张牌的共同特点是拥有自己的颜色,可阻止的颜色,能量大小,和对应牌的位图,并且携带使用标识等等。类的定义步骤:(1) 首先使用file | new命令,在projects标签中选择mfc appwizard(exe)建立一个完整的基于对话框应用程序框架。由于本游戏结构并不复杂,设置时基本只是有默认设置就可以了。(2) 用insert | new class 为工程添加新类如图3.3所示: 图3.3添加新类,并命名(3) 添加成员函数:根据牌的特性,先定义id号,可能暂时不会被使用,但是是必要的,在调试是时候用来跟踪数据流向,然后定义枚举形颜色: enum color /

19、定义牌的颜色null=0,r,b,y,g;由于枚举性可以参与整形参数的计算,所以在比较牌大小时候就可以运用一些数学方法达到石头剪子布的比较效果。然后是具体的参数设置,如下图3.4所示: 图3.4给类添加成员变量在设置参数时候应该首选为私有(private)方式,这样可以保护成员变量不能被外部函数修改,只有内部成员函数才能访问并修改它。这样设置之后可以通过设定基本的属性就能定义出不同的牌,而且用于继承和发展,套用到别的类型的纸牌上。3.2.2 成员函数的设计在生成了card类之后,要完成灵活的数据使用,还要为card类定义成员函数。成员函数是在保护内部数据的同时连接外部数据的桥梁,在保护内部成员

20、变量的前提下要使用、修改内部数据就只能通过成员函数进行。根据c+的语法,先在新类card.h(头文件)文件里,定义成员函数的说明。然后在card.cpp中具体定义每个成员函数。(1)首先面对玩家需要从对象中抽取位图id,使得对应的控件可以显示正确的位图,这样才有可交互性,所以需要能抽取对象里的位图id号的函数:int card:getcardid()(取牌id)、 int card:getbitmapid()(取位图id)。(2)进行牌的比较的时候需要抽取颜色、能量信息,所以需要一系列抽取这类信息的成员函数:int card:getmpower()(取自身能量值)、int card:getpp

21、ower()(取阻止能量值)、enum color card:getmcolor()(取颜色)、enum color card:getpcolor()(取阻止颜色)。(3)在出牌比较后,出牌成功了,需要改变牌的使用标记,所以需要定义修改标记参数的成员函数,并且可以双向修改,可供规则的扩展使用(比如能从使用过的牌中拿回一张牌之类的特殊规则):void card:sendcards()(出牌)、void card:getbackcard()(使用过的牌拿回) 如图3.5所示: 图3.5在cpp中添加成员函数的函数体 最后要用构造函数进行初始化,构造函数(constructor)定义了创建对象的方法

22、,提供了初始化对象的一种简便手段,与构造函数相队形,析构函数(destructor)用于撤撤消一个对象。,在创建对象时系统自动调用构造函数,如果定义了带参量的构造函数就可以再说明对象的时候用实参对对象进行初始化,这里采用在构造函数的函数体中进行初始化。数据成员初始化如下图3.6所示:图3.6初始化函数的定义之后就可以用函数创建对象,同时对其参数进行初始化了:card (,);通过这个语句,就可以定义想要用的牌,接下去详细定义游戏牌。详细定义代码见附录a。3.3 游戏的控件与函数功能设计与实现本游戏的用户界面分为菜单,玩家牌,行动按钮等几个部分,中间需要涉及很多,位图操作,消息函数映射,控件的实

23、时变化操作。由于游戏的逻辑较复杂,所以控件与函数的设计要先理清楚关系,许多函数需要在不同的地方重用,或者交替的出现在控件的映射里面,根据前面的结构设计框图由外到内的进行,主要控件和函数的关系设计如下图3.7所示。开始函数数据初始化控件初始化洗牌随机函数玩家牌控件动作控件出牌函数比较函数位图控制函数桌面清楚函数摸牌函数图3.7控件与函数关系图下面就介绍游戏设计中具体运用的一些手段和算法思想。3.3.1 界面菜单设计和实现本课题游戏主界面是面向用户的,需要有简洁明了的特性,尤其是纸牌类型游戏,主要在于逻辑设定,并不需要华丽画面,可以在对话框的属性设置里面去掉windows的title bar风格,

24、使得画面变的简介,如图3.8所示图3.8调整对话框属性设置之后对话框会变成没有蓝色边的形式,方便以后的设置和菜单的放置。接下来要生成菜单并连接到对话框上面,通过工作区窗口的resourceview生成一个菜单资源,并且附有一个id,通过对话框属性设置(dialog properties)对话框,为menu属性对应的下拉框选择idr_menu1导入到对话框里,如图3.9:图3.9添加菜单资源并导入对话框中这样菜单在运行时显示在主对话框的顶部。如图3.10所示:图3.10导入对话框后的界面接下来设定菜单选项,考虑到要使用功能。应该设置:(1)开始函数 用来游戏开始的入口函数,游戏初始化的,里面包括

25、洗牌函数,界面控件初始化设置函数等等(2)难度选择 游戏完善设计时可以做扩展使用。(3)帮助文档 输入关于游戏的说明图文。(4)退出游戏如图3.11所示:图3.11菜单设置 然后在对话框上添加一系列的位图控件,用来显示界面的位图,可以多放置一些,以准备添加功能或者备用。同时对每个控件定义好自己的id,然后添加cstatic类型数组m_cardn与这些控件相关联,可以通过数组的系统的操作控件变化和鼠标消息映射。如图3.12所示在对话框放置控件:(控件位置在后面的初始化中设置)图3.12放置控件,属性设置为位图3.3.2 游戏初始化的函数设计与实现菜单设置后就是初步的建立了一个友善的界面,应该对控

26、件的位置进行初始化了,对窗口大小,静态控件位置、动态控件位置的初始化,以及位图资源的调用初始化。玩家要通过自己来选择桌面上的牌来完成自己的行动,或出牌、或放弃。由于是面对玩家的控件,必须实时更新显示的牌,并且有用户可以接受的交互式的效果出现。于是对控件位置的交互式操作就是一个比较重要的部分,所有的游戏都必须设计到动态的控件否则就不能称为游戏。在自动生成函数框架里面有一个bool cstf1dlg:oninitdialog()函数,在里面应该添加一些游戏初始化的设置。因为需要初始化的内容比较多,所以分类进行说明:(1)主对话框的初始化。在运行程序时对话框应该与画面大小相同,于是使用 setwin

27、dowpos(null,0,0,1024,768,swp_nomove);为主对话框设置了1024768的大小。(2)控件的位置设置。由于是供给玩家看和操作的控件,就必须在游戏开始时候做位置设定:m_cardn.setwindowpos(null,x坐标,y坐标,0,0,swp_nosize);(3)位图资源的初始化。在资源库中把位图导入后还必须使用变量导入程序中,参加程序的运行,所以先在头文件定义cbitmap类型的数组,在初始化中把位图载入cbitmap结构中,详细代码见附录a。(4)随机函数初始化。由于游戏中要用到洗牌的算法,自然会出现随机函数的应用,在c+中随机函数的初始化是必要的,在

28、运行程序的是就必须初始化一次。使用srand(unsigned)time(null)对随机函数进行初始化。3.3.3 位图的操作函数的设计与实现在游戏编程里对声音图像的操作要比别的程序要求更高,本课题的游戏也涉及比较复杂的位图操作,包括显示、隐藏、刷新、选中放大、移动等一系列的位图操作。首先要对背景定义一个位图,然后要给玩家的牌定义位图,由于控件较多并且有重复性,于是使用循环算法来给控件添加位图。由于调用位图的功能经常使用,因此把该功能定义成函数十分必要,在后面编写控件的函数时可以很简洁的调用。由于已经把所有的位图编写入了数组里面,所有的控件也有数组相联系,所以该位图操作函数(setbitma

29、p)的传递参数就可以设定为:控件id号,位图id号,缩放倍数。就可以在任意的控件上显示任意一个位图的任意倍数。在vc+中位图操作比较复杂,位图的显示过程稍微复杂些,所以在这里详细说明一下。(1)首先应建立一个合适的内存设备环境:(cdc对象)cdc pkdc;(2)创建一个cclientdc对象,并把需要显示的控件的指针传给它:cclientdc dc(&m_cardn);(3)然后调用createcompatibledc函数在内存中准备图像:pkdc.createcompatibledc(&dc); (4)将位图导入该设备环境:pkdc.selectobject(bitmapno);(5)最

30、后使用cdc:stretchblt函数来绘图: cdc: stretchblt函数原型为:bool stretchblt(int x , int y , int nwith , int nheight , cdc*psrcdc , int xsrc , int ysrc, int nsrcwidth , int nsrcheight , dword dwrop);根据两个参数nsrcwidth nsrcheight与xsrc ysrc配合可以确定位图中的一个矩形区域,用过nwith nheight 可以实现图像的缩放输出。下面的图3.13是在为背景设置位图后游戏的运行后的窗口界面:图3.13游

31、戏运行后的界面窗口现在的游戏界面已经形成,在运行该游戏的时候,内部已经调用oninitdialog()函数,完成的最初的设置,然后点击菜单中的开始游戏就可以开始游戏了,之后就要涉及控件的设置了。3.3.4 控件消息映射设计和实现在设置好了初始化参数和位图操作的函数之后就可以进行控件的交互式设计了,在开始游戏时,我们需要对每个需要显示的控件贴上相应的位图,并且要做一些游戏的参数的初始设置,区别开前面的初始化,这里做的是游戏参数的设置,每次点击都要做重新开始游戏的参数设定,所以与总体的初始化分开。这里开始函数onstart()是关键的函数它要完成四个功能:(里面使用到的几个函数是游戏运行中比较关键

32、的函数,在后面作具体的实现说明)(1)为两个玩家分别进行洗牌。使用随机洗牌的算法,从card的以定义好的牌对象中打乱顺序赋值到当前的玩家牌堆数组中,完成洗牌工作。(2)使用一组指针指向前七张牌,标识为玩家手中的七张牌,并且另一个指针指向玩家牌堆的第八张牌,在摸牌函数算法中使。(3)根据手中标识的牌,抽取位图id,到当前对应的控件上。并给其他每个控件相应位图设置。(4)初始化一些算法中要使用的辅助参量。 点击开始按钮后如图3.14所示:图3.14游戏开始后的界面窗口接下来需要完成控件的交互式操作,实时改变控件的位置,做点击选中效果。画面下方的七张牌为用户玩家可操作的控件,分别联系着玩家牌堆中的前

33、七张牌。玩家需要选择想出的牌,并且玩家能识别已经被选定。所以设计被选择的牌向上方移动一定距离,以区别未选中的牌。并且在右边显示其放大的效果,让玩家可以看清楚牌的属性,如图3.15所示。实现方法是:给每个控件一个独立的辅助变量,初值为1,每点击一次控件自相乘一个 1,由1和1来标识控件当前的状态,再通过函数setwindowpos来控制本控件的位置转变,实时的对控件的位置进行刷新,并且出牌后需要对空间进行隐藏。详细代码见附录b。右边的放大控件是直接从牌控件中抽取位图id,然后调用位图显示函数setbitmap,把传递参数填好,就能完成此功能。 图3.15控件点击功并放大显示功能实现在选中牌之后玩

34、家可以点击右下方的出牌按钮把牌打到桌面上。或者如果电脑出牌后,玩家任务需要放弃的话,可以点击放弃按钮。并且按照游戏规则在玩家前面用分数牌来计分。游戏中牌是行动和阻止的关系,游戏过程中的界面如图3.16所示: 图3.16游戏进行中的画面和一般纸牌游戏一样,在每轮结束后需要清楚桌面上刚刚出过的牌,于是:可以利用一个控件进行局部的刷新,这时需要一个刷新函数clear,定义一个刷新函数,在每次完成一轮后,要刷新桌面的图形,并且给玩家发新牌。同样落脚点在位图信息的抽取和操作上。这样控件消息处理设计就完成了,最后还要配合一系列的动作函数,才能进行游戏。下面讲述一些关键的函数的设计构思和实现。3.3.5 用

35、于逻辑算法的函数设计与实现本课题纸牌游戏的主要难点在洗牌、出牌、摸牌的函数设计上,几个函数是维持游戏的关键函数。(1)首先洗牌函数initialcard,由于是吧有序的牌打乱然后放到玩家牌堆里,所以要求取过的随机数就能再使用了,于是要定义辅助参数数组,记录改随机数数否被取过。函数流程图如图3.17所示:(具体代码见附录c)生成随机数rrandr=0playercardr=cardn;randr=0?初始化randr是否全部rand45=0?否结束洗牌是 图3.17洗牌函数的流程图成功定义出牌函数后,每次按开始游戏,都要了用两次该函数为两玩家进行牌的初始化。(2)摸牌程序getcard,由于每轮

36、都要摸牌,然而使用过的牌有不能再次使用,流程图如下图3.18所示:手中牌是否出搜索控件标识+1使用标识是否以使用并且在手中牌堆搜索+1该控件指针指向该牌,牌堆搜索+1是否所有控件都完成摸牌结束是否是否是否图3.18摸牌函数流程图(3)出牌算法。要判定数否允许出牌,则需要储存当前最后一张牌的信息,然后与当前选中牌比较信息并返回bool类型的值用来判断出牌是否执行。流程图如图3.19所示:(由于该流程的判断与游戏规则关系密切,主要写大致的走向,详细情况还要根据桌面牌情况、行动情况、牌的大小来判断,详细见附录c。)读入当前最近一张牌信息是否符合规则条件读入选中牌信息返回真返回假是否图3.19出牌函数

37、流程图3.3.6 电脑玩家ai的初步设计与实现ai一直是游戏可玩性的最大障碍,人机对战的局限性是显而易见的,电脑总是有规可寻,难度不高,但是某些游戏,由于电脑的逻辑思维的强大,就显得困难了。本课题的游戏也不例外,由于本课题的游戏是逻辑性很强的游戏,比较的算法比较好设置,但是由于牌的随机,阻止和放弃行动的行为会影响后面的整个牌局,所以由于本人能力有限,ai只能做个初步的设定,同时以随机数代替某些决策的处理。本游戏是以锻炼人的逻辑思维和心智模式为目的游戏,游戏中的变数很多。电脑如果使用随机参数加入思考,就回失去完成游戏的总体目标,但是确加大了游戏的变数,对玩家在游戏中额挑战加大了。由于现在ai只能

38、初步的以阻止玩家的行动为目的,其实在本游戏中是最不明智的一种行为,于是在某种程度下会出现如图3.20这样的情形:图3.20ai行为电脑会用尽自己的资源来阻止玩家,结果在下轮电脑摸牌之前能出的牌所剩无几,策略体现不明显,使得游戏进行的不顺畅,关于ai的算法仍然在改进中,但是作为改游戏的晚法演示,暂时能够使用,后面的开发就会有更多关于ai的改进工作需要完成。4 系统思考游戏模型的研究与建立研究游戏的模型首先我们需要从本质分析一下游戏的属性。关于游戏有许多的定义,本课题采用chis crawford的结构定义,如图4.1所示,展现了游戏领域的不同术语的全景。创造性表达娱乐乐事挑战冲突游戏艺术电影、书

39、籍玩具解谜竞赛金钱交互式的目标竞争对手允许攻击美非交互式无目标无竞争对手无攻击图4.1创造性表达的分类4.1 抽取模型 直到挑战那一层我们还是很容易做到的,关键游戏的特殊性要算体现在冲突上,冲突是挑战,具备有目的的对手。包括两个子类:竞赛和游戏。两者之间的区别在于对手相互阻止对方取得胜利或者成绩的能力,这样的能力是通过某种形式的攻击来体现的,这就是游戏,在本课题的游戏中阻止是相当重要的一个环节,由于我们设定的是石头剪子布的形式,这种形式是大家都能了解和接受的,所以游戏会因为这样的模型设定而较容易入手。如图4.2所示,游戏基本的模型:阻止红黄蓝行为1行为2行为3阻止阻止图4.1基本模型的抽取 我

40、们都知道在石头剪子布的机制下,冲突产生了,但是没有绝对的强者,玩家可以按照自己的愿望,使用行动能力,因为想出而出,而不是因为足够强才出,这就是我们所要的,就像在现实世界里,万物相生相克,并不是简单的联系,于是这样的逻辑关系就是比较复杂的关系。于是本游戏的挑战就在于,玩家手头的资源有限,选择自己的行动时,是否消耗自己的资源阻止对手,还是选择保留自己的资源来完成自己的目的呢。在选择中就产生了玩家之间的微妙的策略调遣,这个游戏的可玩性就产生在这里了。 同时作为游戏必然存在的就是挑战,玩家不可避免的要面对挑战,所以就成了防止玩家暗中破坏挑战的工具,所有的挑战都发生在某种限定的环境中,从而被设定了挑战被

41、提出的条件,提出挑战时所服从的条件就是挑战的规则,我们重视规则,因为他定义了挑战本质并使挑战变得真正有趣,比如、使用直升机,登山将变得如此容易但是那会消除所有的挑战,归根结底,登山的意义不在山顶,而在于自我挑战。在挑战环境中一个至关重要的事实:利用规则中的漏洞,很容易就可以破坏良好的挑战。在有好的游戏系统之后,好的规则是阻止暗中破坏挑战的策略,就象许多运动类游戏中存在边界,“越界”是不被允许的。4.2 益智模型的研究用我们老祖宗发明的围棋为例子,最初是战争系统的反映,但是围棋抽象了其中最精髓的规则:包围消灭。在18*18格的棋盘中这个系统的成功抽象造就了很好的挑战环境。玩家在对弈中有许多的选择

42、,从而产生了众多的可能性,于是如何做出合理的抉择就是围棋的挑战所在。至今为止还没有任何一个战略游戏能作到围棋的程度。然而人工只能确是难以模拟如此复杂的游戏。我们要达到在游戏中学习的目的时,关键是系统的抽象,提取锻炼、挑战的点。并且使它能融入游戏。围棋的思想就是好的一个模型抽象,由于选择的多样性,系统就变得复杂。从而产生了策略性。游戏作为寓教于乐的工具,正在世界各地风靡流行,它将游戏与学习有机的结合在一起,充分调动起参与者的兴趣与积极性,通过玩来锻炼参与者的思维逻辑能力,并能学习到一些相关知识。所以城市之光系列益智游戏是以系统动力学sd的系统思考理论为基础、计算机软件为辅的,旨在用实物牌提高玩家

43、社会交往能力、想象力、英语会话能力、系统思考逻辑性的游戏系统。该游戏系统打破了传统的益智游戏模式,是我国益智游戏开发领域的一次探索,而其中融入的系统动力学理论也为之注入了新的活力,让它在同类产品中更显突出。将系统动力学引入游戏中,课题通过利用系统动力学对该游戏系统进行sd系统模型分析,理清其游戏内部体系,分析游戏逻辑结构,因果环,从而正确引导玩家,使该系统更加成熟有效。同时期望利用该系统的模型架构来探索同类游戏内在结构联系,为类似系统的建立创建范本,使系统模块化、标准化,易于移植,并为游戏的推广寻求正确的游戏理论依据。4.3 推广游戏 游戏设计好了以后,就要进行推广,游戏的制作并不是一天两天的

44、事情,所以让人家知道游戏的存在也需要花费大功夫。4.3.1 书写优质的说明书由于本游戏与一般的纸牌游戏有着很大的区别,并且有很强的逻辑性,这就是游戏推广的一个难点,一般一个游戏如果做的太难以上手它就会失去一半的玩家,尽管它可能十分优秀,但是毕竟不是每个人都是游戏发烧友,不是每个人都会花一整天来学习游戏规则,所以如果玩家能在半小时内就基本能开始玩游戏那是最好的,所以本游戏有许多版本,从入手到高级的玩法。所以说明书上面应该花功夫,写出图文并貌的优质的说明书,可以的话直接制作视频说明。4.3.2 建立相关网站现在是信息时代,没有任何东西可以比网络更快的传递信息了,所以首选的推广媒介就是网络,在网络上

45、,我们可以发布游戏的演示版本(就是本课题的制作内容),如今本系列游戏的网站基本成型,如图4.2所示图4.2推广网页 网站中涉及了系列游戏介绍,系统动力学的介绍,并且提供电子体验版的下载,开用户讨论区。4.3.3 最直接的到用户面前进行宣传 由于提取了游戏的益智点,本游戏针对的是中小学生,所以可以从学校开始推广,从学校推广有许多好处,用户群集中,可以集中宣传。直接使用实物进行宣传,去除了通过演示版可能造成的不便。5 结论与展望经过几十年的飞速发展,游戏在人们生活中地位越来越重的,随着时代的变迁,我们这代游戏玩家也将随着年龄增长,成为新类型的游戏玩家。我们除了使用游戏作为娱乐的工具以外,现在更多的

46、着眼于它的社会效应,如果能寓教于乐的话是最好的选择。在本次课题设计过程里,首次接触了系统动力学这个全新的概念,学习了一定系统动力学的基本知识,对自己以后的分析问题的方法有着很大的影响。这次的城市之光的游戏设计,把实物牌移植到计算机上的一个工作,对个人的逻辑思考和模块化能力的锻炼,同时更加熟悉了vc+的使用。本游戏主要是使用vc+来开发,在开发过程中涉及了位图操作,类的定义,消息函数映射,等等比较高级的应用。通过这次设计的制作,自己加深了对面向对象的了解,同时位图的操作是本次的难点,也是这次自己最有体会的一个地方,因为游戏编程与其他的程序有个重要的不同点,就是分注意界面的操作,控件的使用,所以对

47、于位图的操作要求很高。经过这次的课题设计,掌握了基本的位图操作手段,但是由于自己水平有限,游戏的位图操作尚有很多不足,比如窗口的重会问题,其他图形资源的调用等等,更复杂的联系。这次的足球网站的制作,自己尽了很大的努力,也做出了一些成绩。但是,由于技术水平的限制,仍然有很多遗憾和不足,有限是电脑ai的设定,然后是游戏界面。但是本游戏的发展空间还是很大的,比如加入声音,完善帮助文件等等。在以后的发展中,不断的添加新的元素。针对这些不足,我将在今后予以补充和完善。谢 辞历时十七周的毕业设计终于要顺利结束了。首先,我要衷心感谢我的导师蔡维娜老师。使我能选择自己感兴趣的题目进行毕业设计。蔡老师非常认真、

48、负责,定期了解毕业设计的进度,在设计过程中给了我许多宝贵的建议,最后认真负责的帮助我完成了论文。在这里还要特别感谢我的另外一位指导老师李玲玲老师,在我设计的成果不能缺少她的帮助,在设计过程中,李老师在系统动力学方面给了我很大的帮助,同时为我课题的开始和努力方向的制定给了我很大帮助,同时老师定期帮和我探讨设计的思想,发展了我得思维,再次感谢李老师。毕业设计的结束,也意味着四年大学本科生活的结束。四年的大学生活我感受很深,增长了我的知识,使我的人生变得更充实。我要感谢这四年来我的老师们,他们在学习上给予了我指导、支持和帮助。也要感谢我的班主任韩丽娜,她在学习、生活,尤其是思想上,给予了我很多的帮助

49、,在我寻找目标时为我指点了前进的方向。当然,我还要感谢我的同学们。他们都是我的良师益友:学习时我们互帮互勉,生活中我们团结互助。有人说我们能出生在同一个时代已经是缘分了,而有缘来到同一个集体,我觉得自己已经很幸运,能够和大家一起度过4年的大学生活学校生活即将结束,我即将走向社会。大学四年的学习经历让我的人生充实了许多!再次感谢所有在大学期间关心、帮助过我的人,衷心地感谢大家!参考文献1 chris crawford.游戏设计理论.中国科学技术出版社 20042 andrew rollings,dave morris.游戏架构与设计.红旗出版社,北京希望电子出版社出版社 20043 吕军等.vi

50、sual c+与面向对象程序设计教程.北京: 高等教育出版社, 2003.7 4 杨正华,张秋生visual c+游戏编程导学北京:清华大学出版社,20045 王其藩.高级系统动力学,北京:清华大学出版社,1995年9月.6 王其藩.社会经济复杂系统动态分析.上海:复旦大学出版社,1992年11月7 彼得圣吉.第五项修炼, 上海: 东方出版社, 2002.8 craig wkirkwood,system dynamics methods: a quick introduction9 forrester j w.industrial dynamicsm.cambridge ma: mit pre

51、ss,196110 sterman j d. modeling managerial behavior:misperceptions of feedback in a dynamic decisionmaking experimentj. management science, 198911 系统动力学相关网址: / / /home.cfm /附录 a 一下附录是一些游戏编程中的只要程序。ca

52、rd pass(pass,2,16,1,b,1,y);card cut_off(cut_off,3,7,1,r,1,b);card power(power,4,18,1,y,1,r);card trick_pass1(trick_pass1,5,26,2,b,1,y);card trick_pass2(trick_pass2,9,27,2,b,1,y);card brake_late1(brake_late1,13,1,1,y,1,r);card brake_late2(brake_late2,14,2,1,y,1,r);card maneuver(maneuver,15,13,2,b,2,y

53、);card fox(fox,16,10,2,r,2,b);card feint(feint,17,9,2,y,2,r);card closed(closed,24,4,2,r,2,b);card rookie(rookie,27,22,1,b,1,y);card track_chicane(track_chicane,80,29,3,null,0,null);card track_curve_le(track_curve_le,81,30,1,null,0,null);card track_curve_le2(track_curve_le2,82,31,2,null,0,null);card

54、 track_curve_ri(track_curve_ri,83,32,1,null,0,null);card track_curve_ri2(track_curve_ri2,84,33,2,null,0,null);card track_finish(track_finish,85,34,1,null,0,null);/位图导入内存中bitmap0.loadbitmap(idb_back);/背景bitmap1.loadbitmap(idb_brake_late1);bitmap2.loadbitmap(idb_brake_late2);bitmap3.loadbitmap(idb_veteran);bitmap4.loadbitmap(idb_closed);bitmap5.loadbitmap(idb_control);bitmap6.loadbitma

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论