【问题标题】:Dynamically loading class values in C++在 C++ 中动态加载类值
【发布时间】:2016-03-03 10:13:13
【问题描述】:

我对 C++ 还很陌生,并且正在尝试创建史诗般的 RPG。游戏有四个玩家,每个玩家都有一个包含所有信息(名称、等级、生命值等)的 Character 类实例。

class character
{
public:
    string name = "Nameless";       
    int hp = 10;
    int mp = 5;
}

在代码中的其他地方,我使用此类的实例创建了游戏角色:

character player1;
character player2;
character player3;
character player4;

在战斗中,我需要能够动态地改变玩家的价值观。我有两个具体问题:

  • 如何更改随机选择的角色的 HP? (string = "1"; player[string].hp = 0;)
  • 如何动态选择要加载的类值? (string = "hp"; player1.[string] = 10;)

也许我应该为此使用类以外的东西,欢迎提出建议:)

干杯!

【问题讨论】:

  • 使用对象集合而不是单个变量。 std::vector<character> 是一个合理的选择。
  • 看起来很合理 - 您介意提供针对我情况的简短用法示例吗?我已经用谷歌搜索了一下,还不能真正弄清楚
  • 我会推荐these之一而不是谷歌搜索。

标签: c++ class


【解决方案1】:

如何更改随机选择的角色的 HP? (string = "1"; player[string].hp = 0;)

要轻松选择随机播放器进行修改,最简单的方法是将所有播放器放在一个容器中,例如向量。然后您可以在向量中生成一个随机索引并修改该位置的播放器。

如何动态选择要加载的类值? (string = "hp"; player1.[string] = 10;)

要动态选择要修改的属性,有几种方法。下面显示了一个简单的解决方案,其中包含从字符串属性名称到属性值的映射。另一种方法是创建一个枚举类来枚举不同的属性,然后将其用作键而不是字符串。

#include <iostream>
#include <iterator>
#include <random>
#include <string>
#include <unordered_map>
#include <vector>

class character
{
    public:
        std::string name = "Nameless";
        std::unordered_map<std::string, int> properties{
            { "hp", 10 },
            { "mp", 5 }
        };
};

void print_players(const std::vector<character>& players) {
    for (const auto& player : players) {
        std::cout << player.name;
        for (const auto& property : player.properties) {
            std::cout << ", " << property.first << "=" << property.second;
        }
        std::cout << std::endl;
    }
}

int main() {
    auto players = std::vector<character>{
        character{"Player 1"},
        character{"Player 2"},
        character{"Player 3"},
        character{"Player 4"}
    };

    print_players(players);

    auto rng = std::default_random_engine{std::random_device{}()};

    // Select a random player
    auto random_player_distribution = std::uniform_int_distribution<>{0, players.size() - 1};
    auto& random_player = players[random_player_distribution(rng)];

    // Select a random property
    auto random_property_distribution = std::uniform_int_distribution<>{0, random_player.properties.size() - 1};
    auto random_property_iterator = random_player.properties.begin();
    std::advance(random_property_iterator, random_property_distribution(rng));

    // Modify random property
    random_property_iterator->second = 42;

    print_players(players);
}

【讨论】:

    【解决方案2】:

    如何更改随机选择的角色的 HP? (string = "1"; player[string].hp = 0;)

    使用数组代替变量:

    character players[4];
    

    如果需要,您还可以添加对玩家的引用:

    character &player1 = players[0];
    character &player2 = players[1];
    character &player3 = players[2];
    character &player4 = players[3];
    

    如何动态选择要加载的类值? (string = "hp"; player1.[string] = 10;)

    一开始你不能。

    如果需要,请尝试使用字典,或在类中重载 [] 运算符。

    无论如何,这似乎不是一个好主意。

    【讨论】:

    • C++ 没有任何名为“字典”的 STL 类,所以我猜你的意思是 std::unordered_map ;-)
    • @underscore_d,我没有将“字典”这个词标记为内联代码。我提到了任何类似字典的对象。是的,它可以是 mapunordered_map 或其他任何东西,包括自定义类。
    • 您能否提供一个 unordered_map 在这种情况下的使用示例?经过广泛的谷歌搜索后,我仍然无法弄清楚
    • @AlexanderWolff,我想你已经在另一个答案中找到了。
    猜你喜欢
    • 2013-05-05
    • 2010-09-30
    • 1970-01-01
    • 2019-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-11
    • 1970-01-01
    相关资源
    最近更新 更多