簡體   English   中英

有很多成員的班級

[英]classes with a lot of members

我正在嘗試創建一個 D&D 遭遇模擬器。 因此,我創建了一個名為“Actor”的類來模擬玩家和怪物的行為。 問題是,雖然目前該類只有 3 個成員變量,但隨着模擬變得更加准確,有必要添加更多成員變量以最好地模擬怪物和玩家的統計數據,例如力量、靈巧等(可能更多超過 10 個成員變量)這導致構造函數有很多參數,所以問題就變成了; 有沒有更好的方法來組織這些數據,因為它會隨着角色類的每個實例而變化?

現在,用戶需要手動輸入所有狀態,但我計划稍后可以訪問怪物的文件讀取,因為怪物統計數據僅隨怪物類型(龍、骷髏等)而變化。

注意:這些統計數據非常重要,用於計算“演員”類在遭遇戰中可以采取的每個行動的結果。

編輯:很多人建議使用繼承,但事實是(怪物和玩家)從來沒有不同的統計數據,像玩家這樣的怪物由玩家(游戲大師)控制這是一個桌面游戲,應該是模擬器幫助游戲大師在真正的游戲之前平衡遭遇。

演員.h

#ifndef actor_h_
#define actor_h_

#include "dice.h"

class Actor
{
  private:
    signed int hp;
    signed int ac; // Armor Class
    signed int dmg;
    
  public:
    Actor( signed int hp, int ac, int dmg);
    ~Actor();

    signed int getHP( void );
    signed int getAC( void );
    signed int getDmg( void );
    void setHP(signed int newHP);
    void setAC(signed int newAC);
    void setDmg(signed int newDmg);

    void attack(Actor* target);
};
#endif

演員構造函數

Actor::Actor(signed int hp, signed int ac, signed int dmg)
{
  this->hp = hp;
  this->ac = ac;
  this->dmg = dmg;
}
Actor::~Actor(){}

當您自己提出統計數據示例時,這些數據可能會出現在

struct StatsBlock {
    int str, dex, con, /*others*/;
};

然后,您可以從靜態類變量或靜態方法中獲取它們:

class Skeleton : public Actor {
...
public:
static inline const StatsBlock = { 13, 8, ... };
static StatsBlock rollStats() { ... );
};

作為獎勵,這也為您提供了一個中央位置來應用或移除暫時改變統計數據的效果,例如裝備“+1 力量之戒”或被像變形術這樣的法術擊中。

這是 C++ 中多態的基本概念,我建議從閱讀它開始

例如,您可以讓基類 Actor 包含模擬器中每個實體(怪物、玩家等)的基本信息。

然后您可以創建一個 Monster 和一個 Player 類,它們派生自您的 Actor 類。 那些將有自己獨特的信息(牙齒大小、水下呼吸、蒼蠅等。)

如果你想在模擬過程中為你的玩家動態創建新的統計數據,我建議使用智能指針來保存這些成員以進行內存優化。

如果您不想在 actor 的構造函數中為 actor stats 的每個屬性都設置一個參數,您可以考慮擁有一個單獨的 stats 對象並將該 stats 的實例傳遞給構造函數:

struct ActorStats {
    signed int hp;
    signed int ac; // Armor Class
    signed int dmg;
}

struct Actor {
  Actor(ActorStats stats) : stats_(std::move(stats)) {}

  signed int getHP( void );
  signed int getAC( void );
  signed int getDmg( void );
  void setHP(signed int newHP);
  void setAC(signed int newAC);
  void setDmg(signed int newDmg);

  void attack(Actor* target);

  protected:
    ActorStats stats_;
};

然后,您可以使用不同的策略來創建角色,例如從保存文件或預設中讀取:

ActorStats read_stats_from_file() {
    ActorStats stats;
    // some reading logic

    stats.hp = // value read from file

    return stats;
}

Actor create_actor() {
    ActorStats stats = read_stats_from_file();
    Actor actor(stats);

    return Actor;
}

這樣你就不需要為每個統計數據實現一個getter/setter,也不需要為應該初始化統計數據的函數使用friend 但是原始值仍然受到保護,只要它們被傳遞給Actor

這導致構造函數有很多參數,所以問題就變成了; 有沒有更好的方法來組織這些數據,因為它會隨着角色類的每個實例而變化?
現在,用戶需要手動輸入所有狀態,但我計划稍后可以訪問怪物的文件讀取,因為怪物統計數據僅隨怪物類型(龍、骷髏等)而變化。

聽起來這個問題不是關於如何設計 OOP,而是關於如何定義程序的所有統計信息而不是非常麻煩。

從文件中讀取統計信息是個好主意。 您可以在一個或多個 JSON 文件中表示它們,並使用Nlohmann 的 JSON 庫將其讀入您的程序。 您仍然需要編寫代碼來說明您的程序應該如何使用讀取的 JSON 數據,當然您首先需要編寫 JSON ---沒有免費的午餐。 但它仍然有助於組織該計划。

另一個想法:對於像獸人軍隊這樣的演員,或者在有多個相同類型實例的任何地方,一個有用的方法可能是定義一個獸人工廠函數來創建一個獸人演員及其統計數據。 工廠可以偽隨機地改變速度、力量等,以便每個獸人的個性化都略有不同,而不必為每個實例手動編寫統計數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM