第一步:將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