【问题标题】:Need help implementing Health in basic C++ attack game需要帮助在基本 C++ 攻击游戏中实现 Health
【发布时间】:2013-07-29 21:14:19
【问题描述】:

这个极其简单的攻击游戏(对我来说)的主要价值是让自己熟悉简单的多态性,并练习使用指针。话虽如此,我很想补充一下。查看我的程序,我不确定是否应该创建一个单独的“Hero”类,并且只是从“Character”类继承,或者我是否应该假设 Hero 是“Character”类,敌人继承的。我现在唯一想做的就是实现英雄在攻击后的生命值降低的东西。很抱歉,如果它非常初级,我只是想了解基础知识。

谢谢。

#include <iostream>
#include "Character.h"

using namespace std;

int main() {

    Ninja n;
    Dragon d;

    Character *enemy1 = &n;
    Character *enemy2 = &d;

    enemy1->setAttackPower(20);
    enemy2->setAttackPower(40);

    n.attack();
    d.attack();

    return 0;
}


//Character.h
#include <iostream>

using namespace std;

class Character 
{
    protected:

    int Health = 100;
    int attackpower;

    public:

    void setAttackPower(int attack) {
        attackpower = attack;
    }
};

class Ninja: public Character
{
    public:

    void attack() {
        cout << "Ninja attacks your character! - " << attackpower << " Points!" << endl;
    }
};

class Dragon: public Character
{
    public:

    void attack() {
        cout << "Dragon attacks your character! - " << attackpower << " Points!" << endl;
    }
};

【问题讨论】:

  • 有什么问题? :)
  • 我注意到您的基类不包含虚拟“攻击”方法。如果所有类都需要实现它以使您的游戏正常运行,您应该真正添加它并可能将其设为纯虚拟。否则,多态性在哪里? :)
  • 这更适合code review
  • 抱歉造成混乱...现在,我只想创建一个英雄职业,并让该英雄职业在敌人发动攻击时受到伤害(即从生命值中减去攻击力) .感谢所有回答的人!

标签: c++ pointers inheritance polymorphism


【解决方案1】:

我在识别您帖子中的具体问题时遇到了一些问题,但有一些建议的问题。也就是说,你如何制作一个英雄角色并让他“对抗”这些其他角色。一方面,你需要一个英雄角色。这确实可以只是 Character 的另一个孩子。其次,攻击实际上需要指定一个目标。

n.attack()

一切都很好,但他在攻击什么?现在这不是问题,因为所有攻击都是打印,但您希望它做更多。你想让它攻击一个特定的角色,所以你应该让它以一个角色作为参数

void attack ( Character &char )
or
void attack ( Character *char )

例如。

现在,有两个大问题。看起来你是为多态性测试而做的,但你并没有真正充分利用它。首先,你应该将攻击提升为 Character 中的抽象虚函数:

class Character {
public:
  virtual void attack ( Character *char ) = 0;

};

class Ninja {
public:
  virtual void attack ( Character *char) 
  {

  }
};

此外,现在您可以在对角色进行攻击时使用多态性:

enemy1->attack(Hero);
enemy2->attack(Hero);

【讨论】:

  • 运行我的评论。很好的信息填写! :)
【解决方案2】:

改变你的攻击函数,将指针指向目标角色,然后你可以降低目标角色的生命值。您将能够直接访问目标的受保护健康数据。

void attack(Character* target)
{
  //specific printouts...
  target->Health -= attackpower;
}

另一种使用模式是将通用代码保留在基类中,然后从那里调用派生函数来执行特定于字符的操作,例如:

class Character
{
  //...
  void attack(Character* target)
  {
    target->Health -= attackpower;
    DerivedAttack();
  }

  virtual void DerivedAttack() = 0;

};

class Dragon:public Character
{
  //...
  void DerivedAttack()
  {
    cout << "Dragon attacks your character! - " << attackpower << " Points!" << endl;
  }
};

【讨论】:

    【解决方案3】:

    我认为多态性的最佳用途是与我们在现实生活中的想法相匹配。

    所以,我建议你使用Character 类,它具有英雄和敌人的所有共同特征。然后你有两个独立的类(Hero 类和Enemy 类)都继承自Character。然而,每个人都实现了自己独特的英雄和敌人的特定方法。

    Character 类中的示例:攻击力和运行状况(就像您的代码中一样)

    HeroEnemy 类中的事物示例:敌人或英雄的形象(或英雄的特殊独特武器)等。

    因此,您为忍者和龙提供的代码对我来说很有意义。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多