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

游戏中的装备有不同的颜色(白绿蓝黄), 不同的职业需求(战士专用, 法师专用....), 不同的等级需求(某些装备需要达到 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" );
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值