3

この非常に単純な攻撃ゲーム (私にとって) の主な価値は、単純なポリモーフィズムに慣れ、ポインターを使用して練習することです。そうは言っても、私はそれを追加したいと思います。私のプログラムを見ると、別の「ヒーロー」クラスを作成して「キャラクター」クラスから継承する必要があるのか​​ 、それともヒーローが「キャラクター」クラスであると想定する必要があるのか​​ わかりません。敵が継承するもの。私が今やりたいことは、攻撃後にヒーローの体力が減少する何かを実装することだけです. 非常に初歩的で申し訳ありませんが、基本を理解しようとしています。

ありがとう。

#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;
    }
};
4

3 に答える 3

3

あなたの投稿で特定の質問を特定するのに苦労していますが、提案された質問がいくつかあります。つまり、ヒーロー キャラクターをどのように作成し、他のキャラクターと「戦わせるか」ということです。1つは、ヒーローキャラクターが必要です。これは実際、Character の別の子になる可能性があります。第二に、攻撃は実際にターゲットを指定する必要があります。

n.attack()

彼は何を攻撃しているのですか?攻撃はすべて印刷であるため、現時点では問題ありませんが、もっと多くのことを行う必要があります。特定の文字を攻撃したいので、引数として文字を取るようにする必要があります

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

例えば。

さて、大きな問題が2つあります。ポリモーフィズムのテストのためにこれを作成したようですが、実際には十分に活用していません。まず、attack を Character の抽象的な仮想関数に昇格させる必要があります。

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

};

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

  }
};

また、キャラクターへの攻撃を呼び出すときにポリモーフィズムを使用できるようになりました。

enemy1->attack(Hero);
enemy2->attack(Hero);
于 2013-07-29T21:36:28.647 に答える
1

攻撃関数をターゲット キャラクターへのポインターを取得するように変更すると、ターゲット キャラクターのヘルスを減らすことができます。ターゲットの保護された健康データに直接アクセスできます。

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;
  }
};
于 2013-07-29T21:41:19.123 に答える
0

ポリモーフィズムの最善の使い方は、私たちが実際に考えていることと一致するものだと思います。

Characterですから、ヒーローと敵の共通点をすべて備えたクラスを用意することをお勧めします。次に、2 つの別個のクラス (HeroクラスとEnemyクラス) が両方とも から継承され Characterます。ただし、それぞれがヒーローと敵に固有の独自の特定のメソッドを実装しています。

クラス内の例Character: 攻撃力と健康 (コードにあるように)

Heroand classの例Enemy: 敵またはヒーローのイメージ (またはヒーロー専用の固有武器) など

したがって、忍者とドラゴンで提供されたコードは、私にとって非常に理にかなっています。

于 2013-07-29T21:27:33.413 に答える