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