数据结构在游戏中的简单应用

在游戏的编写中,不可避免的出现很多应用数据结构的地方,有些简单的游戏,只是由几个数据结构的组合,所以说,数据结构在游戏编程中扮演着很重要的角色。

本文主要讲述数据结构在游戏中的应用,其中包括对链表、顺序表、栈、队列、二叉树及图的介绍。读者在阅读本文以前,应对数据结构有所了解,并且熟悉C/C++语言的各种功用。好了,现在我们由链表开始吧!

1、链表

在这一节中,我们将通过一个类似雷电的飞机射击游戏来讲解链表在游戏中的应用。在飞机游戏中,链表主要应用在发弹模块上。首先,飞机的子弹是要频繁的出现,消除,其个数也是难以预料的。链表主要的优点就是可以方便的进行插入,删除操作。我们便将链表这一数据结构引入其中。首先,分析下面的源代码,在其中我们定义了坐标结构和子弹链表。

struct CPOINT
  {
    int x;  // X轴坐标
    int y;  // Y轴坐标
  };
  struct BULLET
  {
    struct BULLE* next;  // 指向下一个子弹
    CPOINT bulletpos;  // 子弹的坐标
    int m_ispeed;  // 子弹的速度
  };

  接下来的代码清单是飞机类中关于子弹的定义:

  class CMYPLANE
  {
  public:
    void AddBullet(struct BULLET*);  // 加入子弹的函数,每隔一定时间加弹
    void RefreshBullet();  // 刷新子弹
  privated:
    struct BULLET *st_llMyBullet;  // 声明飞机的子弹链表
  };

在void AddBullet(struct BULLET*)中,我们要做的操作只是将一个结点插入链表中,并且每隔一段时间加入,就会产生连续发弹的效果。

这是加弹函数主要的源代码:

void AddBullet(struct BULLET*)
  {
    struct BULLET *st_llNew,*st_llTemp;  // 定义临时链表
    st_llNew=_StrucHead;  // 链表头(已初始化)
    st_llNew->(BULLET st_llMyBullet *)malloc(sizeof(st_llMyBullet));  // 分配内存
    st_llTemp= =_NewBullet;  // 临时存值
    st_llNew->next=st_llTemp->next; st_llTemp->next=st_llNew;
  }

  函数Void RefreshBullet()中,我们只要将链表历遍一次就行,将子弹的各种数据更新,其中主要的源代码如下:

  while(st_llMyBullet->next!=NULL)
  {
    // 查找
    st_llMyBullet->bulletpos.x-=m_ispeed;  // 更新子弹数据
    ………
    st_llMyBullet=st_llMyBullet->next;  // 查找运算
  }

经过上面的分析,在游戏中,链表主要应用在有大规模删除,添加的应用上。不过,它也有相应的缺点,就是查询是顺序查找,比较耗费时间,并且存储密度较小,对空间的需求较大。

如果通过对游戏数据的一些控制,限定大规模的添加,也就是确定了内存需求的上限,可以应用顺序表来代替链表,在某些情况下,顺序表可以弥补链表时间性能上的损失。当然,应用链表,顺序表还是主要依靠当时的具体情况。那么,现在,进入我们的下一节,游戏中应用最广的数据结构 — 顺序表。

时间: 2016-06-09

数据结构在游戏中的简单应用的相关文章

游戏中的消费行为分析

购买(消费)是游戏里的一个环节,看似是一个很小的环节,但是背后有一系列东西是我们看不到的(数据无法体现的). 数据虽然能够显示玩家买了什么,买了多少.但是却无法显示玩家为什么买,买之前买之后做了什么跟购买相关的行为- 这2天看了一些http://www.aliyun.com/zixun/aggregation/7603.html">购买决策和购买行为的文章,我认为对8205.html">游戏运营很有帮助,从理论角度扩展了运营的思维. 上图是一个简化的消费者购买行为模型(点击

简单百宝箱我在游戏中启动了无效怎么办

切记,修改完按键或者数值记得点击"保存设置"! 如果您是网吧用户,可能键盘连按无法在游戏中使用,这时请联系网管将键盘连按的启动文件加入驱动防火墙的白名单. 如果您是在家使用,请先检查键盘连按在游戏外是否有效(最简单的办法就是开个QQ的聊天窗口后启动键盘连按,看能不能打出字),如果聊天窗口可以打出字,那到游戏里面用键盘连按看能不能打出字.如果只有在游戏中没有反映,那么请勾选超级模式再试试看.

c++-关于一个游戏中拦截算法的简单疑问

问题描述 关于一个游戏中拦截算法的简单疑问 在一本人工智能书上看到一个拦截算法 主要代码如图. 书中所述大概过程是: 用追击者和猎物的速度算出相对追击者的速度 然后算出两者之间的位移 再通过位移除以速度求出拦截所需要的时间 最后用猎物速度乘以时间加上它的位置算出即将拦截的位置 最后再通过其他方法让追击者朝着这个拦截的位置去拦截 然而个人理解就是: 追击者要实现拦截 根本问题就是求追击者的速度(准确来说是速度的方向) 然而要实现拦截则需要追击者本身的速度 这成了个矛盾 然后我把这原理用代码在uni

深入理解游戏中寻路算法

如果你玩过MMOARPG游戏,比如魔兽,你会发现人物行走会很有趣,为了模仿人物行走的真实体验,他们会选择最近路线达到目的地,期间会避开高山或者湖水,绕过箱子或者树林,直到走到你所选定的目的地. 这种看似寻常的寻路在程序实现起来就需要一定的寻路算法来解决,如何在最短时间内找到一条路径最短的路线,这是寻路算法首先要考虑的问题. 在这篇文章中我们会循序渐进来讲解寻路算法是如何演进的,你会看到一种算法从简单到高效所遇到的问题,以及精进的过程,带着问题来阅读,理解更快. 本篇主要包含以下内容: 1.图 2

JavaScript游戏中使用OOP和设计模式让代码变得更智能

学习如何在 http://www.aliyun.com/zixun/aggregation/33906.html">JavaScript 中使用基于经典继承的库从 OOP 中获得更多的好处.本文还将介绍架构式设计模式,来展示了如何使用游戏循环.状态机和事件冒泡 (event bubbling) 示例来编写更整洁的代码. 在本文中,您将了解 JavaScript 中的 OOP,来探索原型继承模型和经典继承模型.举例说明游戏中能够从 OOP 设计的结构和可维护性中获得极大利益的模式.我们的最终

【IOS-COCOS2D游戏开发之十八】解决滚屏背景/拼接地图有黑边(缝隙)/图片缩放后模糊透明/图片不清晰【2013年12月13日补充】/动画播放出现毛边以及禁止游戏中自动锁屏问题!

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/iphone-cocos2d/507.html 本章节主要为大家介绍在游戏开发过程中经常遇到的两个问题:  1. 解决滚屏背景或拼接地图有黑边! 对于游戏开发中,背景(游戏地图)是必要的元素之一,那么对于大部分游戏的背景都是动态,或者不断移动的:例如RPG中的背景随着人物.主角而移动,那么一般情况下背景都是由地图编辑器(图块)拼出来的,要不就

J2ME游戏中读入文本并存储在String数组中

数组 一个在J2SE中十分钟即告完成的代码,在J2ME中花费了一个下午.是什么样的代码呢?[要求]在游戏中读入文本形式存储的hints [分析]J2ME没有BufferReader,用InputStreamReader吧既然没有BufferReader,也就不要奢望有readLine()了,自己慢慢循环吧 [源代码] 以下内容为程序代码/* read hint-------------------------------------- */ /** * This is the hints * *

Flash游戏中使用漂亮的文字

从标题到StageClear字样,从分数到对话框,游戏中很多地方要用到文字.若是简单的使用Flash标准字体?这算游戏吗?我们需要华丽的文字! 偶们即将系统滴讨论游戏中的文字,目标是--把文字美化到牙齿!! 有一些文字是静态的,可以用各种绘图手段极尽美化之能事--但是也是很有讲究的:然而另一些是动态的,只能用动态文本吗?--废柴!未够班阿! 1 用Flash绘图工具处理静态文字 Flash绘图工具很好用.写下一排文字之后,Ctrl+B 两次,可以将文本打散成填充.这个时候我们就可以用各种方法来处

Flash游戏开发系列一:游戏中的敌人(5)

第四篇:Flash游戏开发系列一:游戏中的敌人. 五.跟踪导弹 看看这个例子,在动画屏幕上按下鼠标,导弹就会跟踪玩家,直到击中玩家: 对于新手来说,一下子就实现它可能不太容易,我们来一点一点的做. (1)导弹的方向 我们先来实现导弹朝向玩家的功能,就像下面这个:(按下鼠标观看) 首先,我们注意到,敌人的导弹是要朝向玩家的,这和前面不同.前面的敌人是一个圆头圆脑的家伙,不用分辨它的方向.我们就先来看一下如何让敌人有方向感. 首先给新手讲解一下基本知识:用鼠标来触发动画. 我们先设定一个变量,布尔类