一般构造函数值 我刚刚进入C++,因为我正试图创建一个小RPG游戏,我陷入了一个点,我宁愿放弃OOP的想法,并且制作很多整数并为每个类写值。

一般构造函数值 我刚刚进入C++,因为我正试图创建一个小RPG游戏,我陷入了一个点,我宁愿放弃OOP的想法,并且制作很多整数并为每个类写值。,c++,C++,我尝试了一些我认为很好的想法,但只有错误是可以预料的 主要的一点是,我创建了一个带有int攻击、防御等的类的构造函数,但要调用它,我必须指定该类(例如wizard.getAttack()) 我有1个类和5个实例。当攻击敌人的时候,我没有一个解决方案来输入所选对象的一般攻击值(例如battle=attackPlayer-defense敌军;或类似的东西) 看起来是这样的: class Player { private: int attack; int defense; in

我尝试了一些我认为很好的想法,但只有错误是可以预料的

主要的一点是,我创建了一个带有int攻击、防御等的类的构造函数,但要调用它,我必须指定该类(例如
wizard.getAttack()

我有1个类和5个实例。当攻击敌人的时候,我没有一个解决方案来输入所选对象的一般攻击值(例如
battle=attackPlayer-defense敌军;
或类似的东西)

看起来是这样的:

class Player
{
private:
    int attack;
    int defense;
    int evasion;
    string name;
public:
    Player(int atk = 0, int def = 0, int ev = 0, string nameClass = "Wiz") {
        attack = atk;
        defense = def;
        evasion = ev;
        name = nameClass;
    }

    int getAttack() { return attack; }

    int getDefense() { return defense; }

    int getEvasion() { return evasion; }

    string getName() { return name; }
};

int choice;
//int battle;

int main()
{
    cout << "Hi what class do you choose?" << endl;
    cin >> choice;

    Player wizard(60, 40, 60, "wizard");
    Player warrior(50, 60, 40, "warrior");
    Player paladin(40, 70, 50, "paladin");
    Player druid(60, 40, 60, "druid");
    Player assassin(70, 30, 70, "assassin");

    switch (choice)
    {
    case 1:
        wizard.getAttack(), wizard.getDefense(), wizard.getEvasion(), wizard.getName();
        break;
    case 2:
        warrior.getAttack(), warrior.getDefense(), warrior.getEvasion(), warrior.getName();
        break;
    }

    // battle = attackPlayer - attackEnemy;

    Player treant (60, 40, 60, "treant");

    cout << "Hello " << choice << endl;
};
职业玩家
{
私人:
智力攻击;
智力防御;
回避;
字符串名;
公众:
播放器(int atk=0,int def=0,int ev=0,字符串名称class=“Wiz”){
攻击=atk;
防御=def;
逃避=电动汽车;
name=nameClass;
}
int getAttack(){return attack;}
int getDefense(){return defence;}
int getEvasion(){return evasion;}
字符串getName(){return name;}
};
智力选择;
//国际战役;
int main()
{
不能选择;
玩家向导(60,40,60,“向导”);
玩家战士(50、60、40,“战士”);
玩家圣骑士(40,70,50,“圣骑士”);
玩家德鲁伊(60,40,60,“德鲁伊”);
玩家刺客(70,30,70,“刺客”);
开关(选择)
{
案例1:
wizard.getAttack()、wizard.getDefense()、wizard.getEvision()、wizard.getName();
打破
案例2:
warrior.getAttack()、warrior.getDefense()、warrior.getEvision()、warrior.getName();
打破
}
//战斗=攻击玩家-攻击敌人;
玩家treant(60,40,60,“treant”);

cout您的设计存在各种各样的问题,以及让用户输入不透明数字的决定。但是-我将尝试解决我认为您提出的问题。看起来您想要的是:

Player player_templates[] = {
   {60, 40, 60, "wizard"},
   {50, 60, 40, "warrior"},
   {40, 70, 50, "paladin"},
   {60, 40, 60, "druid"},
   {70, 30, 70, "assassin"},
};
现在,如果您得到一个
选项
号码,您可以使用
player\u templates[choice]
获得所需的值,而无需重复多次。另一个选项可以使用:

std::vector<Player> player_templates = {
   {60, 40, 60, "wizard"},
   {50, 60, 40, "warrior"},
   {40, 70, 50, "paladin"},
   {60, 40, 60, "druid"},
   {70, 30, 70, "assassin"},
};
std::vector player_模板={
{60,40,60,“巫师”},
{50,60,40,“勇士”},
{40,70,50,“圣骑士”},
{60,40,60,“德鲁伊”},
{70,30,70,“刺客”},
};

在这种情况下,您可以使用
player\u templates.size()获得模板的数量
没有详细说明。使用
std::vector
而不是数组还有其他的优点和缺点。

在上面的措辞中有一个关键的要点,这对提高您的理解很重要。您没有选择调用哪个类。您只有一个类
播放器
您正在选择哪个
实例Player
。如果你真的为不同的“角色类”创建了不同的类,那么这将稍微有点挑战性……正如我在下面详细说明的那样,你将看到原因

类似的想法是使用一个指针,
Player*selected
;使用开关选择一个玩家并将其分配给
selected
,这样您就可以选择
selected=&wizard
,例如……现在无论您选择了什么,都可以执行
selected->getAttack()
或更强大的武器使敌人成为
玩家
对象,并通过引用或指针创建一种需要第二个
玩家
的战斗或攻击方法…即
选择->战斗(怪物)
。在内部,由于他们的战斗,所有不同的字段都会被修改。。 如果您需要专门化,您应该为不同类型的玩家创建子类,这称为多态性,并且您将创建虚拟方法,每个具体的
player
子类型都必须实现。这允许您将它们都视为“玩家”,而不管它是say
向导还是
af
,您可以为不同类型的角色创建类,每个类的内部执行所需的操作,这些操作可能会因类而异(否则您将不需要不同的类)。例如,打印动作消息摘要,其中说刺客“刺”,而向导“施法”,战士“砍”等。如果你想在“每回合”造成伤害的方式或防御如何应用于伤害方面有不同的行为,这一点也很重要……也许咒语不关心护甲或常规防御,但物理攻击会。或者咒语强度是攻击等级和剩余hp和mp等的函数.也许有一种可能性可以判断醉酒者是完全错过了还是昏倒了……就拿它作为一个滑稽的例子吧。有很多可能性

您还可以应用许多其他模式,例如factory模式,其中您有一个factory方法,并根据您传递的内容返回适当类型的“player”。这将允许您在运行时构建一个party,而不是在编译时硬编码party。我建议将您的party保留在conta中我也是

不讽刺的是,我在一个夏天的C++课程中或是通过志愿努力为内城学生提供的文本中,使用了一个基于文本的RPG游戏来进行多态性教学。它提供了很多机会来强调一些好的设计模式,其中对象取向确实有意义,“I- A”的例子。礼节是真的,而且很有意义


无论如何,我不会放弃OOP范例,这是正确学习OOP的绝佳工具!

您的问题中有几点需要强调:

  • 我有五节课

    您混淆了类和对象这两个术语。
    Player
    -是一个类。 <代码
    Player playes[] = {
       {60, 40, 60, "wizard"},
       ...
       {70, 30, 70, "warrior"},
    };