第一步:将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.
};
其他语言/环境尤其是图形用户界面使用“可观察”对象(例如Javascript + DOM中的addEventListener),其中添加了一个回调函数,当变量发生变化时被调用 –
我没有看到任何问题以您的方式执行想要做到这一点。这对我来说确实很好 – Merlin
@Lorenzo想想如果'user'已经获得魔术师会发生什么,并且该功能被多次调用。 – user4581301