使用多維數組在遊戲中保存歸類數據

遊戲中的裝備有不同的顏色(白綠藍黃), 不同的職業需求(戰士專用, 法師專用....), 不同的等級需求(某些裝備需要達到 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" );
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章