我如何等到变量达到某个数字才能做某事?

时间:2016-09-24 23:17:25

标签: c++ algorithm conditional

我正在用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更新时运行它吗?

有更好的方法吗?

4 个答案:

答案 0 :(得分:5)

制作.magic成员变量private,以便增加魔法的唯一方法是调用user.IncrementMagic()等方法,而不是直接说user.magic++。然后,该方法的实现可能类似于:

Player::IncrementMagic()
{
    magic++;
    CheckUpdatedMagicLevel();
}
Player::CheckUpdatedMagicLevel()
{
    if(magic == 2)
    {
        // etc
    }
    // etc
}

如果需要,您还可以编写以不同方式操纵magic的其他方法 - 例如。 DecrementMagicSetNewMagicLevel(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