代码之家  ›  专栏  ›  技术社区  ›  Sam12

继承类C++的铸造

  •  0
  • Sam12  · 技术社区  · 7 年前

    我有三个基类 {玩家,武器,游戏} 一个从玩家那里继承了阶级战士。

    我想对函数进行编码 添加向导 添加播放器

    笔记

    *playerArray中的每个索引都由指向类Player的指针组成。

    *如果给定索引i中玩家的名字,playerArray[i]等于空字符串, 表示还没有玩家。

    *我添加了每个类的构造函数Game和Player(只有默认值)和Wizard。

    void addWizard(string const& playerName,string const& weaponName,
                           Target target, int hitstrength,int range);
    
    GameStatus Game::addPlayer(const string playerName, const string weaponName,
                                   Target target,int hit_strength)
        {   int count=0,place=0;
            if(this->countPlayers()>=maxPlayer)
            {
                throw GameFull();
            }
            for(int i=0;i<maxPlayer;i++)
            {
                if(playersArray[i]->getPlayerName()!="" &&
                   playersArray[i]->isPlayer(playerName))
                {
                    throw NameAlreadyExists();
                }
                if(playersArray[i]->getPlayerName()==""&& count==0)
                {
                    count++;
                    place=i;
                }
            }
            Weapon newWeapon(weaponName,target,hit_strength);
            Player newPlayer(playerName,newWeapon);
            *playersArray[place]=newPlayer;
            return SUCCESS;
        }
    

    课程:

    class Game {
            int maxPlayers;
            Player **playersArray;
    }
    
    class Player {
            string player_name;
            int level;
            int strength;
            Weapon player_weapon; }
    
    //the inherited Class 
    
    class Wizard : public Player {
        int range;
    public:
        Wizard();
        Wizard (string const& name, Weapon const& weapon, int range);
    }
    

    Game::Game(int maxPlayer)
    : maxPlayer(maxPlayer),playersArray(new Player*[maxPlayer])
    {
        for(int i=0;i<maxPlayer;i++)
        {
            playersArray[i]=new Player;
        }
    }
    
    Player::Player():
            level(0),life(0),strength(0),place(0),player_name()
    {
    }
    
    Wizard::Wizard(string const& name, Weapon const& weapon, int range) :
            Player(name,weapon),range(range){
        if (weapon.getTarget() == LIFE){
            throw IllegalWeapon();
        }
        if(range<0)
            throw InvalidParam();
    }
    
    2 回复  |  直到 7 年前
        1
  •  1
  •   binyamina    7 年前

    创建函数:

    int FindEmptyPlace(const string& playerName) {
        // logic to find the empty place
        // BTW, you can brake the for loop after you find the place
    }
    

    更改AddPlayer方法以获取Player*:

    GameStatus Game::addPlayer(Player* player, int place);
    

    然后用不同的参数实现两个方法:

    GameStatus Game::addRegPlayer(const string playerName, const string weaponName,
                               Target target,int hit_strength);
    GameStatus Game::addWizard(string const& playerName,string const& weaponName,
                       Target target, int hitstrength,int range);
    

    在这两个方法中-找到空的地方并调用新的“addPlayer”方法来创建武器并将播放器插入到合适的位置(您可以考虑在每个函数中创建武器并将其作为参数发送给“addPlayer”)。

        2
  •  -2
  •   Zan Lynx    7 年前

    我不打算写一堆代码,因为我很快就要写了。

    addPlayer 函数应接受 Player 引用或指针,或者更好的是 std::unique_ptr 而不是构造一个 本身。

    玩家 进入之内 把它加入游戏世界。