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

原创 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" );
}

相关文章推荐

自考数据结构第五章 多维数组

  • 2010年10月06日 20:29
  • 362KB
  • 下载

数据结构复习——第四章:串、多维数组和广义表

1.串:是由零个或多个字符组成的有限序列;包含字符的个数称串的长度; 2.空串:长度为零的串称空串;        空白串:由一个或多个空格组成的串称空白串;   子串:串中任意个连续字...

c语言对多维数组使用的总结

  • 2009年07月26日 19:10
  • 38KB
  • 下载

java数据结构之多维数组实现

多维数组其实就是数组的一种扩展形式。这里介绍几种特殊的多维数组即特殊的矩阵。 1.对称矩阵的压缩存储算法: 矩阵中的所有数据通过一定的规律存储在一维数组中。其中k=j*(j-1)/2+i-1。其中j和...

jqurey 获取 form 表单中所有数据,支持多维数组

function (formId) { var _url = $('#' + formId ).serialize(); var fixStr = func...

[数据结构]非线性结构——多维数组

多维数组和广义表是一种复杂的非线性结构,它们的逻辑特征是:一个数据元素可能有多个直接前驱和多个直接后继。 多维数组 1、一维数组(向量)——常用数据类型 一维数组(向量)是存储于计算机的连续存储空...

基于ini配置文件实现多维数组数据的按行存储和读取

需求是为一个多维数组对象的数据按行存储到文件,需要键值对区分层级,对每个对象描述清晰。类似的格式如下: 上图中的数据对应的就是如下的数组(php 语言): $arr = array( ...

《数据结构》实验四: 字符串和多维数组 实验(实验报告)

一.实验目的      巩固字符串和多维数组相关知识,学会运用灵活应用。 1.回顾字符串和多维数组的逻辑结构和存储操作特点,字符和数组的物理存储结构和常见操作。 2.学习运用字符串和...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用多维数组在游戏中保存归类数据
举报原因:
原因补充:

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