游戏制作中的大宝剑---常用的数据结构与算法

前言

   时间流逝,物是人非,就好像涌动的河流,永无终焉,幼稚的心智将变得高尚,青年的爱慕将变得深刻,清澈之水折射着成长

                                                                                                           ----------《塞尔塔传说》

PS:为了方便大家阅读,个人认为比较重要的内容-------红色字体显示

                                         个人认为可以了解的内容-------紫色字体显示

---------------------------------------------------------------------------

--------------------------------------------------分-割-线-----------------------------------------

       在游戏的制作过程之中,总是少不了使用到一些数据结构,或者说使用了一些比较高效的算法,尤其是游戏引擎之中的一些很高深的算法,让人匪夷所思,当然我们主要讲一讲游戏之后简单的一些算法以及常用到的数据结构。让我们一步一步来,首先是常用的数据结构,之后再来讲一讲常用的一些算法。

                                                              常用的数据结构

       数据结构是计算机存储、组织数据的方式,是相互存在一种或者多种特定关系的数据元素的集合。当然在软件的开发过程之中,数据机构设计的合理可以带来更高的运行或者存储效率。而且游戏软件有一个特点,就是它要求相应更加快速,计算要更加精确,而且有很多的多媒体资源需要去组织和管理。由此可见,游戏软件的设计需要强大的数据结构在背后支撑!好了,我们来看一看常用的数据结构:

                                                                   不可或缺的数组

       虽然说数组是一种最简单的数据结构,而且也很容易理解,可以说每个编程爱好者都用过不知道多少次数组了。所以每个人都很清楚,在程序设计过程之中,常常把相同类型的若干变量按照数组的形式组织起来。数组元素的查找要按照索引的顺序依次进行,根据已知索引来读取数据会显得很方便,不过插入或者删除的时候就会稍微麻烦一些,需要移动一些元素,原因就是为了维持数组元素原来的约定。这里指的一提的就是数组之中的元素也可以是数组类型,这样就构成了二维数组、多维数组。

       具体数组在游戏之中是怎么使用的呢?其实数组在游戏之中很常见,比如游戏之中某种分值排行的功能、对某种属性选取最值的功能等,都可以用一维数组来实现,不过这里不仅仅使用到了数组,而且使用到了数组的排序。

       二维数组在游戏之中用的还是挺多的,很多游戏之中都有体现,最常见的一种方式就是二维数组表示地图(在3D游戏的制作之中,可能会涉及到三维地形的加载,其实三维地形是由灰度图来描述的,把每个像素映射为一个高度,其实原理上也类似吧!),像酷跑类的游戏、推箱子的游戏、棋盘类游戏的棋盘设计都是二维数组的体现。这样说不够直观,来看一张图吧:


在上述例子之中二维数组可以得到很好的应用,用它来描述地图数据,可以很好地完成游戏之中界面的实时变化,在对地图之中所有的元素进行分析之后,我们可以得到八种类型。之后根据地图的大小,设计m*n大小的二维数组,它里面的数据就是这八种类型的编码,在游戏进行过程之中,需要玩家进行实时的输入,在玩家进行输入之后,需要根据相应的逻辑修改地图信息,或者说是更新地图信息。但是需要注意的是地图的原始数据不能变化,否则下次游戏不能正常进行,这里修改的应该是原始地图的临时拷贝

-------------------------------------------------------------------------------------------------------------

                                                                   方便实用的链表

       链表是一种物理存储上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表之中指针的链接次序实现的。链表之中的每一个元素称为节点,每个节点包括两个部分:一是存储数据的的数据域,另一个是存储下一个节点地址的指针域。链表由一系列节点组成,节点可以在需要的时候动态生成。也正是因为这些特点,链表的查找一定要按照节点依次进行,链表的插入、删除操作十分方便;链表不需要再一开始就占用很多空间,随着程序的运行需要动态创建即可。      

       在游戏之中,很多的游戏元素需要动态的出现、消除,其个数是难以预料的,例如射击游戏之中出现的敌机和子弹,还比如消除游戏之中出现的消除对象以及RPG游戏之中出现的电脑角色等等。根据链表在插入和删除数据,可随程序运行动态创建数据的特点,在游戏开发过程之中常常用链表来维护、管理那些需要频繁产生、消除的游戏对象

       以射击游戏为例,游戏之中可以用链表来表示游戏之中的敌机和子弹。在游戏的开始的时候,创建一个敌机的链表、一个子弹的链表,其中的元素的个数为0,即敌机的个数为0,子弹的个数为0;随着时间的推进,敌机出现,程序中创建相应的敌机节点放入敌机链表;由于敌机的出现,攻击的子弹也要相应的出现,程序之中创建相应的子弹节点加入子弹链表;当攻击子弹与敌机发生碰撞,子弹和敌机都应该消失,此时根据程序此时的子弹、敌机指针,找到链表相应的节点,然后删除、更新链表。如果敌机、子弹的数量较多,创建、删除操作太频繁,还可以敌机、子弹链表分为存活链表和死亡链表两种,并在节点之中添加存活属性,当需要删除敌机或者子弹节点的时候,将属性修改,放入死亡链表。当需要创建新的敌机或者子弹的时候,先检查死亡链表之中有无该节点,若有,修改存活属性,加入存活链表之中,反之才会申请内存空间,重新创建相应的节点,这样可以将死亡的节点重新利用,大大节省了游戏在

创建、清除方面的开销!

                                                       道具包管理-------线性表

       这样说可能大家已经有点感觉到了数组或者链表在游戏之中的体现,不过数组并不是特别的明显,其实它们衍生出一个叫做线性表的东西在游戏之中有更多的体现。相信我们都玩过RPG游戏,或者说一些网页游戏(不过我并不喜欢玩网页游戏),里面都有一种叫做道具包,或者说是道具栏的东西。道具这种东西似乎在任何RGP游戏之中都有体现,比如国产的仙剑奇侠传系列,你所扮演的人物在游戏过程之中会获得道具(一般来说是战斗结束的时候获得道具),所以我们在程序之中需要把这些数据组织起来,方便管理。在这个时候其实我们可以考虑使用线性表,还是挺方便的,线性表是一组元素以线性的结构组织起来的,如(e1,  e2, e3 …… en)。从大类上分,线性表可以分为链表和数组两大类。

       其实如果真的要使用的话,我们可以使用STL之中的容器,如vector以及list来实现,更加方便。

       数组里的元素以连续的内存空间存放,因此可以用内存地址检索到对应的数据元素,访问元素很方便。但如果要进行插入/删除数据元素,就要做一些内存移动了,效率比较低。而链表的数据元素存放在

  • 20
    点赞
  • 103
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值