2014-01-23 22 views
0

我的目標是製作一個遊戲成就係統,你可以添加玩家(有名字,整數ID,他們玩的遊戲),遊戲(有名字,整數ID,成就列表)和成就(有名字,整數ID以及該成就所屬的遊戲ID)。我應該如何構造這個C++程序?

我不是要求任何代碼,我問的是這個程序的理想結構。乍看之下,我只會列出一個玩家名單,每個玩家類別都包含他們玩的遊戲,每個遊戲類別都包含成就。但問題在於玩家本身必須具備成就,而且每位玩家所玩的遊戲必須參考相同的遊戲,而不是針對每位玩家的同一遊戲的單個副本。

構建這樣的程序的最佳方式是什麼?

+0

玩家有成就,成就與遊戲有關。 –

+0

由於我忘了提及,我還需要能夠列出玩家所玩的遊戲,即使玩家沒有取得遊戲成就。 – AggieDev

回答

1

所以你想在玩家類中存儲一個句柄給玩家的遊戲,而不是真正的遊戲本身(它們將被存儲在別處)。一個句柄可以是一個指針(這將是一個指針),一個索引到一個數組或者vector或者類似的東西,或者指向遊戲的其他抽象層。

1

我知道,會有幾種類的設計。這可以是其中之一。我只是用std::list,想展示一個基礎和簡單的設計,不實用。所以,在適用於您的情況之前,您必須關注這一點。

using namespace std; 

class Achievement 
{ 
    public: 

    Achievement(string name, int id) : name_(name), id_(id) {} 

    string name_; 
    int  id_; 
}; 

typedef list<Achievement> ACHIEVEMENT_LIST; 
class Game 
{ 
    public: 
    Game(string name, int id) : name_(name), id_(id) {} 

    string name_; 
    int  id_; 
    ACHIEVEMENT_LIST achievement_list_; 
}; 

typedef list<Game> PLAYED_GAME_LIST; 
class Player 
{ 
    public: 

    Player(string name, int id) : name_(name), id_(id) {} 

    string name_; 
    int  id_; 
    PLAYED_GAME_LIST played_game_list; 
}; 


int main() 
{ 

    //firstly, player A, B joins 'dungeon' Game 
    Player a("A", 01); 
    Player b("B", 02); 

    Game dungeon("dungeon", 1001); 

    //when game finishes, create achievement 
    Achievement hero("hero", 100001); 

    //and, add to achievement_list in Game 
    dungeon.achievement_list_.push_back(hero); 


    //add 'dungeon' to played_game_list. 
    a.played_game_list.push_back(dungeon); 
    b.played_game_list.push_back(dungeon); 

    //Player a,b have same game reference 
    Game a_played_game = a.played_game_list.front(); 
    Game b_played_game = b.played_game_list.front(); 

    cout << "GAME : a_played_game.name_ = " << a_played_game.name_ << ", b_played_game.name_ = " << b_played_game.name_ << endl; 

    //we can access achievement in player class 
    Achievement a_achive = a_played_game.achievement_list_.front(); 
    Achievement b_achive = b_played_game.achievement_list_.front(); 

    cout << "ACHIEVEMENT : a_achive.name_ = " << a_achive.name_ << ", b_achive.name_ = " << b_achive.name_ << endl; 


    getchar(); 

    return 0; 
}