我正在用C ++创建一个游戏。在这个游戏中,我创建了一个名为Player
的类。 Player
类有一个名为magic
的属性。此属性是一个整数,并且在整个游戏过程中不断上升,当用户执行某项操作或完成任务时,他们可以获得magic
。一旦达到某一点,用户就会获得一个新法术,法术将保存在玩家类的数组中。
我希望能够在整个游戏中检查此属性,看它是否已达到一定水平。
我在考虑每次magic
属性上升时都会检查,但每次这样做都会增加很多条件。如:
user.magic++
if(user.magic == 2) {
//Give a new spell
}
else if(user.magic == 3) {
//Give a new spell
}
每次更新magic
属性时都会执行此操作。这似乎需要花费大量的时间和精力来不断输入。我应该将上面的代码放在一个函数中,并在每次magic
更新时运行它吗?
有更好的方法吗?
答案 0 :(得分:5)
制作.magic
成员变量private
,以便增加魔法的唯一方法是调用user.IncrementMagic()
等方法,而不是直接说user.magic++
。然后,该方法的实现可能类似于:
Player::IncrementMagic()
{
magic++;
CheckUpdatedMagicLevel();
}
Player::CheckUpdatedMagicLevel()
{
if(magic == 2)
{
// etc
}
// etc
}
如果需要,您还可以编写以不同方式操纵magic
的其他方法 - 例如。 DecrementMagic
或SetNewMagicLevel(x)
。这些方法也会在内部调用CheckUpdatedMagicLevel()
。
答案 1 :(得分:2)
第一步:你将user.magic与可用的法术分开。理由:也许将来你也想为NPC-es分配法术,而不仅仅是用户。
struct spell {
int type;
int cost;
int damage;
}
static const spell walk_on_water={SURVIVAL, 10, 0};
static const spell resurect={DARK_MAGIC, 100, 0};
static const spell fireball_minor={OFFENSIVE, 30, 4};
static const spell fireball_big={OFFENSIVE, 300, 25};
void getSpellsForMagicLevel(int userMagic, std::vector<const spell&>& resultHere) {
resultHere.clear();
switch(useMagic) {
case 1:
resultHere.push_back(walk_on_water);
break;
case 2:
resultHere.push_back(walk_on_water);
resultHere.push_back(fireball_minor);
break;
//...
case 10:
resultHere.push_back(walk_on_water);
resultHere.push_back(resurect);
resultHere.push_back(fireball_minor);
resultHere.push_back(fireball_big);
break;
}
}
然后在你想知道player.magic
然后你注意到用户的拼写库存只会在magic
修改时更改(由于经验增加而上升或由于损坏的药水而下降) - 所以为什么要再次调用此功能然后再次?所以:
class Player {
protected:
int magic;
std::vector<const spell&> spell_inventory;
// ...
void set_magic_level(int newMagicLevel) {
if(this->magic != newMagicLevel) { // do nothing if no change
this->magic = newMagicLevel;
getSpellsForMagicLevel(this->magic, this->spell_inventory);
}
}
// ...
public:
// ...
int get_magic_level() const {
return this->magic;
}
};
class User : public Player {
//...
public:
void newExperience(const Event& somethingThatHappened)
{
switch(somethingThatHappened.type) {
case EXPERIENCE_THRESHOLD_REACHED:
this->set_magic_level(this->get_magic_level()+1);
break;
case DUMBING_POTION:
this->set_magic_level(
this->get_magic_level()-somethingThatHappened.get_damage()
);
break;
// etc...
}
}
};
class NonPlayerCharacter : public Player {
//...
public:
// NPC-es don't evolve, they are just spawned
// So no newExperience method for them.
};
答案 2 :(得分:1)
如何使用地图?所以你可以使用解锁某些法术所需的法术力数量(也就是int)作为钥匙,并为解锁法术存储字符串或其他工具并授予玩家这样的法术。我的意思是,从技术上来说,它比拥有大量硬编码的if循环更好,在这个实现中你可以只改变地图并使用相同的功能。
编辑了另一种设计方法,你从一开始就给玩家所有法术但是限制它“只能在匹配MAGIC要求时施放某些法术”,你仍然可以使用地图作为一个方便的工具
答案 3 :(得分:0)
可以“不断”增加值(使用计时器?每次发出某个命令?),但是1
添加新法术的步骤太小了。这意味着每次行动都会得到一个新的法术!
相反,请使用以下内容:将experience
值设置为0
。然后,在您的主循环(相同的计时器或您正在使用的任何计时器)中,增加此值。如果它达到某个合理的值,比如100
,请添加一个新的法术并将experience
值重置回0
。