我有三个基本类 {Player,Weapon,Game} 和一个从Player继承的类战士。
我想使用功能 addPlayer 对功能 addWizard 进行编码。我想到了动态转换,但不确定如何开始。任何帮助将不胜感激。
注释:
* playersArray中的每个索引均包含指向类Player的指针。
*如果给定索引i中的玩家名称,playersArray [i]等于空字符串, 表示还没有玩家。
*我添加了每个Class 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();
}
答案 0 :(得分:1)
由于这两种方法之间存在共同的实现-您需要考虑将此实现与“ addPlayer”方法分开。
创建函数:
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” “)。
答案 1 :(得分:-2)
我不会写一堆代码,因为我必须很快去做。
但是我看到的是您的addPlayer
函数应该接受Player
引用或指针,或者更好的是std::unique_ptr
而不是构造Player
本身。
然后,将继承自Player
的任何内容传递到addPlayer
并将其添加到游戏世界中,将是一件简单的事情。