1

私は楽しみのためにテキストベースのゲームに取り組んでおり、基本クラスからの継承に苦労しています。Being作成したキャラクターのすべての統計を保持する基本クラスがあります。次に、すべての統計情報を取得して(または、存在から取得して戦闘に渡しますか?)、すべての戦闘作業を実行しCombatたいクラスがあります。Beingしかし、私は継承、または少なくともそれを機能さMainせるために関数を宣言する方法を完全には理解していません。で攻撃関数を保持している場合はBeing、次の行をmainに書き込むことができます。

human.attack(monster);

しかし、戦闘を別のクラスに分割した後、それが機能するようにメインでそれを書く方法がわかりません。どうぞよろしくお願いします!

class Being // Base Class
{
public:

    string name, nameSpecialAttack; // Implement a special attack feature,
                                    // that has a specific mutliplier #
                                    // unique to each being
    int attackBonus, attackMod; // was a float attackMod method for casting
                                // spells that double or halve a Being’s
                                // attack power.
    int baseDamage; // base damage
    int health, healthMax; // current health and max health
    int mp, mpMax; // current mp and max mp
    int arrows; // change to [ranged?] ammo

    Being(); // Default Constructor
    Being(string name, string nameSpecialAttack, int attackBonus,
          int attackMod, int baseDamage, int health, int healthMax,
          int mp, int mpMax, int arrows); // Constructor 2
    // All my set and get functions
}

次に、私の派生クラス:

class Combat : public Being
{
private:

public:

    void attack(Being& target);

};

Combat.cpp:

void Combat::attack(Being& target)
{
    //unsigned seed = time(0);
    //srand(seed); 
    // Rand # 0-99, * damage+1, /100, * attackMod, parse to int.
    int damage = (int)(attackMod*( ( (rand()%100)*(baseDamage+1) /100) + attackBonus + (rand()%2))); 
    target.health -=damage;

    cout << name << " attacks " << target.name << " doing " << damage << " damage!" << endl;
    cout << target.name << "'s health: " << target.health << endl;

    // Use getHealth() instead and put this function there
    if(target.health <= 0)
    {
        cout << endl << name << " killed " << target.name << "! You have won the game! " << endl << endl;
        cout << "Terminating AMnew World, Good Bye.\n" << endl << endl;
        exit(0);
    }
}

主要:

Being human("", "FirstofFurry", 2, 1, 2, 50, 50, 20, 30, 7); // A thing of
                                                             // class Being
Being monster("Armored Goblin", "Rawr", 2, 1, 2, 65, 59, 20, 20, 6);

int main()
{
    human.attack(monster); // No longer works since attack is in
                           // combat class now
    Sleep(3000);
    cout << endl << endl;
    monster.attack(human);
}
4

3 に答える 3

3

次のことが当てはまらない限り、ここで継承を正しく活用しているようには見えません。

あなたのゲームでは、攻撃できる存在とできない存在の間に違いがあります。そうは言っても、継承階層を変更すると便利な場合があります。

継承するものの「タイプ」を作成することを検討してください。

元:

class Being
{
public:
    virtual void attack(...) = 0;
};

class Human : public Being
{
public:
    virtual void attack(...); // Overrides attack in a manner that humans generally would
};

class Goblin : public Being
{
public:
    virtual void attack(...); // Goblin attack style. This is actually a decent way to handle different types of attacks, as in the special attack in your above definition
};
于 2012-10-25T20:10:04.297 に答える
3

これはあなたが相続したいと思うようなものではなく、戦闘は一種の存在ではありません。たとえば、リンゴは一種の果物であるため、果物の基本クラスとリンゴの派生クラスは論理的に正しいでしょう。敵からゾンビや忍者などのモンスターを派生させて、敵クラスとヒーロークラスを作成することをお勧めします。

#include <iostream>
#include <cmath>
#include <string>
using namespace std;

class Character
{
    public:
    Character(){}     //does nothing, just represents the heros class
};

class Enemy
{
    private:
        int Health;         //base class variables
        int WeaponID;
    public:
        Enemy(int hp, int wpID);
        virtual void Attack(Character& Target); //if all monsters have same attack, no need for virtual
        //etc...etc...
};

class Zombie:public Enemy               //DERIVED CLASS, uses base class attack method
{
    public:
        Zombie(int hp, int wpID):
            Enemy(hp,wpID)
        {}
};

class Ninja: public Enemy               //DERIVED CLASS, uses its own attack method
{
    private:
        int NumThrowingKnives;
    public:
        Ninja(int Hp , int ID) : Enemy(Hp,ID)
        {}
        void Attack(Character& Target); //different attack
        //etc..etc..

};

Enemy::Enemy(int hp, int wpID)
{
    Health = hp;
    WeaponID = wpID;
}

void Ninja::Attack(Character& Target)
{
    cout << "Ninja attack!" << endl;
}

void Enemy::Attack(Character& Target)
{
    cout << "Base class attack!" << endl;
}

int main()
{
    Character Bob;
    Ninja Bill(50,12);
    Zombie Rob(50,16);
    Bill.Attack(Bob);
    cout << endl;
    Rob.Attack(Bob);


}
于 2012-10-25T20:23:08.587 に答える
1

代わりhumanにタイプであると宣言しませんか?Combat

Combat human("", "FirstofFurry", 2, 1, 2, 50, 50, 20, 30, 7);

のすべてのパブリックメソッド/データに引き続きアクセスできますが、 -onlyメソッドBeingを使用することもできます。Combatattack

于 2012-10-25T20:01:34.420 に答える