Closed. This question needs details or clarity. It is not currently accepting answers. Learn more
想改进这个问题吗?添加细节并通过editing this post澄清问题。
我正在用C++创建一个游戏。在这个游戏中,我创建了一个名为Player的类。Player类有一个名为magic的属性这个属性是一个整数,并且在整个游戏中不断上升,当用户做某事或完成任务时,他们可以获得magic。一旦达到某一点,用户就会得到一个新的法术,这些法术被保存在player类的数组中。
我想能够在整个游戏中检查这个属性,看看它是否达到了一定的水平。
我想每次magic属性上升时都检查一下,但是每次这样做都会添加很多条件。例如:

user.magic++
if(user.magic == 2) {
    //Give a new spell
}
else if(user.magic == 3) {
    //Give a new spell
}

每次更新magic属性时都要这样做这似乎需要花费很多时间和精力来不断地输入。我应该把上面的代码放到一个函数中,然后每次magic更新时运行它吗?
有更好的办法吗?

最佳答案

第一步:将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.
};

关于c++ - 我如何等待变量达到一定数量才能执行某项操作? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39681851/

10-11 19:11