【问题标题】:Issue creating my Pokemon game global organisation创建我的口袋妖怪游戏全球组织的问题
【发布时间】:2022-11-23 20:02:28
【问题描述】:

对于上下文,我正在用 C++ 重新创建一个口袋妖怪游戏(我是 C++ 的新手,我只有 1 年的编程经验,而且我是用 C 编程的)。但是我对代码的组织有疑问。

这是我的问题:我不知道在课堂上放什么,在结构中放什么。

例如,在我当前的代码中,我的Pokemon 和我的Attaque 是两个不同的类。我这样做是因为我希望其中的 2 个在文件中使用信息进行初始化。但是如果 Pokemon 正在战斗,他们需要访问 Attaque。但是在生成我的Pokemon 时,一些统计数据会在受到项目影响时发生变化。像闪亮的 % 受到影响闪亮魅力.所以我也需要访问我的包。

这里的问题是我正在上很多课friend(现在AttaquePokemon的朋友,Pokemonbag的朋友)。我读到这可能是组织代码问题。 我考虑过为闪亮魅力,但不知道好不好用。

这是我的Pokemon课程。 nature_estatus_etype_e 是枚举类。

class Pokemon {
    private:
        bool m_is_shiny { false };
        bool m_is_pokerus { false };
        short m_level { 0 };
        int m_id { 0 };
        int m_exp { 0 };
        std::array<int, 2> m_texture_coord { 0, 0 };
        std::array<unsigned char, 6> m_iv {0, 0, 0, 0, 0, 0};
        std::array<unsigned char, 6> m_ev {0, 0, 0, 0, 0, 0};
        std::array<unsigned char, 6> m_base_stat {0, 0, 0, 0, 0, 0};
        std::array<unsigned char, 8> m_stat {0, 0, 0, 0, 0, 0, 0, 0};
        nature_e m_nature {nature_e::NONE};
        status_e m_status {status_e::NONE};
        std::array<type_e, 2> m_type {type_e::NONE, type_e:: NONE};
        Texture2D m_texture;
        std::string m_name { "Non" };
        std::string m_item { "non" };
        std::string m_sprite_path { "None" };
        std::array<Attaque, 4> m_atk { Attaque(), Attaque(), Attaque(), Attaque() };
    public:
        Pokemon()
        {
        }
        Pokemon(int id, short level);
};

这是我的Attaque 类:

class Attaque {
    private:
        bool m_phy_or_spe;
        int m_damage;
        type_e m_type;
        double m_effect_precision;
        double m_precision;
        std::string m_name;
    public:
        Attaque()
        {
        }
        Attaque(int id);
};

【问题讨论】:

  • 我更喜欢吸气剂而不是友谊。我个人认为花哨的对象设计被高估了。只写吸气剂。我个人再次发现,当我有一些工作代码时,我可以更清楚地考虑设计。当我有一些工作时,我会想“我可以重构它并改进设计吗?”。在这方面一切都是个人意见,你必须找到自己的方式。
  • 一个好的开始是SOLID。一组五个设计原则,从未让我失望。
  • 我不确定这个问题属于这个网站。也许 Code Review 会更合适。

标签: c++ class game-development code-organization


【解决方案1】:

这是我的问题:我不知道在课堂上放什么,在结构中放什么。

通常使用带有 getter 的类而不是结构或朋友。

我看到的主要问题是您的Pokemon 班级做得太多了。

首先,我会将Pokemon 分成至少两个不同的类。第一类包含有关神奇宝贝的一般信息,如名称、类型、基本统计数据、exp 组或蛋组,第二类包含有关特定 Pokemon 的信息,如昵称、lvl、iv、ev、性质或攻击.

我看到的另一个问题是你希望 Pokemon 能够访问包,因为像 Shiny Charm 这样的项目。在我看来,这是错误的做法。你应该有类似 Encounter 类的东西来处理狂野的遭遇逻辑,比如检查你的包里是否有某些物品,检查你是否使用了 Repel 或为遭遇生成随机的 Pokemon。

类似于 Encounter 类,您可能会找到一些其他实例,在这些实例中将您的逻辑放在不同的类中是有意义的。 Pokemon 基本上只是一个数据对象,不应附加太多逻辑。

【讨论】:

    猜你喜欢
    • 2019-08-30
    • 1970-01-01
    • 1970-01-01
    • 2020-09-18
    • 2021-12-08
    • 2020-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多