使用多维数组在游戏中保存归类数据

原创 2013年12月04日 21:03:08

游戏中的装备有不同的颜色(白绿蓝黄), 不同的职业需求(战士专用, 法师专用....), 不同的等级需求(某些装备需要达到 N 级才能穿戴), 不同的佩戴部位(头盔, 护手, 胸甲.......), 且每种装备有唯一编号(装备 ID 号)

把装备信息加载到内存中, 按照特定条件查询某类装备集合( 比如查找 战士专用, 绿色, 20级才能穿戴, 头盔..... ), 使用 for 循环来查找的方式非常低效
一个五维数组就可以让上面的查询变得简便直接, 几条语句就可以查询到想要的装备集合

若装备太多, 则五维数组应该 new 出来而不应该声明为静态变量, 避免占用栈内存
游戏服务端中需要爆装备的地方可以访问这个五维数组, 对于这段性能敏感的代码, 使用一个一维数组来模拟五维数组,CPU 执行起来更为高效

假设游戏中有 2 种职业(战士和法师), 装备分 4 种颜色(白绿蓝紫), 装备等级共 7 级( 级别分别是 1, 5, 10, 15, 20, 25, 30), 穿戴部位有 6 处( 头盔, 手套, 上衣, 裤子, 鞋, 武器 )
五维数组 int MultiArray[ 2 ][ 4 ][ 7 ][ 6 ][ X ] 就保存了所有的装备 ID 号。MultiArray[ a ][ b ][ c ][ d ] 对应了一个 int 数组 ( 可以使用一个 std::vector< int > 来代替这个数组 ), 这个数组中的装备 ID, 具有同样的职业需求, 颜色, 装备等级, 佩戴部位也是一样的。

如果某 BOSS 落宝是两个不同的战士上衣, 紫色, 20 级, 并且游戏中满足此条件的装备有 N 种, 那么从 MultiArray[ 0 ][ 3 ][ 4 ][ 2 ] 对应的 int 数组里面随便取出两个 ID 来, 就是结果

模拟代码

#define LENGTH_FIRST    ( 2 ) // 表示 2 种职业, 0 表示战士, 1 表示法师
#define LENGTH_SECOND    ( 4 ) // 表示 4 中装备颜色, 0 表示白色, 1 表示绿色, 2表示蓝色, 3表示紫色
#define LENGTH_THRID    ( 7 ) // 表示 7 个装备等级, 0 表示1级, 1 表示5级,  2, 3, 4, 5, 6 分别表示 10级, 15级, 20级, 25级, 30级
#define LENGTH_FOURTH    ( 6 ) // 表示 6 个穿戴部位, 0 表示头盔, 1 表示手套, 2 表示上衣, 3 表示裤子, 4 表示鞋, 5 表示武器

int GetOffSet( int nJob, int nColor, int nEquipmentLevel, int nBodyParts )
{
    int nOffSet = nJob* LENGTH_SECOND * LENGTH_THRID * LENGTH_FOURTH;
    nOffSet += nColor * LENGTH_THRID * LENGTH_FOURTH;
    nOffSet += nEquipmentLevel * LENGTH_FOURTH;
    nOffSet += nBodyParts;

    return nOffSet;
}


void main()
{
    int nArraySize = LENGTH_FIRST * LENGTH_SECOND * LENGTH_THRID * LENGTH_FOURTH;

    int** pMultiArray = new int*[ nArraySize ];
    std::vector< int >* pointVec = new std::vector< int >[ nArraySize ];

    for ( int i=0; i<nArraySize; i++ )
    {
        pMultiArray[ i ] = ( int* )&pointVec[ i ];
    }
    

    // 假设有2个装备 ID 为 1 和 2, 属于战士用的 10 级紫色手套, 需要保存进 pMultiArray, 代码如下
    int nOffSet = GetOffSet( 0, 3, 2, 1 ); // 0 表示战士, 3 表示紫色, 2 表示 10 级, 1 表示手套

    // pVec 中的保存的装备 ID, 等级, 职业需求, 穿戴部位, 颜色都是一样的
    std::vector< int >* pVec = ( std::vector< int >* )pMultiArray[ nOffSet ];
    pVec->push_back( 1 );
    pVec->push_back( 2 );

    // 其他赋值代码省略

    // 假设保存了所有的装备 ID, 需要查找到属于法师用的 15 级蓝色武器, 代码如下
    nOffSet = GetOffSet( 1, 2, 3, 5 ); // 1 表示法师, 2 表示蓝色, 3 表示 15 级, 5 表示武器

    // 此时 pVec 中的保存的所有装备 ID, 等级都是 15 级, 职业需求是法师, 穿戴部位是武器, 颜色是蓝色
    pVec = ( std::vector< int >* )pMultiArray[ nOffSet ];

    // 释放 pMultiArray 和 pointVec 占用的内存代码, 省略

    std::system( "pause" );
}

游戏中的数学与物理(一)

游戏,玩起来很简单很随意,但是在真正的制作过程中,为了画面越逼真就需要越多的基础知识在里面,有物理、数学、算法等等。有一个好的基本功,对于做好游戏是非常重要的。...
  • wfenglinxu
  • wfenglinxu
  • 2015年07月02日 22:23
  • 705

关于概率要素和统计学要素在游戏设计中的运用

该文章来自用户转载  点击阅读原文 一、从“热手”现象看游戏风险与奖励机制设计   平衡风险与奖励是设计电脑游戏时的一个重要考虑因素。一个优秀的平衡风险与奖励机制可以提供很多额外游戏价值。...
  • hany3000
  • hany3000
  • 2015年12月09日 08:18
  • 2289

EASTL -- Electronic Arts Standard Template Library

Document number:  N2271=07-0131 Date: 2007-04-27 Reply to: Paul Pedriana Electronic Ar...
  • wolf96
  • wolf96
  • 2015年09月04日 19:11
  • 1584

《从零开始搭建游戏服务器》Redis操作指令和Jedis工具

引言 上篇已经大致完成了redis的下载安装和简单的使用,接下来我们要真正地操作redis进行一些数据的增删改查操作,以及简便好用的Jedis工具。 常用指令:1.增加或者修改已有数据的值:...
  • linshuhe1
  • linshuhe1
  • 2017年03月07日 14:46
  • 951

设计模式在游戏中的应用--简单工厂模式(一)

上面是复制的简单工厂模式的一个类图。 下面言归正传 自己作为一个刚毕业的菜鸟,有幸能够和牛人们一起工作很开心。当时策划提出一个需求,需要针对每个职业进行不同的能量恢复。 我当时接到这个需求,心中暗喜,...
  • guxuxin
  • guxuxin
  • 2015年02月03日 18:19
  • 811

游戏中的人工智能(一)

人工智能的本质:让计算机能够像生物体一样,具有思考和决定的能力来执行某些特定操作。 人工智能研究的三个主大类领域: ① 计算机视觉: 从视觉输入源获取信息并对它们进行分析,以执行特定操作。(ex...
  • qq_33575542
  • qq_33575542
  • 2017年11月16日 20:36
  • 61

游戏中的常用算法

一,递归 计算阶乘 int fun(int n) { if (n==1||n==0) { return 1; } return n * fun(n - 1); } 二...
  • zhhf96
  • zhhf96
  • 2015年09月10日 09:48
  • 232

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

在游戏的编写中,不可避免的出现很多应用数据结构的地方,有些简单的游戏,只是由几个数据结构的组合,所以说,数据结构在游戏编程中扮演着很重要的角色。   本文主要讲述数据结构在游戏中的应用,其中包括对链...
  • zhangchen124
  • zhangchen124
  • 2016年06月08日 06:43
  • 4035

游戏中的设计模式:单例模式

游戏中用到单例模式的例子很多,几乎适用于所有的Manager类,如聊天,道具,日志等等。 单例模式(Singleton),保证一个类仅有一个实例,并提供一个访问它的全局访问点。 通常我们可以让一个全局...
  • losophy
  • losophy
  • 2013年08月31日 11:35
  • 2673

游戏中的设计模式(1)--观察者模式

软件需要设计,那么如何设计,设计的灵感源于实践,前人的设计经验被总结为设计模式,所以学习设计模式或许可以更快的get到设计这个技能。虽说设计模式不是银弹,但笔者相信一定是一颗具有杀伤力的子弹。...
  • realxie
  • realxie
  • 2015年06月28日 16:26
  • 1973
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用多维数组在游戏中保存归类数据
举报原因:
原因补充:

(最多只允许输入30个字)